昨日■複数CSVファイルのまとめでQueryTables.Add繰り返しのコードを使いました。
その中で
With .QueryTables.Add(Connection:="TEXT;" & fd & fn, _
Destination:=.Cells(n, 2))
:
.Parent.Names(.Name).Delete
.Delete
End With
という記述をしています。
これは、取り込みたいのがcsvファイルのデータのみなので、
Add直後に、不要な[クエリの定義]と[名前の定義]を削除しているわけです。
QueryTablesの使い方次第では、この[名前の定義]にも気をつけたほうが良いでしょう。
WebQueryも同様です。例えば
...などとした場合、
データがなくてもQueryTablesとNamesが残っています。
同一範囲にQueryTableを実行するなら、毎回Add/Deleteを繰り返すより、
Connectionの定義を変更して、Refreshメソッドを使ったりする事で対応したほうが良いです。
どうしてもAdd/Deleteを繰り返す必要がある場合は、前述の例だと
...のようにRefreshメソッドの後に記述します。
手動でQueryTableのデータ範囲をクリアしようとすると

こういうメッセージが出て、[マクロ記録]でも
Sub Macro1()
Cells.Select
Selection.ClearContents
Selection.QueryTable.Delete
End Sub
...と記録されるので、QueryTable.Delete は意識されると思いますが、
[名前の定義]までは気付かない事が多いので、留意しておいたほうが良いかもしれません。
(10,000個以上の名前定義が溜まり、不具合が出てた例もありました)
(2009.08.22追記)
#Excel2003sp3ではQueryTableのDeleteと同時に名前定義も削除されるようになったようです。
その中で
With .QueryTables.Add(Connection:="TEXT;" & fd & fn, _
Destination:=.Cells(n, 2))
:
.Parent.Names(.Name).Delete
.Delete
End With
という記述をしています。
これは、取り込みたいのがcsvファイルのデータのみなので、
Add直後に、不要な[クエリの定義]と[名前の定義]を削除しているわけです。
QueryTablesの使い方次第では、この[名前の定義]にも気をつけたほうが良いでしょう。
WebQueryも同様です。例えば
Sub try1() Dim s As String Dim i As Long s = "http://blog.goo.ne.jp/end-u" With Sheets.Add For i = 1 To 5 With .QueryTables.Add(Connection:="URL;" & s, _ Destination:=.Range("A1")) .RefreshStyle = xlOverwriteCells .AdjustColumnWidth = False .WebFormatting = xlWebFormattingNone .Refresh BackgroundQuery:=False Debug.Print .Name '例えばここで何かの処理 End With .Cells.Delete Next End With End Sub
...などとした場合、
データがなくてもQueryTablesとNamesが残っています。
Sub chk() Dim x As Object With ActiveSheet MsgBox "Query:= " & .QueryTables.Count & vbLf & _ "Name:= " & .Names.Count For Each x In .QueryTables Debug.Print x.Name 'x.Delete Next For Each x In .Names Debug.Print x.Name 'x.Delete Next End With End Sub
同一範囲にQueryTableを実行するなら、毎回Add/Deleteを繰り返すより、
Connectionの定義を変更して、Refreshメソッドを使ったりする事で対応したほうが良いです。
どうしてもAdd/Deleteを繰り返す必要がある場合は、前述の例だと
Sub try2() Dim s As String Dim i As Long s = "http://blog.goo.ne.jp/end-u" With Sheets.Add For i = 1 To 5 With .QueryTables.Add(Connection:="URL;" & s, _ Destination:=.Range("A1")) .RefreshStyle = xlOverwriteCells .AdjustColumnWidth = False .WebFormatting = xlWebFormattingNone .Refresh BackgroundQuery:=False Debug.Print .Name .Parent.Names(.Name).Delete .Delete End With .Cells.Delete Next End With End Sub
...のようにRefreshメソッドの後に記述します。
手動でQueryTableのデータ範囲をクリアしようとすると

こういうメッセージが出て、[マクロ記録]でも
Sub Macro1()
Cells.Select
Selection.ClearContents
Selection.QueryTable.Delete
End Sub
...と記録されるので、QueryTable.Delete は意識されると思いますが、
[名前の定義]までは気付かない事が多いので、留意しておいたほうが良いかもしれません。
(10,000個以上の名前定義が溜まり、不具合が出てた例もありました)
(2009.08.22追記)
#Excel2003sp3ではQueryTableのDeleteと同時に名前定義も削除されるようになったようです。