• ベストアンサー

エクセルVBAでメッセージボックスの表示方法について

エクセル97です。 Sub エラー表示() A$ = Worksheets("Sheet1").Range("L10") B$ = Worksheets("Sheet1").Range("L11") C$ = Worksheets("Sheet1").Range("L12") D$ = Worksheets("Sheet1").Range("L13") E$ = Worksheets("Sheet1").Range("L14") F$ = Worksheets("Sheet1").Range("L15") If Worksheets("Sheet1").Range("L9") = False Then MsgBox "条件設定に下記のエラーがあります。" _ + Chr(&HD) + Chr(&HA) + "ご確認ください。" _ + Chr(&HD) + Chr(&HA) + A$ _ + Chr(&HD) + Chr(&HA) + B$ _ + Chr(&HD) + Chr(&HA) + C$ _ + Chr(&HD) + Chr(&HA) + D$ _ + Chr(&HD) + Chr(&HA) + E$ _ + Chr(&HD) + Chr(&HA) + F$ _ + Chr(&HD) + Chr(&HA) + "", vbCritical, "確認!!" End If End Sub 上記のようなメッセージを表示するマクロを作りました。 Sheet1のセルL10~L15に計算でエラーを表示させ、どれか一つでもエラーがあれば、メッセージボックスが出るようにしたのですが、たとえば、セルL10とL15のみのエラーだとメッセージボックスが途中、4行分も空いてしまい、かっこうが悪いのです。 改行せずに、続けて表示させようかとも思いましたが、それもあまり形がよくありません。 こんな場合、表示されてないセルの行を自動的に詰めるような方法はないのでしょうか?

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 「計算でエラーを表示させ」とは、計算結果がエラーだったら何らかの文字を表示させているって事? その判定をさらに L9 にさせている? 対象セルに入っている関数も提示してあると処理概要が掴みやすいのですが。。。 Sub Test1() Dim msgResult As String, i As Integer msgResult = "条件設定に下記のエラーがあります。" & Chr(13) & _         "ご確認ください。" & Chr(13) With Worksheets("Sheet1")  For i = 10 To 15    If .Range("L" & i) <> "" Then      msgResult = msgResult & Chr(13) & .Range("L" & i)    End If  Next i  If .Range("L9") = False Then MsgBox msgResult, vbCritical, "確認!!" End With End Sub

AQUALINE
質問者

お礼

ありがとうございました。 完璧に出来ました! ところで改行の記号の + Chr(13)は 他の人が書かれた +Chr(&HD) + Chr(&HA) や +Chr(10) + Chr(13)と 意味がどうちがうのでしょうか? 書換えてやってみたらどれも同じ様になるのですが・・・。 お礼にまた質問してすみません。

その他の回答 (4)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

再びこんにちは。 > + Chr(13)は > 他の人が書かれた > +Chr(&HD) + Chr(&HA) や > +Chr(10) + Chr(13)と > 意味がどうちがうのでしょうか? 改行を表すコードです。 Windows は通常 CR+LF(キャリッジリターン + ラインフィールド)ですが、MsgBoxで使う場合 CRだけでも、LFだけでも問題無く改行されるので省略しちゃいました。 何故CR+LFの2つで「改行」を表すかと言うと、昔のプリンターは、左から右に文字を印字して行き、CRで一番左に戻り、LFで1行下がり、また左から2行目を印刷って感じで2つのコードが必要だった。。。と聞いた事があります。 Chr(13)とChr(&HD)、Chr(10)とChr(&HA) は同じ意味です。 10進数の「13」は16進数の「D」です。&Hを付けると16進表記なので「&HD」 10進数の「10」は16進数の「A」です。&Hを付けると16進表記なので「&HA」 Chr(&HD) + Chr(&HA) は Chr(13) + Chr(10) と同じで、私は省略して Chr(13) と書いてしまっただけです。Chr(10) + Chr(13)は順序を間違えて書かれたのかなと。。 ちなみに名前付き定数に「vbCrLf」と言うのもあります。 Sub AAA   MsgBox "Chr(13)" & Chr(13) & "でも、"   MsgBox "Chr(10)でも" & Chr(10) & "改行するぞ"   MsgBox "実はvbCrLfが" & vbCrLf & "一番正当か?" End Sub

AQUALINE
質問者

お礼

ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

既に出ているご回答がそのようですが、 文字列をsとして、毎回繰り返しに入る前に、s=""でクリアし、セルにエラーがあるかどうかを1つずつ判別し、あればs=s & (セル内容) & chr(10) & chr(13)を繰り返す。 するとエラーのあるセル値の文字列だけがsに累積されます。 繰り返しが終わったところでMsgboxで出せば良い。

AQUALINE
質問者

お礼

ありがとうございます。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

1個1個やるしかないでしょう。 If Worksheets("Sheet1").Range("L9") = False Then MsgBox "条件設定に下記のエラーがあります。" _ + Chr(&HD) + Chr(&HA) + "ご確認ください。" _ + Chr(&HD) + Chr(&HA) + A$ _ + Chr(&HD) + Chr(&HA) + B$ _ を If Worksheets("Sheet1").Range("L9") = False Then  STR$= "条件設定に下記のエラーがあります。" _  + Chr(&HD) + Chr(&HA) + "ご確認ください。" _  If Worksheets("Sheet1").Range("L10" = False Then   STR$ + Chr(&HD) + Chr(&HA) + A$ _  ElseIf Worksheets("Sheet1").Range("L11") =  False Then   STR$ + Chr(&HD) + Chr(&HA) + B$ _    ・    ・    ・  End If  STR$ + Chr(&HD) + Chr(&HA) + "", vbCritical, "確認!!"  MsgBox STR$ End If

AQUALINE
質問者

お礼

ありがとうございました。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

Sub エラー表示() A$ = Worksheets("Sheet1").Range("L10") B$ = Worksheets("Sheet1").Range("L11") C$ = Worksheets("Sheet1").Range("L12") D$ = Worksheets("Sheet1").Range("L13") E$ = Worksheets("Sheet1").Range("L14") F$ = Worksheets("Sheet1").Range("L15") if A$<>"" then A$=A$+Chr(&HD) + Chr(&HA) if B$<>"" then B$=B$+Chr(&HD) + Chr(&HA) if C$<>"" then C$=C$+Chr(&HD) + Chr(&HA) if D$<>"" then D$=D$+Chr(&HD) + Chr(&HA) if E$<>"" then E$=E$+Chr(&HD) + Chr(&HA) if F$<>"" then F$=F$+Chr(&HD) + Chr(&HA) If Worksheets("Sheet1").Range("L9") = False Then MsgBox "条件設定に下記のエラーがあります。" _ + Chr(&HD) + Chr(&HA) + "ご確認ください。" _ + Chr(&HD) + Chr(&HA) + A$ _ B$ + C$ + D$ + E$ + F$ + "", vbCritical, "確認!!" End If End Sub としてあげれば いいでしょう。

AQUALINE
質問者

お礼

ありがとうございました。 出来ました! ところで改行の +Chr(&HD) + Chr(&HA) と、 他の人が書かれた +Chr(10) + Chr(13) あるいは + Chr(13)は、意味がどうちがうのでしょうか? 書換えてやってみたらどれも同じ様になるのですが・・・。 お礼にまた質問してすみません。

関連するQ&A

  • VBAエクセル2003での下記の命令文の作成2

    命令文: シート名:商品売上げのセルB16に入っている数字と シート名:売り上げのセルC16に入っている数字が同じなら メッセージBOXに○を表示させる そうでなければ メッセージBOXに×を表示させる ↓ Sub 売り上げ() Set WS1 = Worksheets("売上") Set WS2 = Worksheets("商品売上") If WS1.Range("C16") = WS2.Range("B16") Then MsgBox "○" Else MsgBox "×" End If End Sub この作業をマクロの実行を押さずにショートカットキーで 作業を可能にするには どういった命令文または操作でショートカットキーでの表示がかのでしょうか。 (ショートカットキーを押すことで○×の表示を出すにはどうしたらいいでしょうか?) また、同じシート内でB16のセルとC16のセル、D15が同じ場合は メッセージボックスに○そうでない場合は×の場合は Sub 売り上げ2() Worksheets("商品売上") If Range("B16") = Range("C16") =Range("D15") Then MsgBox "○" Else MsgBox "×" End If End Sub だけでいいんでしょうか? 詳しい方教えてください。 今、仕事でミスが多くプログラミングでどうにか ミスを防げないか工夫したいのですが まだ、習いたてでよくわかりません。 お手数が教えていただけませんでしょうか。 よろしくお願いいたします。

  • エクセルVBAでMsgboxの表示をそろえたい

    ワークシート上の数値をメッセージボックスで表示させるため、下記のようなVBAを書きました。 Sub 金額表示() Dim a As Long, b As Long, c As Long a = Sheets("logic").Range("P39").Value b = Sheets("logic").Range("O46").Value d = Sheets("logic").Range("O44").Value MsgBox "合計の金額は、" & Format(d, "##,###万円") _ + Chr(&HD) + Chr(&HA) + "○○は、" & Format(a, "##,###万円") _ + Chr(&HD) + Chr(&HA) + "○○○○は、" & Format(b, "##,###万円"), vbInformation, "確認" End Sub ○○部分の文字数や、金額の桁数により、表示される数字の位置ははかなりずれがあります。 これを円で後ろでそろえ統一するような方法はないでしょうか? 出来れば後ろでそろえても○○の部分も頭をそろえておきたいですが、それが無理なら後揃えだけでも結構です。 よろしくお願いします。

  • メッセージボックスを表示させるエクセルマクロ

    こんにちは。マクロ初心者です。 エクセル(Excel2003)でメッセージボックスを 表示させるマクロが思うようにいかず困っています。 B列に「○○会社」と入力されれば、 「取引先です。」 とメッセージボックスを表示させたいと思い、 次のとおりマクロを作成しました。 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- しかし、コピーなどで複数のセルを貼り付ける(入力)行為をすると、 「実行エラー'13': 型が一致しません」と出てしまいます。 Worksheet_Change(ByVal Target As Range)を使っているので、 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- と、「If Target.Count > 1 Then Exit Sub 」を入れれば、 メッセージは出なくなるのですが、 これだと、A列セルに、コピー&ペーストで複数セルを貼り付けた場合、 「○○会社」があっても、マクロが効いてきません。 複数セルの貼り付けにも対応させるには、 どのようにすればよろしいでしょうか? 基本的なところが理解できていないのだと自覚しておりますが、 どうかご教授願います。 長々とわかりづらい文章ですみません。よろしくお願いします。

  • エクセル/BeforeCloseイベントで保存できない!?

    エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセルVBAで在庫管理。初心者です。

    こんにちは。よろしくお願いします。 エクセルで出荷入力画面シートに数字を入力。もし、発注しなくてはならない 在庫数設定より(在庫限界入力シート)、その商品の総合計(在庫残高シート)が 少なくなったら、メッセージボックスに警告を表示したいのです。 先日、親切な方々のアドバイスで、以下のように組んで見ましたが、 入力シートにはたくさんの商品があり、どのセルに入れても全部同じメッセージ ボックスがでてしまいます。これができないと、お茶組のままです。 がんばって作ってきたエクセルが、期限に間に合いません。助けてください。 Private Sub Worksheet_Calculate() dim counter as integer If Worksheets("在庫残高").Range("C6") < Worksheets("在庫限界入 力").Range("C6") Then counter=Worksheets("在庫限界入力").Range("C6")-Worksheets("在庫 残高").Range("C6") MsgBox counter& "本在庫不足", vbOKOnly, "警告" End If End Sub 一行目のworksheetをobjectにしてもだめでした。また()のなかに入力する 全てのセルの範囲を指定してもだめでした。 どうすればいいのでしょう。

  • コンボボックス 連動 VBA

    VBA初心者です。 ご教授ください。 入力フォームにコンボボックスを4っつ リストボックスを一つ作成し 一つ目のコンボでシートを選択後 二つ目以降のコンボボックスでセル範囲を選択し絞り込み、最終のリストボックスに 絞り込み表示を行い、コマンドボタンにて フィルター操作を行いたいのですが 重複表示させずに、絞り込んでいく方法がうまくいきません。下記コードにコンボボックス3以降も記述したのですが、絞り込みができません。よろしくお願いします。 Private Sub UserForm_Initialize() For i = 2 To Worksheets.Count 'シートの数だけ繰り返す ComboBox1.AddItem Worksheets(i).Name '取得したシート名をリストボックスへ Next End Sub Private Sub ComboBox1_Change() Dim Index As Integer Dim strBuf As String Index = ComboBox1.ListIndex 'ワークシートリストの選択された位置 strBuf = ComboBox1.List(Index) 'ワークシート名を取得 Worksheets(strBuf).Activate ' セルA1を左上端にする Application.Goto Reference:=Range("A1"), Scroll:=True ComboBox2.Clear Dim リスト As New Collection Dim 列 As String, 上端セル As String, 最下端セル As String Dim セル範囲 As Range, 各セル As Range 列 = "b" '※3 上端セル = 列 & "4" '※4 最下端セル = 列 & "65536" With Worksheets(strBuf) '※5 Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp)) End With For Each 各セル In セル範囲 'セル範囲の各セルについて繰り返し処理 On Error Resume Next '次行が実行時エラーならその次行から継続 リスト.Add 各セル.Value, CStr(各セル.Value) 'Collectionオブジェクトにメンバを追加 If Err.Number = 0 Then '実行時エラーが発生していなければ Me.ComboBox2.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub

  • エクセルでVLOOKUPで検出できなかったらメッセージボックスを出した

    エクセルでVLOOKUPで検出できなかったらメッセージボックスを出したい。 シート1のセルB1に =VLOOKUP(A1,シート2!B2:F1000,2,FALSE) と式を入れてあります。 シート1のセルA1に入力をするとシート2のB列から入力した同レコード を抽出しその行のC列を シート1のセルB1に表示します。 シート2に同レコードが無ければ セルB1には #N/A と表示されます。 この時にこの#N/Aの表示をトリガーに メッセージボックスで 「データーがありません」と表示させるのはどうしたらいいでしょうか? マクロを組みましたが、わざとシート2にはない値を入力した時に メッセージボックスが表示される場合と表示されない場合があって困っています。 ------------------------------------------------ Range("B1").Select If IsError(ActiveCell.Value) Then errval = ActiveCell.Value Select Case errval Case CVErr(xlErrDiv0) MsgBox "#DIV/0! エラー" Case CVErr(xlErrNA) If vbOK = MsgBox(" データーがありません") Then Exit Sub End Select End If ----------------------------------------------- またこのメッセージボックスには「OK」と表示されています。 このOKをクリックすると 登録してある別のマクロを起動させる事はできますか? よろしくお願いします。

  • メッセージボックスについて。

    上司に言われた締め切りがあと4日になってしまいました。 在庫管理で在庫残高シートに次のプログラムをはってみました。 Private Sub Worksheet_Change(ByVal Target As range) Dim clm As Integer '変化したセルの列 Dim row As Integer '変化したセルの行 Dim counter As Integer '不足数 clm = Target.Column row = Target.row If Worksheets("在庫残高").Cells(row, clm) < Worksheets("在庫限界入力").Cells(row, clm) And Worksheets("在庫残高").Cells(row, clm) > 0 Then counter = Worksheets("在庫限界入力").Cells(row, clm) - Worksheets("在庫残高").Cells(row, clm) MsgBox counter & "本在庫不足", vbOKOnly, "注意" Else If Worksheets("在庫残高").Cells(row, clm) < 0 Then MsgBox "在庫がありません", vbOKOnly, "警告" End If End If End Sub アクティブになってる入力シートに入力したときに、アクティブシートにメッセージボックスを出したいのですが、どうすればよいでしょう。複数の入力シートに これを全て貼り付けることも考えましたが、入力シートの何個かのセルが、 在庫残高シートの一つのセルに参照されるようになっているので、そうしないほうが、 いいんじゃないかなとおもいました。 よろしくお願いします。

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

専門家に質問してみよう