1

我正在使用 Access VBA 通过 API 访问电影信息。它工作正常,但我对名称为“名称”的属性有疑问,“名称”是保留字。

假设我想访问制作公司。我正在使用这段代码,如果我想获取 id,它工作正常,但如果我试图获取名称,它就不起作用,因为“名称”这个词是第 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

现在我确定问题在于第一个字母是大写的,因为我有另一个名为“key”的属性,并且因为编辑器将其更改为带有大写 K 的“Key”,所以它也不起作用:)在代码编辑器中禁用将第一个字母更改为大写的方法?这肯定会解决问题

4

2 回答 2

2

我修好了:),这很奇怪,但我修好了。您需要做的是用小写“n”声明一个变量“name”,然后我将其删除,现在代码编辑器不再将“name”这个词大写。如果我用首字母大写声明一个变量,它将保存它,即使我在下次使用它时删除该声明,它也会自动将其大写,并且您无法删除,直到您再次用所有小写字母声明它:)

谢谢你们

于 2017-10-06T15:58:12.890 回答
1

据我所知,这与保留字零有关。

名称的使用是 GAZILLION 内置对象的有效属性,例如表单、报告、从记录集中提取的列名等。

保留字的“冲突”仅与 SQL 或使用您定义的 VBA 变量有关(而且 name 实际上无论如何都不是保留字)。

您正在使用“someobject.Name”,因此这与保留字的关系为零,因为名为“name”的对象的属性或方法绝不是 Access VBA 中错误或问题的来源。事实上内置方法可以使用保留字。

忽略您遗漏了此函数的数据类型?(不能强调您想如何使用选项显式进行编码,并且也不能强调您应该如何为该函数提供数据类型)。

但是我会做一个很大的猜测并假设它是一个 VBA 集合对象。

VBA 中的集合没有名称属性。所以这有效:

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”作为您创建的对象的有效属性,但默认情况下,集合对象没有这样的名称属性,因此在运行时会失败。

于 2017-10-05T00:16:48.420 回答