10秒目をつむったら…

VBA初心者です。
エクセルVBAユーザーフォームのテキストボックスに入力した数字を通貨単位でセルに反映させるにはどうすれば良いのですか?

Private Sub 一月OK_Click()
Range("J10") = Me.一月売上
Range("J13") = Me.一月粗利
Unload Me
End Sub

今はこんな感じです。
ここで月度の売上を入力してシート上で合計させたいのです。
よろしくお願いします。

A 回答 (7件)

こんにちは、Wendy02です。



>Range("J10,J13,").NumberFormatLocal = "\#,##0;\-#,##0"
>[ここでテキストボックスの値を数値にして代入するよう指示しているという解釈でよいのでしょうか?]

そういうことではありませんね。単に書式だけのものです。つまり、テキストボックスの値自体は、何も加工されていません。セルに対しての代入というのは、セル側が、自動キャストといって、セルを文字列書式にしていない限りは、仮に、VBAの代入値が、数値型であろうとも、文字型であろうとも、自動的に数値に変換されます。

>Range("J10") = Me.一月売上 → これが駄目だったという解釈でよいのでしょうか?

それ自体が駄目だったとは思いません。
TextBox は、標準で、String型になっておりますからね。だから、それを正しくセル側で変換できる数字になっていれば、問題はありません。

私は、テキストボックスの値に関しては、変数を数値型に宣言するよりも、テキストボックスそのもののプロパティを、たとえば、[IMEMode] 3 - fmIMEModeDisableにしておいて、
数値を入れたほうがよいと思っています。

そして、以下のようなエラー処理を施せば万全です
これは、テキストボックスの「入力規則」で、数値しか入れられません。その上で、万が一に備えて、Clng()で変換すればよいと思っています。

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
 MsgBox "数値を入れてください。", vbInformation
End If
End Sub

あとは、Val(), Clng() をヘルプで確認してみてください。
その関数の使い分けが、わかるはずです。その用途に合わせて、使ってください。ただし、小数点が含まれるときは、私のほうは、CDbl()になります。
    • good
    • 0
この回答へのお礼

詳しく解説していただき、ありがとうございます。
まだ内容理解を簡単に出来る状況ではありませんが、大変参考になります。
ありがとうございました。

お礼日時:2005/06/27 11:09

長い回答が沢山出ていて、あるいは、既述であればすみません。


(1)通貨単位で反映させる
これはエクセルシートのセルの書式で対応するで、済ませられます。
その書式の設定は普通人手による設定で済ませますが、VBAでもできて
NumberFormatプロパティの設定です。
(2)テキストボックスの表示データも、通貨表示にしたいなら、VBAでFormat関数を使って、人間が入力したデータに、上書きする必要がありますがそこまでやりますか。
TextBox1.TextAlign = fmTextAlignRight
TextBox1.Text = Format(TextBox1.Text, "#,##0")
やTextBox1.Text = Format(TextBox1.Text, "\\#,##0")
(3)売上を入力してシート上で合計させたいのです
これはエクセルのセルの値の合計機能(合計を出す関数を設定)ですむことでテキストボックス入力と関係なくできます。
合計行が毎回決まらないなどの特徴があればVBAで処理せざるを得ませんが。
もちろん、テキストボックスに入力された値を合計して、最後に所定のセルに通貨書式でセットもできます。
通貨の合計も値の合計も普通は同じ機能ですむはずですが何かありますか

(4)テキストボックスに入れたら、セルにセットするという方式が普通では。フォームのクリックでシートに一斉に値をセットする質問の方式はどうかと思う。
フォームのテキストボックスに入れた数字・文字をA列に従順にセルに
セットする。
------行数を保持するパブリック変数
標準モジュールがいでモジュール外で
Public i
-----テキストボックスでEnterを押したときのイベント
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
If TextBox1.Text = "999" Then
UserForm1.Hide
Exit Sub
End If
Worksheets("Sheet1").Cells(i, "a") = TextBox1.Text
TextBox1.Text = ""
i = i + 1
End If
End Sub
-----初期行をセット
Private Sub UserForm_Activate()
i = 1
End Sub
これはフォームを消すことができず、うまくいってないかもしれないが、参考にしてください。
    • good
    • 0
この回答へのお礼

大変参考になります。
今現在問題は解決しておりますが、

>(1)通貨単位で反映させる
これはエクセルシートのセルの書式で対応するで、済ませられます。

これは、セルの書式が通貨単位で設定されているところへ代入した場合に有効なのか、代入してからセルに書式設定を行わなければならないのかがわかりません。
(元々、セルの書式は通貨にしていたのですが、そこへテキストボックスから値を代入すると文字列になってしまっていました。)
ご回答有難うございました。

お礼日時:2005/06/27 11:16

#2 のWendy02です。



私のコードに関して、書式を変更したあとに、数値(.Textでも.Valueでも)を代入しても、書式が変更されるということはありえません。自動キャストは、日付や時間に限ります。

ふつう、VBAから、セルに数字を入れれば、それが、String型であろうが、Variant型であろうが関係ありません。書式設定されてなくても、キャストされますから、数値になります。数字の前に、何か文字列を入っていれば、文字列になります。

たぶん、最初に、テキストボックスの数字に、「\」を入れているわけですね。
テキストボックスへの書式設定はありません。

Private Sub 一月OK_Click()
'セルがすでに、書式設定されているなら、
Range("J10").Value = Clng(Me.一月売上.Value)
Range("J13").Value = Clng(Me.一月粗利.Value)
Unload Me
End Sub

それから、なるべく、値を渡すときは、TextBox も、Rangeもプロパティ(.Value等)をつけたほうがよいです。

この回答への補足

ご回答感謝します。
素人ですみません。とりあえず下記の形(先ほどのは同じものの繰り返しは省略していました。)で数値での代入はなったのですが、理屈がちょっとわかってないので宜しければ噛み砕いていただいても良いでしょうか?

Range("J10,J13,").NumberFormatLocal = "\#,##0;\-#,##0"
[ここでテキストボックスの値を数値にして代入するよう指示しているという解釈でよいのでしょうか?]

それから、テキストボックスに入力する際(最初の形だったときですが)¥を入れてはいませんでした。コードを教えていただきいたのですが、文字列でした。ということは
Range("J10") = Me.一月売上 → これが駄目だったという解釈でよいのでしょうか?

補足日時:2005/06/25 13:54
    • good
    • 0
この回答へのお礼

再度のご回答すみません。
VBAでもいろんなやり方があるのですね、もっと勉強します。
有難う御座いました。

お礼日時:2005/06/25 14:10

Private Sub 一月OK_Click()


 Range("J10,J13").NumberFormatLocal = "\#,##0;\-#,##0"
 Range("J10").Value = Val(Me.一月売上)
 Range("J13").Value = Val(Me.一月粗利)
 Unload Me
End Sub

のようにするとか。
    • good
    • 0
この回答へのお礼

出来ました。
有難う御座いました。
初歩的なことなんでしょうけど大変為になりました。

お礼日時:2005/06/25 13:21

>フォームで値を代入すると文字列になっちゃうんです。



解りました。
>Range("J10") = Me.一月売上
では、先に指定した
>Range("J10,J13").NumberFormatLocal = "\#,##0;\-#,##0"
の設定が変更されてしまうようですね。
これを、代入が完了した後に実行するようにすると問題ないでしょう。
VBAで書式設定しない場合は、代入する値を明示する必要があるようですね。


Range("J10") = Me.一月売上.Value
とか
Range("J10") = Me.一月売上.Text
としてください。
また、
Dim TMP As Long
TMP = Me.一月売上
Range("J10") = TMP
のように、変数に格納してからセルに代入すると、書式に影響しません。


別件の
>合計させる数値(売上等)の入力箇所が点在

値が入ったセルや合計欄が固定しているのなら、シートのSUM関数がVBAから利用できます。

Range("J14") = Application.WorksheetFunction.Sum(Range("J12", "J13"))

入力フォームで集計するなら、
dim 売上合計
with Me.
売上合計 = .一月売上 + .二月売上・・・
end with

Range("A1")=売上合計
    • good
    • 0
この回答へのお礼

出来ました。
有難う御座いました。
ちなみにテキストボックスでの¥書式は出来ないのでしょうか?

お礼日時:2005/06/25 13:19

>VBAで書式設定するにはどうすれば良いのですか?



Private Sub 一月OK_Click()
Range("J10,J13").NumberFormatLocal = "\#,##0;\-#,##0"
Range("J10").Value = Me.一月売上
Range("J13").Value = Me.一月粗利
Unload Me
End Sub

ということかな?
でも、最初に、シート側に書式設定しておいたほうが早いですね。(^^;
    • good
    • 0
この回答へのお礼

ご回答感謝します。
シート側は書式設定で通貨にしてあります。ですが、フォームで値を代入すると文字列になっちゃうんです。

お礼日時:2005/06/25 11:42

>通貨単位でセルに反映させるにはどうすれば



とは、セルに \2,000 とか 2,000円 とか表示させるのですか?
その場合は、セルに書式設定をするかVBAで書式設定を行ってください。

>月度の売上を入力してシート上で合計

合計欄に =SUM() で式を入れるとか、VBAで合計を計算する方法があります。

具体的な方法を記載してもらう方が回答を得られやすいですよ。
    • good
    • 0
この回答へのお礼

ご回答感謝します。
はい、¥で表示させたいのですが、テキストボックスで入力した値を数値としてシートに書き込むためのコードがわからないのです。
VBAで書式設定するにはどうすれば良いのですか?

売上を管理するテンプレートがあり、それは完成しているのですが、合計させる数値(売上等)の入力箇所が点在しているので、その数値の入力をユーザーフォームでまとめて入力したいのです。

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

お礼日時:2005/06/25 11:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報