[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ループしっ放しで「完了」とならない』(しゅう)
このコード↓だと数分で「完了」となりますが、その下のコードだと一晩置いてもループしっ放しになります。原因が判りません。何が考えられるでしょうか?
教えてください。よろしくお願いいたします。
Sub ?@データ取得()
'
' データ取得 Macro
' マクロ記録日 : 2011/9/13 ユーザー名 : メカ部
'
Worksheets("M").EnableCalculation = False '再計算しない Worksheets("J").EnableCalculation = False Worksheets("Sheet1").Select Range("F1").Select Selection.QueryTable.Refresh BackgroundQuery:=False
Range("a2:e20000").Select Selection.ClearContents Range("a1").Select
iB = 1 Do While Cells(iB + 1, "F").Value <> "" Cells(iB + 1, "A").Value = Cells(iB + 1, "N").Value & Cells(iB + 1, "L").Value & Cells(iB + 1, "K").Value & Cells(iB + 1, "H").Value Cells(iB + 1, "B").Value = Cells(iB + 1, "N").Value & Cells(iB + 1, "L").Value & Cells(iB + 1, "H").Value Cells(iB + 1, "C").Value = Val(Cells(iB + 1, "J").Value) * Val(Cells(iB + 1, "O").Value) / 12 Cells(iB + 1, "D").Value = Val(Cells(iB + 1, "I").Value) * Val(Cells(iB + 1, "O").Value) / 12
iB = iB + 1 If iB = 40000 Then Exit Do Loop
Worksheets("M").EnableCalculation = True '再計算する Worksheets("J").EnableCalculation = True
MsgBox "データ更新しました"
End Sub
________________________________
Sub ?@データ取得()
'
' データ取得 Macro
' マクロ記録日 : 2011/9/13 ユーザー名 : M部
'
Worksheets("M").EnableCalculation = False '再計算しない Worksheets("J").EnableCalculation = False Worksheets("Sheet1").Select Range("F1").Select Selection.QueryTable.Refresh BackgroundQuery:=False
Range("a2:e20000").Select Selection.ClearContents Range("a1").Select
N修正
iB = 1 Do While Cells(iB + 1, "F").Value <> ""
Cells(iB + 1, "A").Value = Cells(iB + 1, "N").Value & Cells(iB + 1, "L").Value & Cells(iB + 1, "K").Value & Cells(iB + 1, "H").Value Cells(iB + 1, "B").Value = Cells(iB + 1, "N").Value & Cells(iB + 1, "L").Value & Cells(iB + 1, "H").Value Cells(iB + 1, "C").Value = Val(Cells(iB + 1, "J").Value) * Val(Cells(iB + 1, "O").Value) / 12 Cells(iB + 1, "D").Value = Val(Cells(iB + 1, "I").Value) * Val(Cells(iB + 1, "O").Value) / 12
iB = iB + 1 If iB >= 10000 Then Exit Do Loop
Worksheets("M").EnableCalculation = True '再計算する Worksheets("J").EnableCalculation = True
MsgBox "データ更新しました"
End Sub
Sub N修正()
iB = 1 Do While Cells(iB + 1, "F").Value <> "" If Cells(iB + 1, "N").Value = "KK7" And Cells(iB + 1, "K").Value = "9035" Then Cells(iB + 1, "K").Value = "9047"
iB = iB + 1 If iB = 10000 Then Exit Do Loop
End Sub
< 使用 Excel:Excel2010、使用 OS:Windows7 >
ループが抜けられないわけではないのでデータが重すぎるか画面更新で容量が増えてるかかと思います
Application.ScreenUpdating = False
条件
Application.ScreenUpdating = True
これを追加でどうでしょう
(とらねこ) 2015/02/27(金) 10:55
シートのチェンジイベントとかもあるかも? テストしてないけど、書き換えるとこんな感じ? Sub データ取得() Dim iB As Long Application.Calculation = xlCalculationManual Application.EnableEvents = False Application.ScreenUpdating = False With Worksheets("Sheet1") 'Selection.QueryTable.Refresh BackgroundQuery:=False .Range("a2:e20000").ClearContents iB = 2 Do While .Cells(iB, "F").Value <> "" .Cells(iB, "A").Value = ConTxt(.Name, iB, "N", "L", "K", "H") .Cells(iB, "B").Value = ConTxt(.Name, iB, "N", "L", "H") .Cells(iB, "C").Value = ConVal(.Name, iB, "J", "D") / 12 .Cells(iB, "D").Value = ConVal(.Name, iB, "I", "O") / 12 iB = iB + 1 If iB = 40000 Then Exit Do Loop End With Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.ScreenUpdating = True MsgBox "データ更新しました" End Sub Private Function ConTxt(ByVal shn As String, i As Long, ParamArray C()) As String Dim x With Sheets(shn) For Each x In C ConTxt = ConTxt & .Cells(i, x).Value Next x End With End Function Private Function ConVal(ByVal shn As String, i As Long, ParamArray C()) As Double Dim x ConVal = 1 With Sheets(shn) For Each x In C ConVal = ConVal * .Cells(i, x).Value Next x End With End Function (稲葉) 2015/02/27(金) 11:03
まず、どらねこさんの追加で試したのですが「コンパイルエラー」が出ました。
End Subの次の行に書き足すだけではダメなのでしょうか?
無知すぎてすみません。
(しゅう) 2015/02/27(金) 13:16
コンパイルエラーは私のほうですね。 やっぱりテストだけでもしておくべきだった・・・ 差し替えましたので、確認してください。 (稲葉) 2015/02/27(金) 13:51
下から失礼しますが、 >「コンパイルエラー」が出ました。 は別件では?
> End Subの次の行に書き足すだけではダメなのでしょうか? End Sub の次に書き足してはダメです。
基本的にコードは Sub ・・・ ・・・ End Sub の中に書いてください。 外に書いていいのはオプションと変数と参照の宣言くらいです。
位置は稲葉さんのコメントのコードを参照ください。
(Mook) 2015/02/27(金) 13:54
'動かしたいマクロ内容 Application.ScreenUpdating = True End Sub
このように書いてください
"エクセル マクロ 画面更新"
などで検索すると参考になるページがたくさん出てきますよ
(とらねこ) 2015/02/27(金) 14:08
記念参加で。
Sub データ取得() Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
Worksheets("Sheet1").Activate Range("A2:E10000").ClearContents
If Range("F2").Value = "" Then Exit Sub Dim データ最終行 As Long データ最終行 = Application.Min(10000, Range("F1").End(xlDown).Row) '// 空白で終了なので xlDown で
Dim 結果データ 結果データ = Range("A1").Resize(データ最終行, 4) '// A列(1)〜D列(4)
Dim 修正データ 修正データ = Range("K1").Resize(データ最終行, 1) '// K列(1)
Dim 作業データ 作業データ = Range("H1").Resize(データ最終行, 8) '// H列(1)〜O列(8) : H(1) I(2) J(3) K(4) L(5) M(6) N(7) O(8)
Dim r As Long For r = 2 To データ最終行 If 作業データ(r, 7) = "KK7" And 作業データ(r, 4) = "9035" Then '// 修正処理 作業データ(r, 4) = "9047" 修正データ(r, 1) = "9047" End If
結果データ(r, 1) = 作業データ(r, 7) & 作業データ(r, 5) & 作業データ(r, 4) & 作業データ(r, 1) 結果データ(r, 2) = 作業データ(r, 7) & 作業データ(r, 5) & 作業データ(r, 1) 結果データ(r, 3) = Val(作業データ(r, 3)) * Val(作業データ(r, 8)) / 12 結果データ(r, 4) = Val(作業データ(r, 1)) * Val(作業データ(r, 8)) / 12 Next
Range("A1").Resize(データ最終行, 4) = 結果データ Range("K1").Resize(データ最終行, 1) = 修正データ
Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True
MsgBox "データ更新しました" End Sub
(Mook) 2015/02/27(金) 15:57
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.