goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■QueryTables.Add/.Deleteと.Names().Delete

2008-02-06 21:00:00 | 気をつけたほうがいいこと
昨日■複数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も同様です。例えば

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と同時に名前定義も削除されるようになったようです。



Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■複数CSVファイルのまとめ | TOP | ■WebQueryの失敗 »
最新の画像もっと見る

Recent Entries | 気をつけたほうがいいこと