Почему бы не использовать небольшую магию VB, о которой говорил Мерри в этом потоке vbforums , вместо использования Variant
для замены массива типа Variant
.
Одна из распространенных проблем при работе с массивами - это знать, когда массив был инициализирован, а когда нет. К счастью, есть простое решение с собственным кодом VB:
Not Not ArrayName
Для этого нужно взять 32-битное значение указателя в переменной массива, отразить биты, а затем отразить их снова. Теперь вы эффективно знаете указатель на безопасную структуру массива. В качестве побочного эффекта вы также знаете, можете ли вы получить доступ к массиву с помощью LBound и UBound.
Private Sub ArrayTest()
Dim testArr() as Variant
' Prints False
Debug.Print Not Not testArr
ReDim testArr(0)
' This prints True
Debug.Print Not Not testArr
End Sub
Мерри также говорил о проблемах, которые могут возникнуть, о которых я еще не сталкивался, и мы должны помнить, что этот пост посвящен Visual Basic, а не Visual Basic для приложений. (Имейте в виду, я перефразирую)
Очевидно, что в некоторых ситуациях при использовании этого метода возникает ошибка, которую можно обойти, выполнив простой Dim IDEbug() As Long: Debug.Assert Not IDEbug Or App.hInstance
один раз в VB IDE.
Цитирую еще раз:
Что происходит здесь, так это то, что сначала мы делаем вызов, чтобы выдвинуть условие возможной ошибки. Затем мы вызываем App.hInstance: мы можем сделать вызов почти любому VB-методу, но поскольку hInstance возвращает Long, мы используем его. Это по какой-то причине делает все следующие вызовы Not ArrayName безупречно. После того, как строка однажды была выполнена в IDE, вы можете даже прокомментировать строку, и ее эффекты все еще остаются. Только закрыв VB и открыв его снова, вы сбросите условие, так что вам нужно будет повторить вызов.
Хочу подчеркнуть, что я не придумал это решение, но оно мне очень помогло. Я также хочу отметить, что я никогда не выполнял Debug.Assert Not someArray Or Application.Hinstance
и еще не сталкивался с какими-либо проблемами. Это, очевидно, может быть связано с тем фактом, что VBA немного отличается от VB, но я точно не могу этого сказать.