Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5014 / 13644 ツリー ←次へ | 前へ→

【53033】エクセルのVBAでフリーズ状態になっちゃう! くたくた 07/12/12(水) 17:24 質問[未読]
【53047】Re:エクセルのVBAでフリーズ状態になっちゃ... n 07/12/12(水) 20:23 発言[未読]
【53068】Re:エクセルのVBAでフリーズ状態になっちゃ... くたくた 07/12/13(木) 17:49 お礼[未読]
【53069】Re:エクセルのVBAでフリーズ状態になっちゃ... n 07/12/13(木) 18:57 発言[未読]
【53080】Re:エクセルのVBAでフリーズ状態になっちゃ... くたくた 07/12/13(木) 23:10 お礼[未読]
【53087】Re:エクセルのVBAでフリーズ状態になっちゃ... n 07/12/14(金) 0:05 発言[未読]
【53089】Re:エクセルのVBAでフリーズ状態になっちゃ... くたくた 07/12/14(金) 1:10 お礼[未読]

【53033】エクセルのVBAでフリーズ状態になっちゃ...
質問  くたくた  - 07/12/12(水) 17:24 -

引用なし
パスワード
   1.株価データ(10銘柄の4本値の365日分:約5500KB)を外部DBより取得するため、エクセルの10ワークシートのブックをVBAで動かしているのですが、ファイルを開くとCPUの稼働率が100%になってしまいます。 → VBAを実行している最中は問題ないのですが、それ以外の操作では、フリーズしたように超スローになってしまいます。(他のVBAファイルでは問題ないのですが。) → メモリを768MBに増設したのですが解決せず、原因が分からず困っています。

2.1のファイルを時間を掛けてデータ取得しているのですが、10銘柄目位で、「.Refresh BackgroundQuery:=False」のところで止まってしまいます。 → IEの一時ファイルと履歴を削除して、10銘柄目のデータを再取得しているのですが、毎回のこの動作が大変ですので解決策を教えてください。 → インターネット一時ファイルの容量を増やしてみたのですがダメでした。

【53047】Re:エクセルのVBAでフリーズ状態になっち...
発言  n  - 07/12/12(水) 20:23 -

引用なし
パスワード
   こんにちは。
ファイルを開いただけで、CPUの稼働率がずっと100%になったままですか。
ちょっとたいへんですね。
>「.Refresh BackgroundQuery:=False」のところで止まってしまいます。
との記述から、Webクエリで取得されているようですね。

少し思い当たる点といえば、
MsgBox ThisWorkbook.Names.Count
この値はどうなりますか?

また、サンプルでもよいので、具体的なコードを提示されると良いかもしれません。
それに、IEオブジェクトを使う方法への変更も検討されてみてはどうでしょう。
://www.ken3.org/vba/backno/vba164.html

【53068】Re:エクセルのVBAでフリーズ状態になっち...
お礼  くたくた  - 07/12/13(木) 17:49 -

引用なし
パスワード
   *回答頂き、有難うございます。
 Webクエリでのデータ取得です。よろしくご指導願います。

1.下記を試してみました。 → 結果は、「15171」と表示されました。
 Sub test()
   Sheets("dMA10").Select   '← 当該ブックの10シート目の選択です。
   MsgBox ThisWorkbook.Names.Count  ' ← 「15171」と表示されましたが、
                    何を意味しているのか分かりません。
 End Sub

2.価格データを取得するマクロです。
 Sub Get_Data()
   With ActiveSheet.QueryTables.Add(Connection:= _
    url, Destination:=Cells(lastrow, 2))
    .Name = "Yahoo"
    .FieldNames = False
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = False
    .RefreshPeriod = 0
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingNone
    .WebTables = wtbl
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .Refresh BackgroundQuery:=False  '←この行で止まってしまいます。
  End With
 End Sub

3.VBAの初心者なので、下記については追って勉強してみます。
>それに、IEオブジェクトを使う方法への変更も検討されてみてはどうでしょう。
>://www.ken3.org/vba/backno/vba164.html

【53069】Re:エクセルのVBAでフリーズ状態になっち...
発言  n  - 07/12/13(木) 18:57 -

引用なし
パスワード
   >ThisWorkbook.Names.Count
というのは、[名前の定義]の個数です。
15171個は多いですね。

Webクエリでデータを取得した後、クエリの定義はどうされるのでしょう?
一度設定して、後は更新ですか?
それとも Cells(lastrow, 2) という指定から推測すると、
毎回、ご提示のコードでWebクエリを実行されているのですか?

『もし、そうであれば、』必要なものはデータのみなので、
データ取得直後にWebクエリ定義を削除するようにしてはどうでしょう。
また、クエリはクエリ定義と名前定義を行いますから、それも削除する必要があります。
具体的には

>    .Refresh BackgroundQuery:=False
    .Parent.Names(.Name).Delete
    .Delete
>  End With
>End Sub

この2行を追加します。

また、今まで溜まった[名前定義]を削除したほうが良いでしょう。
(他に、必要な[名前定義]がなければの話ですが)

Sub try()
  Dim n As Name
  
  With ActiveWorkbook
    For Each n In .Names
      n.Delete
    Next
    MsgBox .Names.Count
  End With
End Sub

※該当BookをActiveにして実行してください。
※念の為バックアップをとっておいてくださいね。

>IEオブジェクトを使う方法
は以前書いたサンプルがあったので載せておきますね。

Sub sample()
  Const READYSTATE_COMPLETE As Long = 4
  Const sCHK As String = "日付始値高値"
  Dim sURL(0 To 9) As String
  Dim x As Object
  Dim i As Long
  Dim j As Long
  Dim n As Long
 
  'httpは半角で。
  sURL(0) = "http://table.yahoo.co.jp/t?"
  sURL(1) = "c=2007"
  sURL(2) = "a=11"
  sURL(3) = "b=1"
  sURL(4) = "f=2007"
  sURL(5) = "d=11"
  sURL(6) = "e=30"
  sURL(7) = "g=d"
  sURL(8) = "s=6758"
  With CreateObject("InternetExplorer.Application")
    .Visible = True
    .navigate Join(sURL, "&")
    While .busy Or (.readyState <> READYSTATE_COMPLETE)
      DoEvents
    Wend
    For Each x In .document.getElementsByTagName("TABLE")
      If Left(x.innertext, 6) Like sCHK Then
        If x.Rows(0).Cells.Length = 7 Then Exit For
      End If
    Next x
    If Not x Is Nothing Then
      n = x.Rows.Length
      ReDim v(n - 1, 6)
      For i = 0 To n - 1
        For j = 0 To 6
          v(i, j) = x.Rows(i).Cells(j).innertext
        Next j
      Next i
      Set x = Nothing
      Sheets.Add
      Range("A1:G1").Resize(n).Value = v
    End If
    .Quit
  End With
  MsgBox "finish"
End Sub
("TABLE"名が取れたらもっと簡単になるのかもしれません。
 その辺りはよくわかりませんでした)

>CPUの稼働率が100%
あと、シート上にグラフを配置して、その上に[図のコピー]で作成したShapeを使ったりはしていませんか?

【53080】Re:エクセルのVBAでフリーズ状態になっち...
お礼  くたくた  - 07/12/13(木) 23:10 -

引用なし
パスワード
   ★ 半分、万歳・感謝 です ★

 1.今まで溜まった[名前定義]を削除したら、フリーズ状態がスッキリ解消しました。 → CPUとイライラも解消し、メモリ増設も活きてきました。

 2.当該ブックの10シート目で止まってしまう問題は、下記を実行しましたが、1.の問題には効果覿面でしたが、解決しませんでした。
   .Refresh BackgroundQuery:=False
   .Parent.Names(.Name).Delete
   .Delete
  End With
  → 素人考えですが、VBAの問題ではなく、IEの一時ファイル保存容量みたいなものを大きくしないとダメなような気がするのですが。(一時ファイルではダメでしたが)
  → この問題は、他のサイトで同様の悩みを抱えている方がいますので、解決できた際は、紹介したいと思うのですが。

 3.IEオブジェクトを使う方法については、参考にさせて頂いて、勉強したいと思います。

【53087】Re:エクセルのVBAでフリーズ状態になっち...
発言  n  - 07/12/14(金) 0:05 -

引用なし
パスワード
   >当該ブックの10シート目で止まってしまう問題
これは、10シート目だけ単独でやった場合は成功するのですね?
例えば2回に分けてやったとしても同じなのですよねぇ...
前半実行→Book保存して閉じる→開き直して後半実行...とか。(VBAで)

>IEの一時ファイル保存容量みたいなものを大きくしないとダメなような気がするのですが。
あまり詳しくないのですが、Net接続環境が高速であれば、逆に少ないほうが良かったりしませんか?
『かえって,キャッシュ内容が古くなっている場合などに,
 動作が不安定になるなどマイナス要因が生まれることすらある』
と、ここに書いてありました。
://www.itmedia.co.jp/help/tips/windows/w0325.html

【53089】Re:エクセルのVBAでフリーズ状態になっち...
お礼  くたくた  - 07/12/14(金) 1:10 -

引用なし
パスワード
   ★ 夜分、有難うございます ★

 1.当該ブックの10シート目で止まってしまう問題
>これは、10シート目だけ単独でやった場合は成功するのですね?
 ↑違うんです。事前にIEの一時ファイルと履歴を削除してから動かしているのですが、10シート目で止まってしまうんですよ‥ ← 他のサイトで、IEの一時ファイルと履歴を削除すれば、何故かは分かりませんが、動くことは動くと分かったのですが。
 ↑一旦止まってしまうと、IEの一時ファイルと履歴を削除してからでないと、10シート目単独でも再度止まってしまいます。
 ↑週足のデータ(日足のデータの1/3位の大きさ)の場合は、IEの一時ファイルと履歴を削除してから動かすと無事に完了します。 ← 読み込みデータ量の大小に関係しているように思うんですが。

>>IEの一時ファイル保存容量みたいなものを大きくしないとダメなような気がするのですが。
>あまり詳しくないのですが、Net接続環境が高速であれば、逆に少ないほうが良かったりしませんか?
 ↑私の接続環境は、FTTHの無線LANで、下り15MB程度、上り2MB程度です。
>『かえって,キャッシュ内容が古くなっている場合などに,
> 動作が不安定になるなどマイナス要因が生まれることすらある』
>と、ここに書いてありました。
>://www.itmedia.co.jp/help/tips/windows/w0325.html
 ↑参考にしてみます。

5014 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free