У меня трудное время, пытаясь использовать глобальные переменные для модулей в 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
Публичные переменные должны быть доступны во всех модулях; Я ожидаю, что там будет больше; можете ли вы опубликовать свой фактический код вместо вашей итоговой версии? –
Если вы объявляете глобальную переменную, она должна быть доступна в любом модуле. http://stackoverflow.com/a/27578082/2867756 –
Спасибо, что ответили ребятам. Хорошо, это хорошая новость. Не могли бы вы взглянуть на мой полный код? Написал его под оригинальным образцом. – RWA4ARC