访问VBA保留字“名称”

时间:2017-10-04 15:09:49

标签: vba ms-access reserved

我正在使用Access VBA使用API​​访问电影信息。它工作正常,但我的属性有一个问题,其名称为“name”,这是一个保留字。

假设我想访问制作公司。我正在使用此代码,如果我想获取id,它工作正常,但如果我想获取名称则不起作用,因为单词“name”是第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”,它也不起作用:)有没有办法禁用在代码编辑器中将第一个字母更改为大写?这肯定会解决问题

2 个答案:

答案 0 :(得分:1)

从我所看到的情况来看,这与保留词有关。

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

保留字的“冲突”仅适用于SQL或使用您定义的VBA变量(并且名称实际上不是保留字)。

您正在使用“someobject.Name”,因此这与保留字有关,因为名为“name”的对象的属性或方法NEVER是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”从未成为集合对象的一部分或有效语法的简单事实。

如果你确实需要集合中的每个元素都有值,那么你的函数可以返回一个“结构”集合,但该结构必须是一个类对象。所以这段代码在Action中显示了这个:

所以类模块可以是:

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

答案 1 :(得分:0)

我修好了:),这很奇怪,但我修好了。 你需要做的是声明一个变量&#34; name&#34;用小写&#34; n&#34;之后,我将其删除,现在代码编辑器不会将单词&#34; name&#34;了。如果我声明一个带有第一个字母大写的变量,它将保存它,即使我下次你使用它时删除声明它会自动大写它,你不能删除,直到你再次声明它所有更低的:)

谢谢大家