• ベストアンサー

FORMAT関数で値が変わる

こんにちは、 Win98でExcel2000のVBAを使用してマクロを組んでいるのですが、FORMAT関数を使っている部分で予想外の結果がでています。 以下、プログラムです。 Private Sub Test() Dim AAA as String AAA = "6P" AAA = FORMAT(AAA,"000") MsgBox AAA End Sub MsgBoxの表示が"06P"になるはずだと思っていたのですが、 なぜが"001"になってしまいます。 他の質問などを見てみると"E"や"D"などでも表示が変わるというものを見ました。"P"も同じようなものなのでしょうか、また"06P"と表示させるにはどうしたらよいでしょうか? どなたかご存知の方がいらっしゃったっらご回答お願い致します。

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

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

私の今までの理解では"000"、"###"、"##0"などの#0は 数字を拾うものと思ってます。 ですから数字・文字混在した場合は混乱します。 Private Sub Test() Dim AAA As String AAA = "6P" AAA = Format(AAA, "@") MsgBox AAA End Sub はいかがですか。 「06P」にするには、数字部分と文字部分を分けて 数字部分のみ「00」(2桁)書式適用しないといけない ようです。 001になる理由は良く判りません。 Private Sub Test() Dim AAA As String For i = 65 To 90 AAA = "6" & Chr(i) AAA = Format(AAA, "000") Cells(i - 64, "A") = AAA Next i End Sub を実行するとAとPが0と1になった。 AM,PMと関係あるのかな。 Private Sub Test() Dim AAA As String For i = 97 To 122 AAA = "6" & Chr(i) AAA = Format(AAA, "000") Cells(i - 96, "A") = AAA Next i End Sub でもaとpが大文字と同様でした。

miyaxyz2002
質問者

お礼

ご回答ありがとうございます。 'A','P'というのは時刻に関する書式設定みたいですね。 ご回答のように数値部分と文字列部分を分けて処理してみようと思います。 詳しく調べていただいてありがとうございます。参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

FORMATは数値や日付の書式設定関数なので、 文字列は正しく書式設定出来ないと思います。 単に、ゼロ詰めするだけなら、次の通りでいかがでしょうか? ---------------------- Private Sub Test() '文字 "0" Const STR_ZERO_CHAR As String = "0" '書式設定後文字列の長さ Const LNG_STR_LENGTH As Long = 3 Dim strInput As String Dim strOutput As String strInput = "6p" strOutput = String$(LNG_STR_LENGTH - Len(strInput), STR_ZERO_CHAR) & strInput Call MsgBox(strOutput) End Sub

miyaxyz2002
質問者

お礼

ご回答ありがとうございます。 FORMAT関数を使って処理することばかり頭にあったのですが、ご回答のように数値部分と文字列部分を分けて処理してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

6P というのは PM 6 時の意味でしょうか? そうでなくて、英字の部分は D や E がありえるということでしたら、数字の部分と最後の英字とを分解して AAA = "6P" NNN = Left(AAA, Len(AAA) - 1) LLL = Right(AAA, 1) MsgBox Format(NNN, "00") & LLL のようにでもすればいいと思います。 6P とか 1A のように 時刻を表すものという意味でしたら、 AAA = "6P" AAA = Format(AAA, "hhA/P") MsgBox AAA のようにすればよいと思います。

miyaxyz2002
質問者

お礼

ご回答ありがとうございます。 >6P というのは PM 6 時の意味でしょうか? いいえ、"6P"は"-67"をホスト形式用に変換した値です。 値が0より小さかったら一桁目を'J'~'R','}'('1'~'9','0'に対応)に変換して-の値を表すという処理をやっています。 'P'以外の値のときは問題なく処理出来ていたので、何故'P'の時だけ?という感じでしたが、'P'というのは時刻に関する書式設定なんですね。 ご回答のように数値部分と文字列部分を分けて処理してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAについて質問させて下さい。

    VBAについて質問させて下さい。 Sub Exsample() Dim a As String a = "aaa" MsgBox Ketugou(a) End Sub Function Ketugou(x As String) Ketugou = x End Function このサンプルコードについて質問が2つあります。 【質問1】 なぜ x=a、 と言う式はないのに xにが代入されるのでしょうか? 【質問2】 なぜ MsgBox Ketugou(a) では aaa(aaa) とならないのでしょうか? a = "aaa" Ketugou= "aaa" になってるはずですが。 よろしくお願い致します。

  • 二つの違い・どちらを使った方がいいでしょうか?

    Sub test1() Dim a As String a = MsgBox("aaa") End Sub Sub test2() MsgBox "aaa" End Sub どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。

  • vb.net変数に入れた文字列でメソッドを実行する

    こんにちわ!! Vb.netで文字列を格納した変数を使ってメソッドを呼び出したいのですが、可能でしょうか? サンプル 'メインルーチン public sub test() Dim aaa as string ="testfunction" Dim num as integer=0 '↓の様にメソッドを呼び出したい Dim bbb = aaa(num) Msgbox(bbb ,vbinformation) aaa="testfunction2" bbb=aaa(num) Msgbox(bbb,vbinformation) Endsub 'メソッド1 Private function testfunction1(num) Return num+1 End function 'メソッド2 Private function testfunction2(num) Return num+2 End function 上記はあくまでサンプルです。 実際はメソッド数が多く、aaaにいれる名前も別で取得するので、stringになります。 ですので、bbb=aaaはforで回します。 このようなことは可能でしょうか? やりかたもしくは解決方法があればお願いします。

  • VBAでFormat がうまく使えない

    たびたびお世話になっています。 今回はVBAでの基本的な関数であろうFormat関数について質問させて頂きます。 現在 WindowsME / EXCEL2002 でマクロ・VBAを使用した日報を製作しています。 その中で、設定欄で入力した日付をソース内でFormat関数で形式を変えて表示させようとしているのですが、EXCEL97の環境に持っていくとエラーが出て使用できません。 EXCEL97で使えないのかと思いましたが、同じ環境(同じPC・同じEXCEL)で新規ファイルを作成し、同じ表記をすると普通にFormat関数が使用できます。 これはいったい何がまずくてエラーが出てしまうのでしょうか。 一応ソースは以下の通りです。 Private Sub cmd_run_Click() Dim strMonth As String Dim intOkCancel As Integer '' 処理実行確認 strMonth = Worksheets("設定").Range("C12").Value strMonth = Format(strMonth, "yyyy年m月") intOkCancel = MsgBox(strMonth & "の日報集計を開始します。よろしいですか?", vbOKCancel, "集計開始") If intOkCancel = vbCancel Then MsgBox "集計を中止します", vbOKOnly, "集計中止" Exit Do End If ''集計 Call S_Run End Sub 出るエラーは「コンパイルエラー:プロジェクトまたはライブラリが見つかりません」です。 簡単なことなのかも知れませんが、これでは他の方に使って頂けなくて困っています。 お知恵をお貸し下さい。

  • VBAでワイルドカードを使った文字列検索

    初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub

  • 参照渡し(ByRef)

    参照渡しについてわからないのですが Option Explicit Dim buf As String Sub Sample1() buf = "aaa" Call Sample2("bbb") MsgBox buf End Sub Sub Sample2(ByRef a As String) a = "ccc" End Sub を実行すると、msgboxには、aaaが表示されますが、 途中のbbb,cccはどんな意味があるのでしょうか? また、 Sub Sample2(ByRef a As String) を Sub Sample2(a As String) にしてもコードは問題なく動きますが、 ByRefは役に立ってるのですか?

  • これは参照渡し・値渡ししてる事になりますか?

    Dim a As String Sub マクロ1() a = "test" Call マクロ2 a = Empty End Sub Sub マクロ2() MsgBox a End Sub これは参照渡し・値渡ししてる事になりますか? ByRefやByValを使わない限り、 参照渡しまたは値渡ししてるとは言えないのでしょうか? ご回答よろしくお願いします。

  • Replace関数について

    Sub macro1() Dim str As String str = "abc" str = Replace(str, "c", "a") MsgBox str End Sub このマクロを実行した時に、問題なく動くのですが なぜReplaceは関数なのに、 WorksheetFunction.がいらないのでしょうか? しかも Sub macro2() Dim str As String str = "abc" str = WorksheetFunction.Replace(str, "c", "a") MsgBox str End Sub にすると、エラーになります。 macro1のReplaceは、関数ではないのでしょうか? メソッドやステートメントですか?

  • InStrRev関数とLeft関数とRight関数の組み合わせについて教えてください。

    ワード2002で作成した技術文書について、 (1)(和文字+英数字)の文字列を任意に指定して、 (2)最初に文字数xを求め、 (3)次にInStrRev関数で英数字の1つ前の和文字について、文字列の初めからの数nを求める、 (4)Left関数で和文字を取り出す、(Msgboxに和文字を表示) (5)Right関数で英数字を取り出す、(Msgboxに英数字を表示) というマクロを作りたいのですが、 下記のマクロで足りないところを教えてください。 宜しくお願いします。 Private Sub YougoFugouBetunuki () Dim myText As String Dim x As Integer Dim Yougo As String Dim Fugou As String myText = Selection.Range.Text x = Selection.Characters.Count Fugou = "0-9A-Za-z’" n = InStrRev(myText, Fugou) Yougo = Left(myText, n) Fugou = Right(myText, x-n) End Sub

  • 変数の宣言(s As String)で良い理由

    vbaについてしつもんです。 標準モジュールで Option Explicit Dim s As String Sub test1() Call test2("qqq") End Sub Sub test2(s As String) MsgBox s End Sub としたのですが、もしかしてDim s As Stringって必要ないのでしょうか? あってもなくても動きます。 (s As String)があるからDim s As Stringは不要なのですか? だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

このQ&Aのポイント
  • ブラザー製品MFC-J6983CDWでの印刷がかすれる問題について相談します。
  • クリーニングしても印刷がかすれるケースが多く、特に細かい文字を含む印刷では問題が顕著になります。
  • クリーニングを繰り返しても改善しないため、インク代の負担が増えて困っています。
回答を見る

専門家に質問してみよう