こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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行目を超えたら毎回メッセージが表示されます。
何かいい方法はないでしょうか。

よろしくお願いします。

投稿日時 - 2009-06-01 17:22:24

QNo.5008515

困ってます

質問者が選んだベストアンサー

どういったものを想定されているのかがイマイチわかりません。

>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


こんな感じでしょうか・・・。
急造したものなので意味合い・エラー等でましたら申し訳ありません。
とりあえずイベント終了後(処理終了後)も変数に値を保持ということができないので、どこかのセルを非表示にして、そこをフラグ扱いしてやれば想定された動作を実現できるかなっと思います。
ズレているようでしたら補足お願いします。

投稿日時 - 2009-06-01 17:47:45

お礼

皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。
空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。
どうもありがとうございました。

なお、質問文に一部誤りがありました。
「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。
混乱させて申し訳ありませんでした。

投稿日時 - 2009-06-01 22:18:17

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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回だけのテスト。

投稿日時 - 2009-06-01 22:45:30

お礼

皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。
空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。
どうもありがとうございました。

なお、質問文に一部誤りがありました。
「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。
混乱させて申し訳ありませんでした。

投稿日時 - 2009-06-02 02:17:06

ANo.2

フラグを立てればいいです。

Dim b As Boolean


If a.Row >= 1000 And b = False Then
MsgBox "1000を超えました"
b = True
End If

投稿日時 - 2009-06-01 17:30:03

お礼

皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。
空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。
どうもありがとうございました。

なお、質問文に一部誤りがありました。
「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。
混乱させて申し訳ありませんでした。

投稿日時 - 2009-06-01 22:35:02

ANo.1

チェック項目を入れるとか?

Dim a As Range
Dim ch As Boolean

ch = False

'~ループ~

If a.Row >= 1000 And ch = False Then
MsgBox ("1000を超えました")
ch = True
End If

'~ループ~

投稿日時 - 2009-06-01 17:27:49

お礼

皆さんのご回答のおかげでフラグを立てるという方法に気がつきました。
空いたセルに適当な値をあらかじめ書き込んでおき、1000行を超えたらメッセージを表示させて、その値を書き換えるという方法が最も良さそうです。
どうもありがとうございました。

なお、質問文に一部誤りがありました。
「A1→B1→E1→F1→G1・・・」ではなくて、「A1→A2→A5→A6→A7・・・」でした。
混乱させて申し訳ありませんでした。

投稿日時 - 2009-06-01 22:34:33

あなたにオススメの質問