UPDATE: Я знаю, что могу просто переименовать листы в редакторе VBA, но моим первым инстинктом было использование кода. Я посмотрел на него, увидел решение в нескольких местах, и теперь, когда он не работает, я все еще хочу знать, почему. Ответ может означать, что я узнаю что-то важное для последующего программирования в VBA.Excel 2010 VBA - глобальные переменные не установлены должным образом
Я думал, что я нашел ответ здесь: https://stackoverflow.com/a/1179730/1370938, но оказывается, что не работает для меня, я не знаю, почему. Я новичок в VBA, поэтому мне может что-то не хватает, но я нашел это решение на нескольких сайтах, и мне интересно, пропустил ли я простой шаг, который не был раскрыт.
Я хотел установить глобальные переменные рабочего листа, которые я мог бы вызвать для всех своих функций и формы обработки данных и сделать код более легким. (все эти Worksheets("name").
действительно откармливают код при переходе с листа на лист).
После ответа в ссылке, я уже писал об этом в одном из своих трех модулей:
'Global variables
Public shT As Worksheet
Public shA As Worksheet
Public shC As Worksheet
Public shM As Worksheet
Public shP As Worksheet
'Setting global variables
Sub Workbook_Open()
Set shT = ActiveWorkbook.Worksheets("Tasks")
Set shA = ActiveWorkbook.Worksheets("Activity")
Set shC = ActiveWorkbook.Worksheets("Closed")
Set shM = ActiveWorkbook.Worksheets("Modifications")
Set shP = ActiveWorkbook.Worksheets("Persistent")
End Sub
Но при выполнении этого кода в другом модуле, переменная устанавливается с «пустой» при попытке доступа диапазонов и т. д., и я получаю ошибку времени выполнения «424» Обязательный объект, который указывает на строку .Rows(3).EntireRow.Insert
.
Вот код
Sub addModLogEntry(sTask As String, sOwner As String, dDate As Date, sType As String)
Dim iRow As Integer
With shM
.Rows(3).EntireRow.Insert
.Range("A" & 3).value = sTask
.Range("B" & 3).value = sOwner
.Range("C" & 3).value = dDate
.Range("D" & 3).value = sType
If Day(dDate) Mod 2 = 0 Then
shM.Range("A" & 3 & ":D" & 3).Interior.Color = RGB(230, 230, 230)
End If
End With
End Sub
Когда в режиме отладки, если я смотрю значение shM
она возвращает Empty
. Я попытался поставить точку останова в первой строке Workbook_Open()
, но точка останова не сохраняется, когда я закрываю документ, чтобы проверить его открытие.
Я попробовал puttin этот код в коде для этой книги, и здесь работает точка останова, workbook_open() выполняется, но если я что-то выполнил после этого, переменные все равно не хороши.
вот что я пробовал в первую очередь. И Dim не работает с Public – EplusL
Если вы имели в виду объявление переменных в модуле и сохранение события в коде книги, то это сработало. Я не думал, что они должны быть в отдельном пространстве. Благодаря! – EplusL
Если я открываю документ и выполняю код, когда он работает нормально. Но когда я получаю сообщение об ошибке, войдите в режим отладки и остановите повторный запуск кода после внесения изменений, переменные больше не распознаются. Есть предположения? – EplusL