2016-07-01 3 views
0

VBAでモジュール間でグローバル変数を使用しようとするのが難しいです。VBAでは、1つのモジュールのグローバル変数を編集し、それを別のモジュールで参照する方法は?

私はExcelのシートから値を格納するために使用している2次元配列を持っています。私は最後に格納された値を取り出すための取り消しボタンを作成したいと思います。私が見ているのは、グローバル変数を使用して、1つのモジュールで編集し、別のモジュールで参照しています。

問題は、私は、プログラムによって、あるモジュールから別のモジュールへの変更を引き継ぐことができないと思います。これを容易にするために私ができることはありますか?以下は私が達成したい内容の要約です:


Public empsTot As Variant 

Sub update() 
    ReDim Preserve empsTot(5, numOfEmp, numOfFields) 
    'emps(,,) would be range extracted from excel 
    For i = 0 To numOfFields 
     For j = 0 To numOfEmp 
      empsTot(0, j, i) = emps(j, i) 
     Next 
    Next 
    'repeat the above process for each new entry, changing empsTot(++,j,i) 
End sub 

Sub retrieveValues() 
    For i = 0 To 6 
     For j = 0 To 3 
      'add values to sheet using something like 
      Range = empsTot([last value],j,i) 
     Next 
    Next 
End Sub 

Public week As Integer 
Public empsTot As Variant 

Sub update() 
week = week + 1 
If week > 5 Then 
    week = 5 
End If 

Worksheets("Data").Activate 
Dim numOfEmp 
Let numOfEmp = ThisWorkbook.Sheets("Accessory Sheet").Range("I2") 
numOfEmp = numOfEmp 
ReDim emps(numOfEmp, 6) 
Dim numOfFields 
Let numOfFields = 5 
ReDim Preserve empsTot(5, numOfEmp, numOfFields) 
For i = 0 To numOfEmp 
    Dim offset As Integer 
    offset = i + 3 
    emps(i, 0) = Range("E" & (offset)) 
    emps(i, 1) = Range("F" & (offset)) 
    emps(i, 2) = Range("I" & (offset)) 
    emps(i, 3) = Range("J" & (offset)) 
    emps(i, 4) = Range("K" & (offset)) 
    emps(i, 5) = Range("B" & (offset)) 
    Debug.Print ("^" & emps(i, 5)) 
Next 
Debug.Print ("Week is " & week) 
For i = 0 To numOfFields 
    For j = 0 To numOfEmp 
     empsTot(1, j, i) = emps(j, i) 
     Debug.Print (">" & empsTot(1, j, i)) 
     Debug.Print ("i" & CStr(i)) 
     Debug.Print ("j" & CStr(j)) 
    Next 
Next 
Worksheets("Accessory Sheet").Activate 
Dim ColNo 
Dim empIndA 
empIndA = 0 
Dim empIndB 
empIndB = 0 

For a = 2 To numOfFields + 1 
    For b = 2 To (numOfEmp + 2) 
     ColNo = a 
     CurCol = Split(Cells(, ColNo).Address, "$")(1) 
     ThisWorkbook.Sheets("Accessory Sheet").Range((CurCol) & CStr(b + 10)).Value = emps(empIndB, empIndA) - ThisWorkbook.Sheets("Accessory Sheet").Range((CurCol) & CStr(b)).Value 
     empIndB = empIndB + 1 
    Next 
    empIndB = 0 
    empIndA = empIndA + 1 
Next 
ColNo = 0 
For a = 0 To numOfFields 
    For i = 0 To numOfEmp 
     ColNo = a + 2 
     CurCol = Split(Cells(, ColNo).Address, "$")(1) 
     CurCol = CStr(CurCol) 
     ThisWorkbook.Sheets("Accessory Sheet").Range((CurCol) & CStr(i + 2)).Value = emps(i, a) 
    Next 
Next 
End Sub 
Sub retrieveValues() 
For i = 0 To 2 
    For j = 0 To 2 
     Debug.Print (empsTot(1, 1, 1)) 
    Next 
Next 
End Sub 
+0

パブリック変数は、すべてのモジュールでアクセス可能である必要があります。私はもっ​​と進んでいると思う。要約版ではなく実際のコードを投稿できますか? –

+0

グローバル変数を宣言する場合は、どのモジュールでもアクセス可能でなければなりません。 http://stackoverflow.com/a/27578082/2867756 –

+0

返信いただきありがとうございます。そうです、それは良いニュースです。私のフルコードを見ていただけますか?それを元のサンプルの下に掲示しました。 – RWA4ARC

答えて

0

私は問題がPreserveによって引き起こされたと考えています。それを削除してモジュールをリセットすると問題が解決されたように見えますが、なぜそれが問題を引き起こしているのか分かりません。私は何もサイズを変更したことはありませんが、私はそれを参照しようとしました。

+0

'しかし、私はなぜそれが問題を引き起こしているのか分からない'ティムWIlliamsは、上記のコメントでそれを解決しました... –

+0

ありがとう、それはそれを説明します。 – RWA4ARC

関連する問題