Доступ к VBA зарезервировано слово "имя"
Я использую Access VBA для доступа к информации о фильмах с помощью API. Это работает нормально, но у меня есть проблема с атрибутами, которые имеют в качестве имени слово "имя", которое является зарезервированным словом.
Допустим, я хочу получить доступ к производственным компаниям. Я использую этот код, и он работает нормально, если я хочу получить идентификатор, но он не работает, если я пытаюсь получить имена, потому что слово "имя" является зарезервированным словом в строке 4.
У кого-нибудь есть идеи как это исправить?
Рабочий код:
Set Keys1 = VBA.CallByName(jsonDecode1, "production_companies", VbGet)
movie_companies = ""
For Each Key In Keys1
movie_companies = movie_companies & **key.id** & ","
Next
Неработающий код:
Set Keys1 = VBA.CallByName(jsonDecode1, "production_companies", VbGet)
movie_companies = ""
For Each Key In Keys1
movie_companies = movie_companies & **Key.Name** & ","
Next
Файл JSON:
production_companies: [ { name: "France 2 Cinéma", id: 83 }, { name: "SBS Productions", id: 8997 }, { name: "Les Films Français", id: 16782 } ],
Спасибо за ваш ответ, но мне нужно дать вам более подробную информацию о том, что я делаю. да, я использую коллекцию, но я ее не создавал, я просто импортирую данные, делаю коллекцию с веб-сайта с помощью API, а также хочу сообщить, что все остальные свойства работают нормально, за исключением того, что "имя" может быть связано с тем, что Редактор автоматически использует первую букву слова "Имя", но другие слова не пишутся с заглавной буквы. Как я могу избежать того, чтобы редактор использовал заглавные буквы "имя", возможно, в этом проблема. Еще раз спасибо
Вот и весь код:
Set sc = CreateObject("ScriptControl"): sc.language = "JScript"
Set oXMLHTTP1 = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP1.Open "GET", URL, False 'Open socket to get the website
oXMLHTTP1.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
oXMLHTTP1.send 'send request
Do While oXMLHTTP1.ReadyState <> 4
DoEvents
Loop
oResp = oXMLHTTP1.responseText 'Returns the results as a byte array
Set jsonDecode1 = sc.Eval("(" + oResp + ")")
Set Keys1 = VBA.CallByName(jsonDecode1, "production_countries", VbGet)
For Each Key In Keys1
movie_companies = movie_companies & Key.id & ","
movie_companies = movie_companies & Key.Name & ","
Next
Теперь я уверен, что проблема в том, что первая буква заглавная, потому что у меня есть другое свойство с именем "ключ", и потому что редактор меняет его на "Ключ" с заглавной буквы K, он тоже не работает:) есть ли способ отключить изменение первой буквы в верхнем регистре в редакторе кода? это определенно решит проблему
2 ответа
Я исправил это:), это странно, но я исправил это. что вам нужно сделать, это объявить переменную "name" с нижним регистром "n", и после этого я удаляю ее, и теперь редактор кода больше не использует заглавные буквы "name". Если я объявляю переменную с заглавной буквой, она сохранит ее, и даже если я удалю объявление в следующий раз, когда вы будете использовать его, он автоматически станет заглавным, и вы не сможете удалить его, пока не объявите снова со всеми нижними:)
Спасибо вам всем
Из того, что я вижу, это связано с НУЛЕМ с зарезервированными словами.
Использование имени является допустимым свойством GAZILLION, встроенным в такие объекты, как формы, отчеты, имена столбцов, извлеченные из набора записей и т. Д.
"Конфликт" зарезервированных слов имеет место ТОЛЬКО в отношении SQL или использования определяемых вами переменных VBA (а имя на самом деле НЕ является зарезервированным словом в любом случае).
Вы используете "someobject.Name", и, таким образом, это связано с ZERO с зарезервированными словами, поскольку свойство или метод объекта с именем "name" НИКОГДА не был источником ошибок или проблем в Access VBA. Фактически встроенные методы могут использовать зарезервированные слова.
Не обращая внимания на то, что вы не указали тип данных этой функции? (не могу подчеркнуть, как вы хотите кодировать с явной опцией, а ТАКЖЕ не может подчеркнуть, как вы должны указать тип данных для этой функции).
Однако я сделаю БОЛЬШОЕ предположение и предположу, что это объект коллекции VBA.
Коллекции в VBA не имеют свойства name. Так что это работает:
Dim c As New Collection
c.Add "Apple", "testkey1"
c.Add "Grape", "testkey2"
Dim f As Variant
For Each f In c
Debug.Print f
Next
Однако f.name потерпит неудачу, так как ".name" НЕ является свойством или методом коллекции. Таким образом, эта проблема не имеет ничего общего с зарезервированными словами, но простой факт, что ".name" никогда не был частью или правильный синтаксис для объекта коллекции.
И если вам действительно нужно, чтобы каждый элемент коллекции имел значения, тогда ваша функция может возвращать коллекцию "структур", но эта структура должна быть объектом класса. Итак, этот код показывает это в действии:
Таким образом, модуль класса может быть:
Class module clsStruct:
Option Compare Database
Option Explicit
Public Name As String
Public KeyName As String
Public Value As String
Теперь в нашем коде:
Dim c As New Collection
Dim MyStruct As New clsStruct
MyStruct.KeyName = "hello"
MyStruct.Name = "myname"
MyStruct.Value = "my value"
c.Add MyStruct
Dim f As Variant
For Each f In c
Debug.Print f.Name, f.Value, f.KeyName
Next
Output:
myname my value hello
Таким образом, вы МОЖЕТЕ свободно использовать ".name" в качестве допустимого свойства создаваемого вами объекта, но объект коллекции по умолчанию не имеет такого свойства имени и, таким образом, потерпит неудачу во время выполнения.