2017-10-04 2 views
1

私はAPIを使用してムービー情報にアクセスするためにアクセスVBAを使用しています。それは正常に動作していますが、私は予約語である "名前"という単語の名前を持つ属性に問題があります。VBA予約語「名前」にアクセス

制作会社にアクセスしたいとします。私はこのコードを使用していますが、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を使用してウェブサイトからコレクションを行うデータをインポートしています、私はあなたが "名前"エディタは自動的に "Name"という単語の最初の文字を大文字にしますが、他の単語を大文字にしません。どうすればエディタが "name"という単語を大文字にするのを避けることができますか?再び

全体のコードだことありがとう:

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

大括弧で囲んで名前をラップしてみてください。キーのようなもの[名前]その他の情報[ここ](https://support.office.com/en-us/article/Access-2007-reserved-words-and-symbols-E33EB3A9-8BAA-4335-9F57-DA237C63EABE ) – jcarroll

+0

私は同じエラーが発生しましたが、実行エラー438オブジェクトはこのプロパティまたはメソッドをサポートしていません –

答えて

1

私には分かりませんが、これは予約語とは関係ありません。

名の使用は、このようなフォーム、レポートなどのオブジェクトに建てられた無数の有効なプロパティで、列名は、レコードセットから引き出さなど

予約語の「競合が」ONLY SQLに関してですまたはあなたが定義したVBA変数を使用します(そして名前は実際には予約語ではありません)。

"someobject.Name"を使用しているため、 "name"という名前のオブジェクトのプロパティまたはメソッドがAccess VBAのエラーまたは問題の原因ではなかったため、これは予約語でゼロになります。実際に組み込まれたメソッドでは予約語を使用できます。

この関数のデータ型を省略したことを無視しますか? (明示的にオプションを指定してコード化する方法を強調することはできず、ALSOはその関数にデータ型を与える方法を強調することはできません)。

しかし私は大きな推測を行い、それが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 

ただし、 ".name"はコレクションのプロパティまたはメソッドではないため、f.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の」を使用するのが最も自由です作成するオブジェクトの有効なプロパティですが、デフォルトでコレクションオブジェクトにはそのような名前プロパティはなく、したがって実行時には失敗します。

0

私はそれを修正しました:)、それは変ですが、私はそれを修正しました。 あなたがしなければならないことは、変数 "name"を小文字の "n"で宣言した後、それを削除し、コードエディタは "name"という単語を大文字にしません。最初の文字の大文字で変数を宣言すると、それを保存します。次回の使用時に宣言を削除しても自動的に大文字になります。ありがとうございました

+0

これはobject.nameの使用を修正しますか?それは驚きです - フォローアップのおかげで。 –