• 締切済み

エクセル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 ○○部分の文字数や、金額の桁数により、表示される数字の位置ははかなりずれがあります。 これを円で後ろでそろえ統一するような方法はないでしょうか? 出来れば後ろでそろえても○○の部分も頭をそろえておきたいですが、それが無理なら後揃えだけでも結構です。 よろしくお願いします。

みんなの回答

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.6

> ならば、セル内での右寄せ同様に後ろだけ揃えることは不可能でしょうか? 今までのことは、全て後ろを揃えることについて言っているのです。 MsgBox関数の第一引数であるpromptについての右揃え等の表示位置の機能は 無いのです。全て左から順に表示です。TABが使えるぐらいです。 従って、後ろを揃えるには、等幅フォントを用いて全体の字数合わせるより 方法は無いのです。 「MS ゴジック」だと全角は半角の2倍幅になります。 何故、MsgBox関数に固執するのですか? 後ろをキチット揃えたい気持ちは解りますが・・・ 前に言ったようにユーザーフォームを使えば、自由自在になると思いますが、 何故ダメなのですか?  何が何でも、ゼッ~~~ッタイ MsgBoxを使って目的を達成しようとするので あれば、Win32APIを勉強されたら良いかと思います。 MsgBox関数を実行する前に、当方が最初に書いたようにシステム(OS)における 「メッセージボックス」の「フォント」の種類を取得した後に、「MS ゴジック」 等の「等幅フォント」に変更し、MsgBox を使用後に元のフォント種に戻す ということをAPIを使ってVBAで実行することだと思います。 しかし、当方の持っている安物のAPIの参考書には、該当する関数は、記載されて おりません。 出来るかどうかも解りません。 いずれにしても可也難しいです。 繰り返しますが、すんなり諦めてユーザーフォームをお使いになることを お勧めします。

shishishishi
質問者

補足

何故、MsgBox関数に固執するのか。 理由1.ユーザーの中に未だoffice95を使用している人間が少数ですが存在するのです。したがってユーザーフォームは使えません。 理由2. 私自身がoffice95でマクロを学んだためコントロールツールボックス系はよくわかっていないのです。 どうしても無理であればユーザーフォームではないですがDialogSheetを挿入して作って見ようかと考えています。 いろいろ勝手を申しすみませんでした。 ありがとうございました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.5

前にも言ったように「文字幅等間隔フォント」でないと無理ですよ。 Web上、連続スペースは、削られてしますますので代わりに、I と H が10個ずつ ですが、下記を実行してみてください。 数字10個とカンマ10個でもいいですよ。 これでもう カンマの数が違うとそれだけでも、もう右端は揃わないことが お解りでしょう。 桁数が違う金額に、桁数が同じになる分だけ数字の左側にスペースを補って テストしてみてください。 Sub test() MsgBox "IIIIIIIIII" & vbLf & "HHHHHHHHHH" End Sub

shishishishi
質問者

お礼

何度もありがとうございます。 なるほど理屈は良くわかりました。 ならば、セル内での右寄せ同様に後ろだけ揃えることは不可能でしょうか?「文字幅等間隔フォント」の設定も自分のPCだけでの設定では無意味なのです。

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

#2です。 半角の数字にしたいなら (1)a = "0123456789" を半角のテーブルに a="0123456789"に変える (2)台紙的な k = "          " '10桁に設定 を半角のスペースに変える。下記では」Space関数を使用した。 Mid(k, p, 1) = "," をMid(k, p, 1) = "," と半角に変える。 だけで 他はそのままで動くと思います。やって見てください。 幸いMid関数は、全角ばかりの時は全角で数えた文字数を、半角ばかりの文字列の場合は半角の文字数を返すようですから。 数を10桁まで対応するため If p = 7 Or p = 3 Then の7と3のところを修正しました。 Function edt(n) a = "0123456789" k = Space(15) '12桁+カンマ3桁に設定 s = n p = Len(k) For i = Val(Len(s)) To 1 Step -1 If p = Len(k) - 3 Or p = Len(k) - 7 Or p = Len(k) - 11 Then Mid(k, p, 1) = "," p = p - 1 End If q = (s Mod 10) + 1 'MsgBox Mid(a, q, 1) Mid(k, p, 1) = Mid(a, q, 1) p = p - 1 s = Int(s / 10) Next i edt = k ' MsgBox k End Function '------ Sub test01() MsgBox "*" & edt(123456788) '頭部スペースを見るため*を添えた End Sub

shishishishi
質問者

補足

ありがとうございました。 下記のようにやりましたが、数字がすべて同じ桁数ならきちんと後ろもそろうのですが、桁違いだとずれが発生しました。どこが悪いのでしょうか? Function edt(n) a = "0123456789" k = Space(15) '12桁+カンマ3桁に設定 s = n p = Len(k) For i = Val(Len(s)) To 1 Step -1 If p = Len(k) - 3 Or p = Len(k) - 7 Or p = Len(k) - 11 Then Mid(k, p, 1) = "," p = p - 1 End If q = (s Mod 10) + 1 'MsgBox Mid(a, q, 1) Mid(k, p, 1) = Mid(a, q, 1) p = p - 1 s = Int(s / 10) Next i edt = k ' MsgBox k End Function Sub test02() Dim a As Long, b As Long, c As Long a = Sheet1.Range("A1").Value b = Sheet1.Range("A2").Value d = Sheet1.Range("A3").Value MsgBox "○○○○○は" & edt(a) & "円" _ + Chr(&HD) + Chr(&HA) + "○○○○○は" & edt(b) & "円" _ + Chr(&HD) + Chr(&HA) + "○○○○○は" & edt(d) & "円", vbInformation, "確認" End Sub

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

後ろを揃えるということは、前後を揃えることになると思いますよ。 フォント種類を等間隔文字(全角が半角の2倍で、スペースも文字と同幅)にしないと キチ~ット揃えることは、出来ないと思います。 プロポーショナル等フォントはスペースと文字で字幅がそれぞれ違いますので、 右端を揃えるのは出来ないでしょう。 このようなときは、ユーザーフォームを使いましょう。 色も使えるし、配置も自由自在です。

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

(1)コメントの部分をまず揃えましょう "合計の金額は、"   7字だから "○○は、" も"○○は、   " と7字に "○○○○は、" も"○○○○は、 "と7字にする。 (2)数字を10桁に右揃えにそろえる。 右詰め、3桁ごとカンマ付きの全角文字列にします。 下記コードを参考に。 Function edt(n) a = "0123456789" k = "          " '10桁に設定 s = n p = Len(k) For i = Val(Len(s)) To 1 Step -1 If p = 7 Or p = 3 Then Mid(k, p, 1) = "," p = p - 1 End If q = (s Mod 10) + 1 'MsgBox Mid(a, q, 1) Mid(k, p, 1) = Mid(a, q, 1) p = p - 1 s = Int(s / 10) Next i edt = k ' MsgBox k End Function '------ Sub test01() MsgBox "*" & edt(12345) End Sub (1)と(2)の両者を、Msgboxの文字列の中で組み合わせてください。 夜遅いので省略で失礼。

shishishishi
質問者

補足

ありがとうございます。 全角ではなく、半角の数字でそろえたいのです。 後ろだけでもかまいません。よろしくお願いします。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

コントロールパネルの中の「画面」を開き、「デザイン」タブで、「指定する部分」を 「メッセージボックス」にして、「フォント」を「MS ゴジック」にし、[適用]、[OK] します。 これで、下記コードを実行すると前後が、キチット揃うと思います。 中間の間隔は、27の値で調整します。 これで如何でしょうか。 Sub 金額表示() Dim a As Long, b As Long, c As Long Dim x As Integer, y As Integer, z As Integer Const xm = "合計の金額は、" ' <--- 全部全角 Const ym = "○○は、" '     <--- 〃 Const zm = "○○○○は、" '  <--- 〃 a = Sheets("logic").Range("P39").Value b = Sheets("logic").Range("O46").Value c = Sheets("logic").Range("O44").Value x = 27 - LenB(xm) - LenB(StrConv(Format(c, "##,###万円"), vbFromUnicode)) y = 27 - LenB(ym) - LenB(StrConv(Format(a, "##,###万円"), vbFromUnicode)) z = 27 - LenB(zm) - LenB(StrConv(Format(b, "##,###万円"), vbFromUnicode)) MsgBox xm & String(x, " ") & Format(c, "##,###万円") & vbLf & _   ym & String(y, " ") & Format(a, "##,###万円") & vbLf & _   zm & String(z, " ") & Format(b, "##,###万円"), vbInformation, "確認" End Sub

shishishishi
質問者

補足

ありがとうございました。 これで自分のPCではちゃんと揃いましたが、他人のPCではダメですよね? 他人のPCのせっていによらず、そろえたいのです。 頭と後ろの両方をそろえられなくとも後ろだけでもかまいません。よろしくお願いします。

関連するQ&A

  • エクセル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行分も空いてしまい、かっこうが悪いのです。 改行せずに、続けて表示させようかとも思いましたが、それもあまり形がよくありません。 こんな場合、表示されてないセルの行を自動的に詰めるような方法はないのでしょうか?

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

  • エクセルVBAについて

    こんにちわ! 今、エクセルでAシートの入力した項目をBのシートへデーターが入力できるようなシステムを以下のようにくみました。 そこでBシートにデーターが入力されるのですが20行まで入力すると入力できないようにしたいのですが、なかなか上手くいきません。 A1からF20まで書式のロックを外しそれ以外のセルは保護をかけたのですがその状態でVBAを使って20行以上入力できませんという感じのエラー表示をしたいのですが、どうすればいいでしょうか? VBAは初心者ですが宜しくお願いします。 Private Sub CommandButton1_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("date").Columns(1)) + 1 Sheets("date").Cells(row, 1).Value = Range("B2").Value row = WorksheetFunction.CountA(Sheets("date").Columns(2)) + 1 Sheets("date").Cells(row, 2).Value = Range("B3").Value row = WorksheetFunction.CountA(Sheets("date").Columns(3)) + 1 Sheets("date").Cells(row, 3).Value = Range("B4").Value row = WorksheetFunction.CountA(Sheets("date").Columns(4)) + 1 Sheets("date").Cells(row, 4).Value = Range("B5").Value row = WorksheetFunction.CountA(Sheets("date").Columns(5)) + 1 Sheets("date").Cells(row, 5).Value = Range("B6").Value row = WorksheetFunction.CountA(Sheets("date").Columns(6)) + 1 Sheets("date").Cells(row, 6).Value = Range("B7").Value Sheets("統制入力").Select Range("B17").Select ActiveWindow.SmallScroll Down:=-9 Range("B3:B7").Select Selection.ClearContents Range("B1").Select End Sub

  • msgboxの表示

    A列の値とC列の値をMsgboxに表示するにはどうしたらいいのでしょうか?C列で一番高い商品とその品名A列を表示させたいのですが・・ Sub hinmei() Dim i As Long For i = 2 To Range("C65535").End(xlUp).Row Dim x As Long Dim a As Long x = Cells(i + 1, 5) If Cells(i, 5).Value < x Then a = x End If Next MsgBox a End Sub

  • エクセルVBAで保存がうまくいきません

    エクセル2000です。 下記のようなVBAを記述しました。 「はい」なら別名保存 「いいえ」なら上書き保存のつもりです。 問題点 Sheets("AAA").Range("I9")の文字列内に.(半角ピリオド)があるとファイルに拡張子がつきません。 どうしたらよいのでしょうか?非常に困っています。 Sub 保存ボタン() Dim myYN As Integer Dim DRtn As Boolean Dim fn As String, fn2 As String fn = Sheets("AAA").Range("I9").Value & "_保存" fn2 = ThisWorkbook.Name myYN = MsgBox("現在の入力内容を別名で保存しますか?" _ + Chr(&HD) + Chr(&HA) + "別名保存なら「はい」" _ + Chr(&HD) + Chr(&HA) + "上書保存なら「いいえ」を選択します。" _ + Chr(&HD) + Chr(&HA) + "", vbYesNoCancel + vbQuestion, " 別名保存") If myYN = vbCancel Then Exit Sub 'キャンセルなら終了 If myYN = vbNo Then fn = fn2 '上書保存ならファイル名はそのまま DRtn = Application.Dialogs(xlDialogSaveAs).Show(ARG1:=fn, ARG2:=1) If DRtn = False Then Exit Sub 'ファイル名を消されたらキャンセル ThisWorkbook.Save '保存 ThisWorkbook.Close '閉じる End Sub

  • Excel VBA セルの双方向同期のエラーについ

    エラーが発生して理由がわからないので、どなたか助言をお願いします。 以下のVBAにて、目的のセルにデータを入力すると、1回目は必ず添付写真の通りのエラーが出まして、デバッグをすると3行目が黄色でハイライトされます。 記述は以下の通りです。どうぞよろしくお願いします。 シートAへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("シートB").Range("$B$1").Value = Sheets("シートA").Range("$A$1").Value End If End Sub シートBへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("シートA").Range("$A$1").Value = Sheets("シートB").Range("$B$1").Value End If End Sub

  • エクセルVBAで不思議な現象が!

    エクセル2010です。 理解できない現象で困っています。 Sheets("DATA")の.Range("B1:S1")には、B1が1、C1が2というように1から18までの数値が連番に入っています。S1には18です。 以下のVBAを走らせると、普通はSheets("test")のRange("B26:S26")にも1から18までの数値が連番に入ります。 Sub TEST() Dim ws As Worksheet Dim lr As Long Set ws = ThisWorkbook.Sheets("DATA") lr = 25 With ThisWorkbook.Sheets("test") .Range("B1:S1").Offset(lr).Value = ws.Range("B1:S1").Value 'データ転記 End With End Sub ところが、このSheets("test")の20行目までデータが入っていて、オートフィルターがかかっているとします。(条件はG列の空白だけ抽出) そして、さらにC列以降のどれかの列が非表示になっていると、その非表示列以降のセルはすべて1になってしまいます! なぜ、このような不思議な結果となるのか理解できません。 やむを得ず、オートフィルタをいったん解除し、列を再表示してから転記するようにしていますが、原因がわかりません。 どなたかご教示いただけませんでしょうか?

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • EXCEL2003 VBAを表示ロック

    Sheets("DATA")にあるデータを、Sheets("Branch").Range("B2:B20")にあるコード(数字)で順に抽出します。 それをSheets("Form")を複製したシートに貼ります。 複製シートに名前をつけ、保存します。 ここまでは問題なく、以下のVBAでできました。(だいぶ省略しましたが) Sub Make_BrCopy() Dim myCl As Range With Sheets("DATA") For Each myCl In Sheets("Branch").Range("B2:B10") Sheets("Form").Copy Before:=Sheets(1) Sheets(1).Name = myCl.Value .Range("A1:G1").AutoFilter Field:=2, Criteria1:=myCl.Value .UsedRange.SpecialCells(xlCellTypeVisible).Copy Sheets(CStr(myCl.Value)).Range("A1") Sheets(CStr(myCl.Value)).Copy ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & CStr(myCl.Value) & ".xls" ActiveWindow.Close Application.DisplayAlerts = False Sheets(CStr(myCl.Value)).Delete Application.DisplayAlerts = True .ShowAllData Next myCl End With End Sub ところが、少し困ったことがあります。 Sheets("Form")には、ワークシートモジュール、Private Sub Worksheet_Change(ByVal Target As Range) があるのです。 これを複製したワークシートにそのまま必要なのでそうしてあるのですが、できることなるら、VBAを表示ロックさせたいのです。 元のファイルではVBAProjectのロックでそうしているのですが、ワークシートをコピーして作成したあらたなBOOKはVBAを表示にロックにはなっていません。 丸見えです。 どうすればよいでしょうか? Excel2003です。 また、上記のVBAコードになにかご指摘のことなどありましたらそれもあわせて教えてください。

専門家に質問してみよう