2016-12-22 8 views
-4

これは32ビットと64ビットの問題ですが、新しいバージョンのExcelでは実行できないが、Excel 2003ではこのコードのデバッグに役立つ必要があります。このコードがコンパイルされない原因となっているバージョン間でVBAに構文更新がありましたか?Excel 2016のVBA構文のアップデート

デバッガは行で停止します。コンパイルしないように、このコードを引き起こしてこれらのバージョン間のVBAの構文更新が

With Selection.QueryTable 
+2

ようこそ!それは*コンパイル*されていないか、またはランタイム*で失敗していますか?あなたは "コンパイル"と言いますが、 "デバッガ"(実行時を意味します)にも言及します。正確なエラーメッセージは何ですか?コメントで返信するのではなく、このステートメントのコンテキストを含む詳細を追加するには、[あなたの質問を編集](https://stackoverflow.com/posts/41289607/edit)をクリックしてください。ありがとう! - また、質の高い回答を求める質問の詳細については、[ツアー](https://stackoverflow.com/tour)をご覧ください。 – cxw

+0

「デバッガが停止しました」は、エラーの説明として役立ちません。コード自体は問題ありませんが、 'Selection'の現在の値によっては実行時に失敗する可能性があります。 – GSerg

+0

'Selection.Listobject.Querytable'を試してください –

答えて

6

ありましたか?コードは罰金コンパイル

号、Selectionあなたが遅延バインディングを決意し、実行時になるだろうと、それを照会どんなメンバー、そこにただのObjectについてです。

あり 2003年から2007年の間にExcelのオブジェクトモデルに加えた:ListObjectが導入されましたが、QueryTableが削除されていなかった、それはまだRangeクラスのメンバーです。しかし、それは今もListObjectクラスのメンバです:

は、上記スクラッチ、@GSerg's commentを参照してください。

ListObjectは、Excel 2003に存在し、それがすでにクエリテーブルのプロパティがあります。 2003年には、クエリテーブルの周りにリストオブジェクトを作成できないため、そこでは機能しません。可能なだけでなく、クエリテーブルを作成するときのデフォルトであるExcel 2007から始まり、Excel 2016で始まるクエリオブジェクトテーブルを持たないクエリテーブルは、クエリが行を返さないとすぐに式を完全に破棄します。

Object Browser: search results for "QueryTable"

あなたのコードはひどいアイデアである、Selectionをオフに動作します - それはどのようなマクロレコーダーの記録だが、それはそれは全く何もする最善の方法だというわけではありません。あなたの「照会表」は、このようなものに見える場合

yep, that's a ListObject

そして、あなたはそれにいるときにリボンが「表ツール」タブを持っているが、...それはListObjectです。

With Selection.ListObject.QueryTable 

しかし、理由はあなたのことは、まだひどいアイデアだ:そして、あなたの Selectionがそのテーブル内にある場合は、コメントで示唆されたとして、その後 Selection.QueryTableは、あなたが Selection.ListObject経由でアクセスする必要があり、それをカットするつもりはありませんコードはひどく虚弱です。

代わりにオブジェクトを使用してください。 プロジェクトエクスプローラ toolwindow(Ctrl + R)を見て、ワークシートを探します。それを選択して、のプロパティ toolwindow(F4)を見てください。 名前を付けてください:デフォルトの(Name)プロパティを意味のあるものに置き換えてください。 MySuperImportantSheet

これで、その識別子を使ってVBAコードでそのシートを参照することができます。そのシートに「クエリテーブル」が1つしかないと仮定すると、このWithブロックははるかに堅牢になります。

If MySuperImportantSheet.ListObjects.Count <> 1 Then 
    'handle unexpected weirdness 
    Exit Sub 
End If 

Dim tbl As ListObject 
Set tbl = MySuperImportantSheet.ListObjects(1) 
With tbl.QueryTable 
    'whatever you wanted to do with it 
End With 
+0

それはいい答えです。実際にListObjectにQueryTableがあるかどうかを誰かがもう一度確認してテストしたい場合は、この4つの投稿をチェックアウトすることができます:[4つのListObject QueryTableテスト - 最後のものよりも良い](http:// yoursumbuddy。 com/four-listobject-querytable-tests-better-last)を使用します。 –

+1

'ListObject'はExcel 2003に存在し、すでに' QueryTable'プロパティを持っています。 2003年には、クエリテーブルの周りにリストオブジェクトを作成できないため、そこでは機能しません。可能なだけでなく、クエリテーブルを作成するときのデフォルトであるExcel 2007から始まり、Excel 2016から始まるクエリテーブル*を使用して、そのリストオブジェクトの周りにリストオブジェクトが永久に破棄されます行(私はMSが修正するために失敗した楽しい小さなバグ)。 – GSerg

関連する問題