• 締切済み

スクロール停止を繰り返すマクロについて

2500行ぐらいあるExcel データを 21行置きに10秒ぐらい閲覧するマクロを作成したのですが、5回に3回ぐらい 988行ぐらいのところで、停止してしまいます。プログラムのどこがいけないのでしょうか? Option Explicit 'Sleepを使う Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) Sub scroll()  ’準備のため20秒ストップを入れる ActiveSheet.Range("A1").Select Sleep 20000  ‘最初の8行目で一旦停止 ActiveWindow.SmallScroll Down:=8 Sleep 10000  ’ここからスタート Dim i As Long For i = 1 To 121 ActiveWindow.SmallScroll Down:=21 Sleep 10000 Next i End Sub

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

下記を感じた次第。 タイマー設定など、難しいことをやらなくても、 当シートがSheet1として、開発ーVisualBasic-VBAProject その中のシートSheet1を選び、 その(Worksheetの)クリックイベントで Private Sub Worksheet_SelectionChange(ByVal Target As Range) ActiveWindow.SmallScroll Down:=21 End Sub を設定しておく。 これでこのシート上でクリックすると21行下のデータが表示される。 クリックする時間間隔は定めはなく、このほうがよい場合もあるようにも思う。 この1クリックも惜しいなら、話は別ですが。 また、クリックイベントを他の目的のために使っていない場合の話。

  • kzr260v2
  • ベストアンサー率48% (788/1619)
回答No.1

ループしているかイミディエイトウィンドウにiを出力すると良いです。以下のような記述例になります。 Debug.Print Format(i,"000") ループが継続してるならActiveWindowが変わってしまった可能性や、DoEventsをかまさないと上手く動作できないのかもしれないです。(DoEventsは実行速度が遅くなることがありますから、毎回ではなく数回に1回など調整が必要になるかも。) もしループが継続してないなら、実行中のメモリやCPU使用率など見て高負荷になってないか確認したりでしょうか。あとは念のためsleepのDeclareの記述の見直しかな。。。(問題なさげですが) ※ 手元にExcelの環境が無い為、動作確認などできないこと、ご理解いただけたら幸いです。 以上、参考にならなかったらごめんなさい。

Mhisao
質問者

お礼

DoEvents を追加したところ、最後まで動作するようになりました。 Dim i As Long For i = 1 To 121 ActiveWindow.SmallScroll Down:=21 Sleep 10000 DoEvents Next i ありがとうございました。この動作画面を録画していたので、パフォーマンスも気になっていましたが、使えています。

関連するQ&A

  • VBAにおける Option Explicitの役割

    VBAにおける Option Explicitの役割 VBAでゲームを作ることを勉強している初心者です。 本に従ってもっとも基本的なスロットゲームをためしました。 プログラム本体の前にある下記のOption Explicitを省くとコンパイルエラーになります。 VBAにおける Option Explicitはプログラム本体中にあるどのキーがどのスロットを止めるなどの指示を 具体的記述なしに有効にするなどの役目があるのでしょうか。 Option Explicit Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function GetTickCount Lib "kernel32" () As Long 'Windows起動後経過時間取得API どなたか教えていただけると助かります。 よろしくお願いいたします。

  • エクセルマクロで行を変えて100回デリート

    すみません。繰り返し165行下がってデリートしたいのですが・・・ どなたか詳しい方ご教授下さいませ。 ActiveWindow.SmallScroll Down:=174 Rows("183:198").Select Selection.Delete Shift:=xlUp ActiveWindow.SmallScroll Down:=171 Rows("348:363").Select ←165行下がりデリートを繰り返しデリートしたいです。 Selection.Delete Shift:=xlUp

  • マクロの実行とコマンドボタン

    office2000、WIN98SEです。 マクロの記録でマクロを作成しました。 これをコマンドボタンにコピペして実行するとエラーになります。マクロの実行から動かすとなんの問題もありません。なにがいけないんでしょう。教えてください。 ちなみにやりたいことは、複数のシートの同じセルを一気にクリアにしたいです。 記録したマクロは以下の通りです。宜しくお願いします。 Sheets(Array("用紙(1)", "用紙(2)", "用紙(3)", "用紙(4)")).Select Sheets("用紙(1)").Activate Range("B9").Select ActiveWindow.SmallScroll Down:=36 Range("B9:C58").Select Selection.ClearContents Range("F9").Select ActiveWindow.SmallScroll Down:=36 Range("F9:G58").Select Selection.ClearContents Range("I9").Select ActiveWindow.SmallScroll Down:=36 Range("I9:I58").Select Selection.ClearContents Sheets("用紙(1)").Select Range("B9").Select End Sub

  • スクロールバーをVBAで操作したい

    エクセルの場合は、 Sub Macro1() ActiveWindow.SmallScroll Down:=100 End Sub でスクロールバーの位置をVBAで設定できますが アクセスのフォームのスクロール倍の位置をVBAで設定することは可能でしょうか?

  • マクロの変更の仕方を教えて下さい。

    前任者の作ったエクセルの表を使っています。商品販売と計算の2種類のシートがあります。商品販売にはマクロに関係する集計とクリアの二つのボタンが作られてあります。教えて頂きたい何点かがあるのですが、最初にクリアのマクロの変更をお願いします。 商品販売のエクセルの行数を現在の300行から600行に増やしたいのです。エクセルの表は増やせるのですが、マクロは単に300の数字を600に訂正するだけでいいのか分かりません。是非教えて下さい。 Range("A6:B300,E6:E300,G6:G300,I6:I300").Select Range("I6").Activate Selection.ClearContents Sheets("計算シート").Select ActiveWindow.SmallScroll Doun:=-15 Range("T3:AI297").Select Selection.ClearContents ActiveWindow.SmallScroll Down:=-231 ActiveWindow.ScrollRow=55 ActiveWindow.ScrollRow=54 と55 54 53 52 49 46と数字が不規則に小さくなりながら続き、最後は3で終わり ActiveWindow.ScrollRow=3 Range("R2").Select Sheets("商品販売").Select Range("I1").Select ActiveWindow.ScrollRow=295 ActiveWindow.ScrollRow=294 と今度は295 294 292 291 288 285 279とまた数字が続き 最後は ActiveWindow.ScrollRow=6 Range("I2").Select End Sub ActiveWindow.ScrollRow= の数字の意味が全く分かりません。構わずに最初の300→600の訂正だけで大丈夫でしょうか?

  • excelのマクロで音声の停止と再生

    excelのマクロでいくつかのwavファイルを音声再生途中で一時停止と、その途中からの音声再生はどのようにすればよいのでしょうか? Declare Function PlaySound Lib "Winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const SND_ASYNC = &H1& '再生後すぐに制御を戻す Public Const SND_SYNC = &H0& '再生が完了するまで制御を戻さない Private Function MusicLength(ByVal FilePath As String) As Date Dim oSH As Object, oFS As Object, oFLD As Object, oF As Object Dim sT As Date Set oSH = CreateObject("Shell.Application") Set oFS = CreateObject("Scripting.FileSystemObject") Set oF = oFS.getfile(FilePath) Set oFLD = oSH.Namespace(oF.ParentFolder.Path) sT = CDate(oFLD.GetDetailsOf(oFLD.ParseName(oF.Name), 27)) MusicLength = sT + #12:00:01 AM# End Function Sub A列再生() Dim En As Long, i As Long Dim INF As String Dim ML As Date, sT As Date En = Range("A65536").End(xlUp).Row For i = 2 To En INF = ThisWorkbook.Path & "\ONSEI\" & Range("A" & i).Value & ".WAV" ML = MusicLength(INF) PlaySound INF, 0, SND_ASYNC ' sT = Now Do Until Now > sT + ML Sleep 100

  • Excel2007のマクロでマクロを実行したところ、エラーが出てしまい

    Excel2007のマクロでマクロを実行したところ、エラーが出てしまいました。どうすればよいでしょうか? 実行時エラー'1004'「RangeクラスのSelectメソッドが失敗しました」 Range("テーブル1[#All]").Selectでエラーになります。 マクロの記録を使っただけなので、どう直せばよいのかさっぱりわかりません。 どうかよろしくお願いします。 Range("A5").Select ActiveWindow.SmallScroll Down:=12 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 4 ActiveWindow.ScrollColumn = 5 ActiveWindow.SmallScroll Down:=-12 Columns("L:P").Select Selection.Delete Shift:=xlToLeft ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 1 Range("A5").Select ActiveWindow.SmallScroll Down:=30 Range("A5:L55").Select ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$5:$L$55"), , xlYes).Name = _ "テーブル1" Range("テーブル1[#All]").Select ActiveWindow.SmallScroll Down:=-36 Range("テーブル1[[#Headers],[列5]]").Select ActiveWorkbook.Worksheets("ID.01").ListObjects("テーブル1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("ID.01").ListObjects("テーブル1").Sort.SortFields.Add _ Key:=Range("テーブル1[[#All],[列5]]"), SortOn:=xlSortOnValues, Order:= _ xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("ID.01").ListObjects("テーブル1").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveSheet.ListObjects("テーブル1").Range.AutoFilter Field:=12, Criteria1:= _ Array("condition", "congruent", "control", "experiment", "="), Operator:= _ xlFilterValues ActiveWindow.SmallScroll Down:=-6 End Sub

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • エクセルマクロでIE操作

    IEをエクセルマクロで操作する際に現在は下記のようなコードで立ち上げでいます。 この時、1回目の処理が終わり、もう一度同じボタンを押してコードを実行する際 あたにIEが立ち上がってしまいます。 同じURLのIEがすでに立ち上がっている際には そのIEを利用して処理を行うにはどのようにしたらよいでしょうか? ption Explicit 'Sleepを使用する場合のお約束 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function CloseWindow Lib "User32" (ByVal hwnd&) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Dim objIE As Object '変数を定義 Dim Obj As Object '変数を定義 Sub 間接() 'IEテストする。 Dim txtSelect As HTMLSelectElement Dim objTAG As Object 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = New InternetExplorerMedium objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "https://www.google.co.jp/?gws_rd=ssl" Sleep (1000) Do While objIE.ReadyState <> 4 'サイトが開かれるまで待つ(お約束) Do While objIE.Busy = True 'サイトが開かれるまで待つ(お約束) Loop Loop

  • 同じ作業を複数のシートに実行させるにはどうしたらいいのでしょうか

    EXCELVBAであるシートに作業をさせるVBAを作成しました。 同じ作業を複数のシートに 実行させるにはどうしたらいいのでしょうか。 宜しくお願い致します。 **************作成したVBA********** Sheets("sheet1").Select ActiveWindow.SmallScroll Down:=66 Range("D2:D101").Select Selection.Cut   …50行ほどあります… *********************************** ↓ sheet1とsheet2に同じ作業をさせたい 以下のやりかただと長くなるためまとめたい    **************作成したVBA********** Sheets("sheet1").Select ActiveWindow.SmallScroll Down:=66 Range("D2:D101").Select Selection.Cut   …50行ほどあります… Sheets("sheet2").Select ActiveWindow.SmallScroll Down:=66 Range("D2:D101").Select Selection.Cut   …50行ほどあります… Sheets("sheet3").Select ActiveWindow.SmallScroll Down:=66 Range("D2:D101").Select Selection.Cut   …50行ほどあります… ***********************************

専門家に質問してみよう