TopProgramming LanguageVB/VBA > 2014年6月
2014年6月26日

Excel VBAの確認ダイアログで処理を中断させる方法のまとめ

June 26,2014 1:23 AM
Tag:[, ]
Permalink

Excel VBAの確認ダイアログで処理を中断させる方法をまとめました。

このエントリーでは、次のようなダイアログで処理を中断できる方法を紹介します。

処理を中断するボタン

1.問題点

Excel VBAでダイアログを表示するにはMsgBoxを利用します。

MsgBox("実行します")

実行結果

ただしこれでは「OK」を表示するだけのダイアログなので、処理を中断することはできません。

が、JavaScriptのような処理を中断できるダイアログを表示させる方法が分かりません。

2.ダイアログで処理を中断させる

ダイアログで処理を中断させるには、まずMsgBoxを次のフォーマットで記述します。

MsgBox(ダイアログに表示する文字列, 表示するボタンの種類)

第1パラメータに表示する文字列、第2パラメータにボタンの種類を設定します。

サンプルとしてここでは次のように設定します(詳細は後述)。

MsgBox("実行しますか?", vbYesNo)

これで「はい」「いいえ」の2つのボタンが表示されます。

サンプルの実行結果
処理を中断するボタン

そしてMsgBoxのボタンのクリック結果をIf文で判定し、判定後にExitなどを行えば、ダイアログで処理を中断させることができます。

If MsgBox("実行しますか?", vbYesNo) = vbNo Then
    Exit Sub
End If

次項から表示ボタンの種類やアイコン・タイトルの表示方法について紹介します。

3.ボタンの種類と判定方法

MsgBoxで表示できるボタンは「はい」「いいえ」以外にも色々用意されています。

第2パラメータに設定する値と、対応するボタンの表示は次のようになります。

vbYesNo(はい・いいえを表示)
vbYesNoボタン

vbOKCancel(OK・キャンセルを表示)
vbOKCancelボタン

vbYesNoCancel(はい・いいえ・キャンセル表示)
vbYesNoCancelボタン

vbRetryCancel(再試行・キャンセルを表示)
vbRetryCancelボタン

vbAbortRetryIgnore(中止・再試行・無視を表示)
vbAbortRetryIgnoreボタン

また、上記のボタンの判定方法は次のとおりです。

  • 「はい」であることを判定:vbYes
  • 「いいえ」であることを判定:vbNo
  • 「キャンセル」であることを判定:vbCancel
  • 「再試行」であることを判定:vbRetry
  • 「中止」であることを判定:vbAbort
  • 「無視」であることを判定:vbIgnore

4.ダイアログにアイコンを表示する

ダイアログにアイコンを表示するには、第2パラメータに文字列を連結する形式で記述します。

MsgBox("実行しますか?", vbQuestion + vbYesNo)

アイコンの主な種類は次のとおりです。

vbQuestion(問い合わせ)
vbQuestionのアイコンを表示

vbExclamation(注意)
vbExclamationのアイコンを表示

vbInformation(情報)
vbInformationのアイコンを表示

上記の他、vbCriticalもあります。

5.任意のボタンを選択された状態にする

4項までのサンプルでは、いずれも一番左のボタンが選択された状態になっています。

任意のボタンを選択された状態にするには、第2パラメータに「vbDefaultButtonX(Xはボタンの番号)」を追加します。

たとえば、2つめのボタンを選択された状態にするには「vbDefaultButton2」を追加します。

MsgBox("実行しますか?", vbDefaultButton2 + vbYesNo)

これで次のように、「いいえ」が選択された状態で表示されます。

vbDefaultButton2を追加

アイコンも加えるのであれば、すべてを文字列連結で記述します。

MsgBox("実行しますか?", vbQuestion + vbDefaultButton2 + vbYesNo)

6.ダイアログのタイトルを表示する

ダイアログのタイトルを表示するには、MsgBoxの第3パラメータに設定します。

MsgBox("実行しますか?", vbYesNo, "確認")

これで次のように、タイトルバーに「確認」が表示されます。

ダイアログのタイトルを表示

Comments [0] | Trackbacks [0]
2014年6月17日

VBAでオブジェクトを関数の返却値に使う時に「オブジェクト変数またはWithブロック変数が設定されていません」というエラーになる場合の対処

June 17,2014 1:33 AM
Tag:[, ]
Permalink

VBAでオブジェクトを関数の返却値に使う時に「オブジェクト変数またはWithブロック変数が設定されていません」というエラーになる場合の対処方法を紹介します。

1.問題点

Excel VBAで正規表現を使って文字列をマッチさせる方法」で、VBScript.RegExpを使った正規表現の文字列マッチ処理を紹介しました。

下記のコードはそのサンプルです。

Sub test()
    Dim str As String
    str = "foo Foo FOO"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "foo"
    regex.Global = True
    regex.IgnoreCase = True
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

上のコードから文字列マッチの処理だけを汎用的に使えるよう、別関数に切り出してみました。

Function exec_regex(data As String, pattern As String) As Object
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.pattern = pattern
    regex.Global = True
    regex.IgnoreCase = True
    exec_regex = regex.Execute(data)
End Function

本題からそれますが、文字列マッチ結果はMatchesコレクションになりますが、返却値にするにはFunctionに「As Object」を設定します。

Function exec_regex(data As String, pattern As String) As Object

そして次のコードから切り出した関数を起動してみました。関数パラメータは、マッチ文字列とマッチさせたいパターンです。

Sub test()
    Dim result
    Set result = exec_regex("foo Foo FOO", "foo")
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
End Sub

がこのコードを実行すると、タイトルのように「オブジェクト変数またはWithブロック変数が設定されていません」というエラーになります。

「オブジェクト変数またはWithブロック変数が設定されていません」というエラー

2.原因と対処

エラーの原因は、返却値を設定するときに「Set」を行っていなかったためです。

ということで、関数の返却値を設定するときに「Set」を追加することでエラーは解消しました。

Function exec_regex(data As String, pattern As String) As Object
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.pattern = pattern
    regex.Global = True
    regex.IgnoreCase = True
    Set exec_regex = regex.Execute(data)
End Function

ここではExecuteの実行結果を例にとりあげましたが、オブジェクトを返却値に利用するときは「Set」が必要となります。

また、ここで紹介したサンプルには最初から設定していますが、オブジェクトを受け取る側にも「Set」が必要ですので気をつけましょう。

Sub test()
    Dim result
    Set result = exec_regex("foo Foo FOO", "foo")
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
End Sub
Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3