VBA Excel 2010 Editor использует имя заглавной буквы, и к нему нельзя получить доступ - PullRequest
1 голос
/ 12 января 2012

В ответ на запрос POST сервер возвращает очень простой объект JSON, который может указывать на успех или неудачу загрузки.

Объектом JSON может быть либо {config_version: N}, чтобы указать успех, либо {исключение: Причина} для обозначения ошибки.

Я обрабатываю ответ следующим образом:

json = objHTTP.responseText
Set sc = CreateObject("ScriptControl")
sc.Language = "JScript"
Set o = sc.Eval("(" + json + ")")

On Error GoTo Exception:
' try to use config_version property
Util.SetConfigData "version", o.config_version
Exit Function

Exception:
If o.Exception = "config_not_valid" Then
   ' one kind of exception - do accordingly
Else
   ' another kind of exception
End If

Проблема, с которой я сталкиваюсь, состоит в том, что редактор VBA Excel 2010 использует o.exception с большой буквыo.Exception!В окне Watch я вижу свойство exception, но не могу получить к нему доступ.Как я могу заставить редактор прекратить вводить заглавные буквы имени свойства?Есть ли другой синтаксис для доступа к свойствам в VBA?

РЕДАКТИРОВАТЬ : Чтобы лучше проиллюстрировать, что здесь происходит, два снимка экрана.

enter image description here

Как видите, oимеет свойство под названием exception.При попытке получить к нему доступ с помощью o.Exception, он вызывает ошибку 438.

enter image description here

Так как у меня есть контроль над бэкэндом, я изменил ответ на return {Exception:whatever} (не могу сделатьэто постоянно).Теперь у VBA нет проблем с выбором свойства.

Как это возможно, если компилятор VBA нечувствителен к регистру, как это предложил Жан-Франсуа Корбетт?

Ответы [ 3 ]

6 голосов
/ 12 января 2012

Это странно. Я могу заставить строчную букву «е» придерживаться в Tester (), но если я изменю объявление «исключение» в Test2 () на «Исключение», то VBE автоматически изменит любые изменения в Tester ( ) к «Исключению» . Изменение обратно на «исключение» имеет обратный эффект.

По сути, вам нужно убедиться, что вы не используете "Исключение" в любом месте в вашем проекте.

Sub Tester()

    Dim sc, o

    Set sc = CreateObject("ScriptControl")
    sc.Language = "JScript"
    Set o = sc.Eval("({exception:'blahblah'})")

    Debug.Print o.exception 'prints blahblah

End Sub


Sub Test2()
    Dim exception As String
    exception = "blah"
End Sub

EDIT:

Если вы все еще застряли, вы можете попробовать это следующим образом, оставив проанализированный объект JSON в экземпляре элемента управления сценария:

Set sc = CreateObject("ScriptControl")
sc.Language = "JScript"

sc.Eval "var o = eval({exception:'blahblah',message:'oops'})"

Debug.Print sc.Eval("o.exception")     'prints blahblah
Debug.Print sc.Eval("o['exception']")  'same thing...

Debug.Print sc.Eval("o.message")       'prints oops
1 голос
/ 12 января 2012

Компилятор VBA нечувствителен к регистру, поэтому абсолютно никакой разницы между o.exception и o.Exception в том, что касается VBA.Заглавная буква не является причиной, по которой вы не можете получить доступ к свойству exception.( РЕДАКТИРОВАТЬ: Это последнее предложение не соответствует действительности! См. Ответ @Tim Williams. Я исправлен. )

Однако вам придется уточнить, что вы подразумеваете под словом «не могу получить доступ».Что такое config_not_valid?(Я догадываюсь, что это перечисление из внешней библиотеки, на которое не были должным образом ссылки посредством раннего связывания.)

Объявление всех ваших переменных с использованием Dim с правильным, конкретным типом может помочь (и вам следуетвсегда делай так или иначе).Установка ссылок (Инструменты> Ссылки) для раннего связывания также может помочь.Трудно дать лучший совет, если вы не дадите нам более подробную информацию о вашей проблеме.

При этом, если, только для косметических целей , вы хотите предотвратить использование заглавных букв в редакторе VBA, а затем посмотрите на ответы @Tim Williams и @ shahkalpesh.Схема капитализации редактора VBA иногда может показаться странной.Объявление всех ваших переменных с помощью Dim устранит некоторые из этих причуд - но на самом деле это наименьшая причина, по которой вам следует Dim все , всегда .

1 голос
/ 12 января 2012

Изменить метку Exception: на except:

except:
If o.exception = config_not_valid Then

Кроме того, измените строку кода, где он использовал бы goto Exception на goto except.

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