人気ブログランキング | 話題のタグを見る

初心者オサムシがExcelのマクロと戦う戦闘ブログである
by オサムシ
データを判定する関数/マクロ基礎(ファン限定)
この記事はブログのファンのみ閲覧できます

# by 03musi | 2013-01-21 23:09 | マクロ 基礎
配列を操作する関数/マクロ基礎(ファン限定)
この記事はブログのファンのみ閲覧できます

# by 03musi | 2013-01-20 21:56 | マクロ 基礎
止まらないマクロを停止する~無限ループ~/マクロ基礎

止まらないマクロを停止する~無限ループ~/マクロ基礎



Do…LoopやFor…Nextを使っていると永遠に終わらないマクロを書いてしまう場合がある

VBEでもこのような論理的に矛盾の無い構文は検知してくれないから、実行してしまうとExcelを閉じる事さえできなくなる

無限ループの原因にもよるみたいだけど、【Esc】かもしくは【Ctrl】+【Pause】で止まるようです

一度陥った事があったのですが、どんな構文だったか忘れたし、新たに無限ループを作ろうにもすぐに思いつかなかったので、まだ未検証ですけど。。

僕の場合、実際の記述の中で、実行結果が希望通りになっているか検証できるまでは、回避策としてExitを選択できるようなIf文を仕込んでおくようにしている

Exit ステートメントは文字通り処理を抜けるステートメントです
早い話が、その処理を途中でやめるのですが、マクロ全体をやめてしまう訳ではなくて、指定方法によって、やめる処理の範囲が違います

Exit Sub
Subプロシージャを中止します

Exit Function
Functionプロシージャを中止します

Exit For
For…Nextステートメント・For Each…Nextステートメントを中止します

Exit Do
Do…Loopステートメントを中止します

構文に間違いが無ければ、最後に削除すればよい

例えばこんな感じ

A列のセルを上から巡回して、最初の空白セル(次に入力するであろうセル)に番号を1足して入力するマクロ
オートインクリメントです
Sub sample1()
Dim a As Variant //変数宣言
Dim n As Variant //変数宣言
n = 2 //2行目から開始
a = Cells(n, 1) //aにセルを代入
Do Until IsEmpty(a) //aが空でなかったら処理続行
If vbOK = MsgBox(a, vbOKCancel) Then //処理を続けるか対話。Ifで分岐
Else: Exit Do //OKじゃなければDoを抜ける
End If //Ifここまで
n = n + 1 //次のセルへ
a = Cells(n, 1) //aに次のセルを代入
Loop //Loopここまで
b = Cells(n - 1, 1) + 1 //bに最終行の値に1足して代入
Cells(n, 1).Value = b //新しいセルにbを代入
Cells(n, 2).Activate //名前を入力するB列をアクティブ化
MsgBox b & "番を追加しました" //bを表示
End Sub


シートにはこのように入力しておきます
止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_147422.jpg


実行
止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_148223.jpg

止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_1481223.jpg

止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_1482019.jpg

止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_1483056.jpg

止まらないマクロを停止する~無限ループ~/マクロ基礎_d0285354_1484459.jpg


思惑通り、オートインクリメントした後に、処理を終了する事が確認できたら

Sub sample1()
Dim a As Variant
Dim n As Variant
n = 2
a = Cells(n, 1)
Do Until IsEmpty(a)
' If vbOK = MsgBox(a, vbOKCancel) Then
' Else: Exit Do
' End If
n = n + 1
a = Cells(n, 1)
Loop
b = Cells(n - 1, 1) + 1
Cells(n, 1).Value = b
Cells(n, 2).Activate
MsgBox b & "番を追加しました"
End Sub


確認用メッセージボックスをコメントアウトするか、削除して完了

そうすれば、上の画像の1~3までのメッセージボックスは表示されず、目的の処理だけ行ってくれます

範囲指定してコメントアウトする方法はコメントアウト/マクロ基礎を参照してください

どうですか?

強制的に終了させるより、かっこいいでしょww。osamushi

オサムシじゃーなる
# by 03musi | 2013-01-20 14:12 | マクロ 基礎
For Each ステートメント/マクロ基礎

For Each ステートメント/マクロ基礎



For Each ステートメントは、グループの構成要素を順番に操作していく為のステートメントです

ここでいうグループとは配列やコレクションを指します

配列とは、例えば選択した複数セルが該当します

マクロを書いてみよう
Sub 選択セル繰り返し()
Dim hyouji As Range 'For EachはObjectかVariant型以外はエラー
For Each hyouji In Selection '選択セルを指定
MsgBox hyouji 'メッセージボックスで表示
Next '繰り返しここまで
End Sub


シートに適当な値を入力して選択
For Each ステートメント/マクロ基礎_d0285354_2040254.jpg


For Each ステートメント/マクロ基礎_d0285354_20411551.jpg

For Each ステートメント/マクロ基礎_d0285354_20412253.jpg

For Each ステートメント/マクロ基礎_d0285354_20414565.jpg

For Each ステートメント/マクロ基礎_d0285354_20415329.jpg

セルの中身は見てないので、選択したセルは空でも表示します

For Each hyouji In Selection
この部分を
For Each hyouji In Range("A1:A4")
と直接範囲指定しても同じ結果です

コレクションを使うなら例えばWorksheetsだと
For Each hyouji In Worksheets
これで、設定されているシートを左から順番に処理する

Offsetプロパティなどと組み合わせても使えるね!

創造力を掻き立てるステートメントですな。osamushi

オサムシじゃーなる
# by 03musi | 2013-01-19 20:50 | マクロ 基礎
Do Loop ステートメント/マクロ基礎

Do Loop ステートメント



Do Loop ステートメント は、指定した条件によって処理を繰り返す

1.繰り返し前で条件を判定する
Do 条件
処理
Loop
条件を満たさなかった場合、処理は1回も実行されない

2.繰り返しの後で条件を判定する
Do
処理
Loop 条件
条件を満たさなかった場合でも、1回処理が実行される
その後は繰り返さない

条件に対して2つの選択肢がある

1.真の時繰り返す While 条件
2.偽の時繰り返す Until 条件

言葉で書いたところでイマイチ意味がわかりにくいので、マクロを書いてみましょう
Sub sample1()
Dim a As Variant 'aの変数宣言
Dim n As Variant 'nの変数宣言
n = 1 '0からでは困るので1を代入
a = Cells(n, 1) 'aにセル値を代入
Do Until IsEmpty(a) 'aが空でなかったら処理を続ける
If vbOK = MsgBox(a, vbOKCancel) Then
Else: Exit Do 'OKが押されなかった場合Doから抜ける
End If
n = n + 1 '1つ下のセルへ
a = Cells(n, 1) 'aにセル値を代入
Loop 'Loopここまで
End Sub

実行してみよう
まず、シートのA1セルから下に1,2,3,4,5と入力
Do Loop ステートメント/マクロ基礎_d0285354_047155.jpg

マクロを実行
Do Loop ステートメント/マクロ基礎_d0285354_048457.jpg

Do Loop ステートメント/マクロ基礎_d0285354_048841.jpg

Do Loop ステートメント/マクロ基礎_d0285354_0481390.jpg

Do Loop ステートメント/マクロ基礎_d0285354_0481721.jpg

Do Loop ステートメント/マクロ基礎_d0285354_0482060.jpg

ここでA6セルはEmpty(空)の為、ループ処理が終わる
A列に値が入っている限り、延々と続いてしまうので、Ifにてキャンセルボタンを押した場合はLoopから抜ける手段を用意しておいた。

Do Loopもよく使いそうなステートメントだね、覚えておこう!osamushi

オサムシじゃーなる
# by 03musi | 2013-01-17 01:00 | マクロ 基礎