- ベストアンサー
エクセルVBAで順番にデータを処理していくとき、途中で一度だけポーズをかける方法
エクセルで2000行分くらいの表があり、A1、A2と順番に処理して行くのですが、その処理の結果によって間が飛ぶ場合があります。 A1→B1→E1→F1→G1・・・といった感じです。 こんなマクロの中で、行が1000を「超えた」ときに「一回だけ」メッセージ(例えば「1000を超えました」)を表示させるにはどうすればいいでしょうか。 Dim a As Range If a.Row = 1000 Then MsgBox ("1000を超えました") これでは、ちょうど1000行目が飛ばされた場合は素通りしますし、 If a.Row >= 1000 Then MsgBox ("1000を超えました") これだと、1000行目を超えたら毎回メッセージが表示されます。 何かいい方法はないでしょうか。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
どういったものを想定されているのかがイマイチわかりません。 >1000行を超えたら一回だけメッセージ・・・ この一回というのは、 「一回のイベントで1000・2000と出力する中での1000行目に一回」 ということでしょうか? それとも 「フォームを開いている間で何回同様のイベントが発生しようと、1000行でメッセージを表示するのは一回」 といっているのでしょうか? それによって多少ロジックが変わってきますが、 基本的には ・ループ文内で繰り返し前に 「hoge = hoge + 1」 で飛ばされなかった行数文をカウント ・変数hogeのカウントが1000に達した際の処理 ・達した際の処理内に非表示セルに値を代入(フラグ扱い) ・以降、1000に達した際にその代入した非表示セルの値を見て、 値が入っていれば、メッセージ表示なし。 入っていなければメッセージ表示。 ロジックで書くと、 Sub test() Dim hoge As Integer Dim i As Integer Dim CellsValue As String '------------------------------------------------------------- '前処理 '------------------------------------------------------------- For i = 1 To 2000 'とりあえずループ回数はテキトーに。 '-------- '出力処理 '-------- hoge = hoge + 1 '行出力を飛ばさない際のみカウント If hoge = 1000 Then CellsValue = Range("A1").Value If IsEmpty(CellsValue) = True Then Range("A1") = "hogehoge" 'フラグとして使用 MsgBox "1000行になりました!!" End If End If Next i '------------------------------------------------------------- '後処理 '------------------------------------------------------------- End Sub こんな感じでしょうか・・・。 急造したものなので意味合い・エラー等でましたら申し訳ありません。 とりあえずイベント終了後(処理終了後)も変数に値を保持ということができないので、どこかのセルを非表示にして、そこをフラグ扱いしてやれば想定された動作を実現できるかなっと思います。 ズレているようでしたら補足お願いします。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
Flagのコード例 1000->20の例 Sub test01() s = "y" For i = 1 To 30 Step 3 If (i > 20) * (s = "y") Then MsgBox "20超え" & i s = "n" End If Next i End Sub Msgboxの表示は1回だけのテスト。
お礼
皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。 空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。 どうもありがとうございました。 なお、質問文に一部誤りがありました。 「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。 混乱させて申し訳ありませんでした。
- kybo
- ベストアンサー率53% (349/647)
フラグを立てればいいです。 Dim b As Boolean If a.Row >= 1000 And b = False Then MsgBox "1000を超えました" b = True End If
お礼
皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。 空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。 どうもありがとうございました。 なお、質問文に一部誤りがありました。 「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。 混乱させて申し訳ありませんでした。
- n-jun
- ベストアンサー率33% (959/2873)
チェック項目を入れるとか? Dim a As Range Dim ch As Boolean ch = False '~ループ~ If a.Row >= 1000 And ch = False Then MsgBox ("1000を超えました") ch = True End If '~ループ~
お礼
皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。 空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。 どうもありがとうございました。 なお、質問文に一部誤りがありました。 「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。 混乱させて申し訳ありませんでした。
お礼
皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。 空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。 どうもありがとうございました。 なお、質問文に一部誤りがありました。 「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。 混乱させて申し訳ありませんでした。