• 締切済み

Excel2002マクロ セルのアクティブ状態移動

お世話になります このようなことができるのかどうか分からないのですが、もしできるのであればその方法を知りたいです。 実行する内容は、特定のセル範囲で、指定した時間毎にセルのアクティブ状態を移動するというものです。 対象となる特定のセル範囲は、最大で([A1]~[J9])+([A10]~[G10])の合計97個のセルです。 このセル範囲は、その日によって変わります。 より上の行を優先にして、更に、より左のセルを優先にして、36個であったり、47個であったり、49個であったり、ほかの数の場合もあります。 この対象となる特定のセルの個数は[E14]のセルに入っている値で指定しています。 その日対象となる範囲のセルには数値が入っているかまたは空欄のどちらかです。 入っている数値は1~97の範囲でランダムで、重複する数値はありません。 アクティブ状態の移動先は、移動前にアクティブになっているセルの右隣。 セルのアクティブ状態が対象範囲の一番右端まで行った場合、次はその下の行の左端のセルです。 更に、セルのアクティブ状態がその日の対象範囲の一番右下まで行った場合、次は[A1]です。 アクティブ状態が移動する時間間隔は[G15]のセルに入っている時間です。 マクロ開始後[G15]のセルに入っている時間経過後、セルのアクティブ状態が移動します。 更に[G15]のセルに入っている時間経過後、その次のセルがアクティブになっていきます。 例えば次の条件の場合  対象となる特定のセル範囲は([A1]~[J3])+([A4]~[B4])  マクロ開始前のアクティブセルは[G3]  [E14]のセルに入っている値は32  [G15]のセルに入っている時間は30秒 の場合 マクロ開始30秒後、アクティブセルは[H3]になります。 その後、30秒毎にアクティブ状態は移動していきます [I3][J3][A4][B4][A1][B1][C1]・・・ このマクロを終了させるのは、マウスで直接別のセルをアクティブにしたとき、または、矢印キーでアクティブセルを移動したときなどにしたいですが、可能な方法が限られているようでしたらその方法にします。 以上よろしくお願いします。

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.5

>t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15 を t = 5 あるいは、 期待する秒数(30秒?)にしてみてください。 それでも何やらホワイトアウトするようであれば、 マクロの問題ではなく 課題シートの再描写にCPUが食われている可能性を疑います。 シートに内容を全数Nullにして試してください。

dos_2000
質問者

補足

シート内容を全数Null というのは、目的のシートのセル全部を空白にするということでよろしいでしょうか? この場合、[t]だけではなく[e]も指定する必要があり、[e=60]で試行しました。 また、そのため[Cells(14, 5)]を含む[if文]を無効にしました。 全コードは次の通りです。 Option Explicit Public Declare Function GetAsyncKeyState Lib "User32.dll" ( _                 ByVal vKey As Long _                 ) As Long Public Const VK_DOWN = &H28 '[↓] Dim IngFlg As Boolean Sub Sample()  Dim i As Long  Dim s As Long  Dim e As Long  Dim t As Long  s = ((ActiveCell.Row - 1) * 10) + ActiveCell.Column ' e = ThisWorkbook.Sheets(1).Cells(14, 5).Value 'E14  e = 60 ' t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15  t =5  If s >= e Then    '<===バグがあったので今回修正   i = 0  Else   i = s  End If  IngFlg = True  Do '  If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Sub   If IngFlg = False Then Exit Sub   WaitFor t   CellSel i   i = i + 1   If i >= e Then    i = 0   End If  Loop End Sub Sub LoopEnd()  IngFlg = False End Sub '// 番号でセルを選択 Function CellSel(CntNum As Long)  Dim RowNum As Long  Dim ColNum As Long  RowNum = Int(CntNum / 10) + 1  ColNum = CntNum Mod 10 + 1  ThisWorkbook.Sheets(1).Cells(RowNum, ColNum).Select End Function '// 指定した秒だけ停止する関数 Function WaitFor(ByVal second As Integer)  Dim futureTime As Date  futureTime = DateAdd("s", second, Now)  While Now < futureTime '  If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Function   If IngFlg = False Then Exit Function   If GetAsyncKeyState(VK_DOWN) Then    IngFlg = False    Exit Function   End If   DoEvents  Wend End Function これを使っている装置は、常には手元にありません。 cpu100%になっても、他の処理を受け付けないということはないのですが、応答がとても遅くなります。 手元にあるのはWindows10で、ずっと性能が良いものですが、この装置で試行しました。 cpu使用率60%ほどになります。 上記コードの場合と、手を加えない場合とで変わりありません。 このマクロを実行しないときは、cpu5%ほどです。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.4

>このマクロを実行すると、CPU使用率100%になってしまいます。 1回/秒の処理を繰り返すコードですので 呆れるほど非力なCPUでもそれなりに動作するはずです。 >そのため「 * 60 * 60 * 24」を付けて動作確認中です。 この対応をしたコードを示してみてください。

dos_2000
質問者

補足

対応をしたコードは次の通りです。 t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15 これを、次のようにしました。 t = ThisWorkbook.Sheets(1).Cells(15, 7).Value * 60 * 60 * 24 'G15 試しに、このコードを変更せず元のままにして、時間の入るセルには時間ではなく数値で入れてみましたが、結果は同じでした。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.3

セルの移動範囲の最後のセルが選択された状態でマクロがスタートすると そのセルの次のセル (右側のセル、または、次行先頭のセル) がアクティブになってしまうバグがあるので修正しました。 また、 >このマクロを終了させるのは、 >マウスで直接別のセルをアクティブにしたとき、または、 >矢印キーでアクティブセルを移動したときなどにしたいですが 下向きの矢印キーが押されたら 即座に終了するようにしてみました。 (APIを使うのでちょっと難易度があがります。) Option Explicit Public Declare Function GetAsyncKeyState Lib "User32.dll" ( _                 ByVal vKey As Long _                 ) As Long Public Const VK_DOWN = &H28 '[↓] Dim IngFlg As Boolean Sub Sample()  Dim i As Long  Dim s As Long  Dim e As Long  Dim t As Long  s = ((ActiveCell.Row - 1) * 10) + ActiveCell.Column  e = ThisWorkbook.Sheets(1).Cells(14, 5).Value 'E14  t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15  If s >= e Then    '<===バグがあったので今回修正   i = 0  Else   i = s  End If  IngFlg = True  Do   If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Sub   If IngFlg = False Then Exit Sub   WaitFor t   CellSel i   i = i + 1   If i >= e Then    i = 0   End If  Loop End Sub Sub LoopEnd()  IngFlg = False End Sub '// 番号でセルを選択 Function CellSel(CntNum As Long)  Dim RowNum As Long  Dim ColNum As Long  RowNum = Int(CntNum / 10) + 1  ColNum = CntNum Mod 10 + 1  ThisWorkbook.Sheets(1).Cells(RowNum, ColNum).Select End Function '// 指定した秒だけ停止する関数 Function WaitFor(ByVal second As Integer)  Dim futureTime As Date  futureTime = DateAdd("s", second, Now)  While Now < futureTime   If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Function   If IngFlg = False Then Exit Function   If GetAsyncKeyState(VK_DOWN) Then    IngFlg = False    Exit Function   End If   DoEvents  Wend End Function

dos_2000
質問者

補足

ご回答ありがとうございます。 [G15]に入っている値は、数値ではなく時間で入っています。 そのセルの書式は時刻です。 そのため「 * 60 * 60 * 24」を付けて動作確認中です。 また、実際には式が入っていて、その結果の値は整数ではありません。 今のところ、[G15]の時間よりも少し長い時間が掛かっているようです。 私のPCの性能が低いためなのか?・・・ 検証中です。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

>なお、 >[E14]を空(Null)にしてVBAが停止するまで、最大、 >[G15]のセルに埋まっている秒数が必要です。 これを改善し、即座に終了するようにしてみました。 更に Sub LoopEnd()を用意しました。 終了するためのボタンを配置しクリックする あるいは任意の手段で Sub LoopEnd() を呼び出せば 即座に終わるようにしてみました。 Option Explicit Dim IngFlg As Boolean Sub Sample()  Dim i As Long  Dim s As Long  Dim e As Long  Dim t As Long    s = ((ActiveCell.Row - 1) * 10) + ActiveCell.Column  e = ThisWorkbook.Sheets(1).Cells(14, 5).Value 'E14  t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15  If s > e Then   i = 0  Else   i = s  End If  IngFlg = True  Do   If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Sub   If IngFlg = False Then Exit Sub   WaitFor t   CellSel i   i = i + 1   If i >= e Then    i = 0   End If  Loop   End Sub Sub LoopEnd()  IngFlg = False End Sub '// 番号でセルを選択 Function CellSel(CntNum As Long)  Dim RowNum As Long  Dim ColNum As Long  RowNum = Int(CntNum / 10) + 1  ColNum = CntNum Mod 10 + 1  ThisWorkbook.Sheets(1).Cells(RowNum, ColNum).Select End Function '// 指定した秒だけ停止する関数 Function WaitFor(ByVal second As Integer)  Dim futureTime As Date  futureTime = DateAdd("s", second, Now)  While Now < futureTime   If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Function   If IngFlg = False Then Exit Function   DoEvents  Wend End Function

dos_2000
質問者

補足

検証は続いていますが、一つ困った状態になっています。 このマクロを実行しているExcelは、とても古いパソコンに入っています。 CPUは450Mhzです。 このマクロを実行すると、CPU使用率100%になってしまいます。 発熱も大きく、他のファイル処理などをするのが難しくなります。 これを改善するにはどうしたら良いでしょうか。 お手数おかけしますが、よろしくお願いします。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.1

[G15]のセルには秒数が埋まっている。 終了する場合は [E14]を空(Null)にするという条件でよければ 次のようなコードでいかがでしょうか? なお、 [E14]を空(Null)にしてVBAが停止するまで、最大、 [G15]のセルに埋まっている秒数が必要です。 即座に終了したい場合は [Ctrl] キーを押したまま [Break] キーを押します。 Option Explicit Sub Sample()  Dim i As Long  Dim s As Long  Dim e As Long  Dim t As Long    s = ((ActiveCell.Row - 1) * 10) + ActiveCell.Column  e = ThisWorkbook.Sheets(1).Cells(14, 5).Value 'E14  t = ThisWorkbook.Sheets(1).Cells(15, 7).Value 'G15  If s > e Then   i = 0  Else   i = s  End If  Do   If ThisWorkbook.Sheets(1).Cells(14, 5).Value = "" Then Exit Sub   WaitFor t   CellSel i   i = i + 1   If i >= e Then    i = 0   End If  Loop   End Sub '// 番号でセルを選択 Function CellSel(CntNum As Long)  Dim RowNum As Long  Dim ColNum As Long  RowNum = Int(CntNum / 10) + 1  ColNum = CntNum Mod 10 + 1  ThisWorkbook.Sheets(1).Cells(RowNum, ColNum).Select End Function '// 指定した秒だけ停止する関数 Function WaitFor(ByVal second As Integer)  Dim futureTime As Date  futureTime = DateAdd("s", second, Now)  While Now < futureTime   DoEvents  Wend End Function

関連するQ&A

  • マクロについて

    マクロでゲームをつくるという宿題がでたのですが、 十字キーでアクティブセルを移動させていったとき、特定の範囲のセルに来た時、 一つ前のセルに戻すというようなマクロをくみたいのですが、どうしたらいいのでしょうか? また、アクティブセルに合わせてオブジェクトを動かしたいときは どうすればいいのでしょうか? 教えてください。

  • エクセル マクロ アクティブセル領域を移動させたい

    いつもお世話になっております。 当方マクロ超初心者です。 アクティブセルの大きさは変えずに、 範囲だけを移動させるマクロがつくりたいです。 例えば A1 B1 A2 B2 A3 B3 の6つのセルがアクティブの時に実行すると B3 C3 B4 C4 B5 C5 がアクティブになるマクロを作りたいです。 (この場合だとアクティブセルが 右へ2つ、下へ1つ移動したイメージ) 何卒よろしくお願いいたします。

  • EXCEL2003 書換えたセルを元に戻すマクロ

    お世話になります。 質問に関してですが、次のような内容になります。 セルB2:J2までの各セルに数式が入っており、セルL2に入力された内容によって各セルにデータが表示されるような物があります。 例えば、B2のセルのデータ内容を書換えるとします。通常であれば数式によりデータが表示されている為、データを書換える為には数式を消さなければなりません。 そこで、内容を書換える為にマクロを組んでおり、コマンドボタンを押すと、セルの値のみをコピーしてセルに表示させています。(アクティブセルをコピー→形式を選択して貼付け→値のみを貼付ける、という動作をマクロにしています) この書換えた内容を元に戻す(元の数式の入ったセルに戻す)為のマクロの組み方について質問があります。 書換える前のセルの数式をセルB250:J250に入れているのですが、 セルB2の内容を書換える場合はセルB250、セルG2の内容を書換えるにはセルG250のように アクティブセルの位置によって、同じ列の数式を選択して貼付けるようにするにはどうすればいいでしょうか?

  • Excel2007 セルの移動

    セルに数値を入力しています。 A1 B1 A2 B2 と2行2列のセルに数字を拾い入力します。 セル移動は右と指定してあります。 B1入力後A2へ移動する際方向キーやマウスを使わず 左下移動するショートカットキーはないでしょうか? マクロも記録程度ならできますので ご教授いただきたいです。

  • マクロで色のついたセルへ移動

    色の付いたセルへの移動方法で教えて下さい。 添付した画像のような時の場合に 例えばD2セルにカーソルがあって マクロを実行すると そこから次の塗りつぶし(10~16行)のD16に移動するには どうすればいいですか? 色の付いていないセル(画像でいうと7、9行目)と、 アクティブのセルの色と同じ色がある場合は、 その部分は抜かしたいです(画像でいうと8行目) 色は限定というわけではないので アクティブセルの色と違う色を見つけた場合に その色の塊の一番最後のD列のセルに移動するという感じです。 D16で実行すると次はD19 D19で実行すると次はD31 という感じの事が行いたいです。 ネット色々調べましたが似たような記事はこれぐらいしかありませんでした。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1090112035 宜しくお願いします。

  • マクロが実行されるセル範囲の変更を簡素化したい

    excel 2016を使っています。 例えば、ボタンを押すと指定したセルA1~A10までに入力されている数値を昇順に並べ替えるマクロがあるとします。 この数値が入力されているセルA1~A10の範囲をドラックして、D1~D10の位置に移動すると、マクロが実行される範囲を新たにD1~D10に指定しないとならないのですが、マクロが実行される範囲をA1~A10の範囲に固定して、別の場所に移動してもマクロを修正しなくても良い方法はありますか。

  • EXCELでセルの移動マクロを作りたいのですが…

    EXCELについての質問です。マクロを使ってセルの移動をさせたいと考えています。 まず使うデータ範囲はA1:E11です。A1:E10にはデータが入っています。 ちなみに、A列には名前、B~E列には数字が入っており、A11:E11は合計が表示される設定しており、合計の場所はここに固定させたいのです。 その移動のさせ方ですが、 A1:E1に空欄があるとします。 そのときに、マクロを再生させるとA2:E10のセルに入っているデータ(値のみ)を上に移動させたいのです。 さらに、A3:E3の内容を消して空欄が出来たとします。 その時に同じ操作によってA4:E10のデータを上に移動させたいのです。 前者のマクロを単純に作ると縦に9つ分のセルを移動させるマクロでは、 A11:E11も上に移動させられてしまいます。なので、移動させるセルの一番下が10行目になるようなマクロを作りたいのです。 何がしたいのかといいますと、いらないデータを消した時に空欄をマクロで詰めてしまいたいのです。 乱文で判りづらいかと思いますが、知識のある方教えていただけないでしょうか。 よろしくお願い致します。

  • セル移動マクロを教えて下さい。

    エクセルで最終行の次の行(新規入力となる行)の左4つ目のセルに移動するマクロを作りたいのですが、出来るでしょうか。 例えば列Aに1から3000までのNOが入っているとします。 B列からD列までは他のデータに使用しているため新規入力データE列の行から右に入力しています。 NO125の行までデータ入力している場合、ボタンをクリックすれば、A列のNO126(新規入力行のA列)にセルが移動するマクロです。 よろしく、お願いいたします。

  • エクセルのマクロで特定セル(最終セルの1つ下)への移動方法を教えて下さい

    エクセルでデータの最終セルのもう1つ下のセルに移動する マクロを作れますか?  例えば、住所録をリストで作成していたとします。 マクロを実行したら、新規レコードを入力するセル (*が入ってるセルです)にアクティブセルを移動する ・・・というマクロです。 コードの方法は教えてもらったのですが、コードがわからない方に 教えてあげたいのですが、マクロの記録でも同じことができますでしょうか?  よろしくお願いします!!

  • マクロで複数のセルに数値を入力したい

    エクセル、マクロとも初心者なのですが、タイトル通りのことをするにはどうしたらよいか教えてください。 やりたいことは、 「指定したアクティブセル(毎回変わる)を選択し、その隣のセルにあらかじめ決められた数値をマクロで入力する」というものです。 例えば・・・ A1をアクティブにし、マクロを実行する B1、C1、D1、E1のセルに決められた数値が入力される こんな感じです。 基本的なことかもしれませんが、どうかよろしくお願いします。

専門家に質問してみよう