Почему иногда одно и то же объявление переменных дает ошибку компиляции? - PullRequest
0 голосов
/ 27 марта 2019

Когда в VBA есть ошибка компиляции несоответствующего типа переменной, иногда решение состоит в том, чтобы изменить способ объявления переменных, но не тип. например.: Если у меня есть:

Dim numCables, numCaColumn, firstCableRow, numCable, numDiColumn, posInArray, j, numMaterialWDifSEColumn, numSEMaterials  As Integer

И я заменяю его на:

Dim numCables, numCaColumn, firstCableRow, numCable, numDiColumn, posInArray, j, numMaterialWDifSEColumn  As Integer
Dim numSEMaterials As Integer

Теперь с этим изменением у меня нет ошибки компиляции, и все работает нормально.

Я хотел бы знать, почему это происходит.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

В объявлении переменной вы должны указать тип для каждой переменной, в противном случае это Variant.

Другими словами, в

Dim numCables, numCaColumn, firstCableRow, numCable, numDiColumn, posInArray, j, numMaterialWDifSEColumn, numSEMaterials  As Integer

только numSEMaterials - это Integer, а остальные Variant с.

Вам нужно

 Dim numCables as Integer, numCaColumn as Integer, firstCableRow as Integer...

Обратите внимание (спасибо за напоминание @ John Coleman ), что почти всегда лучше использовать тип переменной Long вместо Integer. Для подробного объяснения см. Зачем использовать целое число вместо Long .

1 голос
/ 27 марта 2019

Код VBA, такой как Dim a, b, c as integer, НЕ объявляет a, b и c как целочисленный тип! Он только объявляет c как целое число. Переменные a и b объявлены как варианты!

Чтобы объявить все переменные как целочисленные, необходимо указать каждую переменную в отдельности:

Dim a as integer
Dim b as integer
Dim c as integer

.

Д

Option Explicit

Sub Debug_VarType()

Dim a, b, c As Integer

Debug.Print "Definition of a, b and c:"
Debug.Print "a: "; VarType(a); MyVarType(VarType(a))
Debug.Print "b: "; VarType(b); MyVarType(VarType(b))
Debug.Print "c: "; VarType(c); MyVarType(VarType(c))
Debug.Print ""

Dim d As Integer
Dim e As Integer
Dim f As Integer

Debug.Print "Definition of d, e and f:"
Debug.Print "d: "; VarType(d); MyVarType(VarType(d))
Debug.Print "e: "; VarType(e); MyVarType(VarType(e))
Debug.Print "f: "; VarType(f); MyVarType(VarType(f))
Debug.Print ""

End Sub


Function MyVarType(Varint As Integer) As String
Select Case Varint
    Case 0: MyVarType = "vbEmpty"
    Case 1: MyVarType = "vbNull"
    Case 2: MyVarType = "vbInteger"
    Case 3: MyVarType = "vbLong"
    Case 4: MyVarType = "vbSingle"
    Case 5: MyVarType = "vbDouble"
    Case 6: MyVarType = "vbCurrency"
    Case 7: MyVarType = "vbDate"
    Case 8: MyVarType = "vbString"
    Case 9: MyVarType = "vbObject"
    Case 10: MyVarType = "vbError"
    Case 11: MyVarType = "vbBoolean"
    Case 12: MyVarType = "vbVariant"
    Case 13: MyVarType = "vbDataObject"
    Case 14: MyVarType = "vbDecimal"
    Case 17: MyVarType = "vbByte"
    Case 20: MyVarType = "vbLongLong"
    Case 36: MyVarType = "vbUserDefinedType"
    Case 8192: MyVarType = "vbArray"
End Select
End Function

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...