2013-11-29 2 views
1

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() выполняется, но если я что-то выполнил после этого, переменные все равно не хороши.

ответ

2

Dim переменные в стандартном модуле, а не в модуле ThisWorkbook над кодом события Open.

EDIT # 1:

В ThisWorkbook модуле:

Private 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 

и в стандартном модуле:

Public shT As Worksheet 
Public shA As Worksheet 
Public shC As Worksheet 
Public shM As Worksheet 
Public shP As Worksheet 

Sub durAL() 
    MsgBox shT.Range("A1").Value 
End Sub 

работает дурального продемонстрирует Глобалы доступны для общего пользования ,

+0

вот что я пробовал в первую очередь. И Dim не работает с Public – EplusL

+0

Если вы имели в виду объявление переменных в модуле и сохранение события в коде книги, то это сработало. Я не думал, что они должны быть в отдельном пространстве. Благодаря! – EplusL

+0

Если я открываю документ и выполняю код, когда он работает нормально. Но когда я получаю сообщение об ошибке, войдите в режим отладки и остановите повторный запуск кода после внесения изменений, переменные больше не распознаются. Есть предположения? – EplusL

Смежные вопросы