VBA Option Explicit не может обнаружить необъявленные переменные в функции - PullRequest
0 голосов
/ 16 мая 2018

Я всегда использовал Option Explicit в каждом модуле. Я никогда не думал об этом до сих пор.

Код:

Option Explicit

Function ParseJSON(ByVal strJSON As String) As String
    strJSON = "New String"
    'MsgBox (strJSON)
    ParseJSON = strJSON
End Function

Sub Test()
    Dim strJSON As String
    strJSON = "Old String"
    MsgBox (ParseJSON(strJSON))
    MsgBox (strJSON)
End Sub

Этот фрагмент кода является всего лишь тестом и не имеет ничего общего с JSON. Когда я запустил код, я ожидал, что он выдаст ошибку, поскольку strJSON никогда не объявляется в ParseJSON, и это должна быть новая переменная, поскольку исходная переменная передается ByVal и, следовательно, не может быть изменена, последний MsgBox () подтверждает это.

Есть что-нибудь, чего я не получил? Моя догадка указывает на ByVal часть. Или, может быть, Option Explicit только проверяет Sub?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы декларируете правильно.В функции Test вы объявляете ее как строку с оператором DIM.И, сделав его аргументом в функции, вы также объявляете его как строку для использования в функции.

Поскольку функция использует ее byVal, и изменения, вносимые вами в функцию, не влияют на значениестроки.

Если вы хотите изменить его значение, оно должно быть передано с помощью Ref.ByRef эффективно передал фактическую переменную.- Он может быть известен даже под другим именем, но любые изменения также изменят исходную переменную.

byVal эффективно передает копию переменной, с которой вы можете поиграть, но не можете изменить оригинал.

Представь, как лист бумаги.byRef вы передаете фактический лист бумаги, который будет размечен byVal вы передаете ксерокопию, но держите оригинал при себе.

0 голосов
/ 16 мая 2018

смысл Option Explicit состоит в том, чтобы вы явно объявили все переменные, которые вы используете, и именно это действительно происходит в Function ParseJSON(ByVal strJSON As String) As String: strJSON As String означает объявление переменной strJSON you 'мы собираемся использовать внутри функции (и она также объявляет ее как String типа)

, затем вы также даете ей значение, переданное вызывающим подпрограммой, и этоByVal просто означает, что любое значение, которое предполагается для переменной функции strJSON, не повлияет на вызывающую подпеременную (если таковая имеется, и это может быть случайно названо в честь strJSON, но оно отличается от функции strJSON) вы передали значение

, поэтому, если вы попробуете

Function ParseJSON(ByVal strJSON As String) As String
    strJSON = Range("A1:A3")
    'MsgBox (strJSON)
    ParseJSON = strJSON
End Function 

, вы получите время выполнения type mismatch error, как только будет обработана строка strJSON = Range("A1:A3")

и поэтому, если вы попробуете

Sub Test()
    Dim strJSON As String
    strJSON = "Old String"
    MsgBox (ParseJSON(Range("A1:A3")))
    MsgBox (strJSON)
End Sub

, вы получите то же время выполнения type mismatch error, как только будет обработана строка MsgBox (ParseJSON(Range("A1:A3")))

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