2016-07-01 2 views
0

У меня трудное время, пытаясь использовать глобальные переменные для модулей в VBA.В VBA, как мне редактировать глобальную переменную в одном модуле и ссылаться на нее в другом?

У меня есть двумерный массив, который я использую для хранения значений из листа в Excel. Я хочу создать кнопку отмены, где я получаю последние сохраненные значения, то, что я ищу, - это использование глобальной переменной, которая редактируется в одном модуле и ссылается на другую.

Проблема в том, что я не думаю, что программа позволяет мне переносить изменения с одного модуля на другой. Есть ли что-нибудь, что я могу сделать, чтобы облегчить это? Ниже приводится краткое изложение того, что я хотел бы выполнить:


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

', но я не уверен, почему это вызывало проблему. Тим Уилямс обратился к этому в комментариях выше ... –

+0

Спасибо, это объясняет. – RWA4ARC