2017-10-04 91 views
1

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

比方说,我要访问的生产企业。我使用这个代码,它工作正常,如果我想要得到的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 

现在,我相信这个问题是一个事实,即第一个字母是大写的,因为我有一个名为“钥匙”的另一个属性和因为有编辑的变化它与大写K键“关键”,它不工作太:)有没有办法禁用更改代码编辑器中的第一个字母大写?这肯定会解决这个问题

+0

1.什么是错误信息? 2.尝试密钥(“名称”) 3.结果? – peakpeak

+0

尝试在方括号中包装名称。类似于Key。[Name]更多信息[在此](https://support.office.com/zh-cn/article/Access-2007-reserved-words-and-symbols-E33EB3A9-8BAA-4335-9F57-DA237C63EABE ) – jcarroll

+0

我试了两个我得到了同样的错误,执行错误438对象不支持此属性或方法 –

回答

1

从我所看到的,这有ZERO做保留字。

使用户名是内置对象,如窗体,报表一个极大的有效属性,列名拉从一个记录集等

的保留字的“冲突”只是关于SQL或者使用你定义的VBA变量(而且名字实际上不是保留字)。

您正在使用“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”不是一个集合的属性或方法。所以这个问题与保留字无关,而是一个简单的事实:“。名称“从来不是集合对象的一部分或有效的语法。

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

所以类模块可以是:

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 

那么,你是最自由使用“名称”为您创建的对象的有效属性,但默认情况下,集合对象没有此类名称属性,因此将在运行时失败。

0

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

谢谢大家

+0

这修复了object.name的使用?这是一个惊喜 - 感谢后续。 –