こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA書き込み数値の加算?

エクセル2000のVBAにて下記のコードを書き込み
コマンドボタン1にてエクセルに入力処理後
Label8数値の加算をエクセル関数SUNを使用して
=SUM(E4:E1000)を行ったのですが、加算数値が0になってしまいます。
=E4+E5+E6・・・・だと加算した数値が表示されます。
(さすがにこれは避けたいです)
何か方法があると思いますが教えていただけますでしょうか?
Dim i As Integer
Dim k As Integer
Private Sub CommandButton1_Click()
With ActiveSheet
For k = 4 To 1000
If .Cells(k, 1) = "" Then
.Cells(k, 1) = TextBox1
.Cells(k, 2) = Label6
.Cells(k, 3) = Label7
.Cells(k, 4) = TextBox2
.Cells(k, 5) = Label8

TextBox1 = ""
Label6 = ""
TextBox2 = ""
Label7 = ""
Label8 = ""
Exit Sub
End If
Next k
End With
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Label8 = Application.WorksheetFunction.Round(Val(Label7) * Val(TextBox2), 0)
Label8 = Format(Label8, "#,##0")
End If
End Sub

投稿日時 - 2008-01-16 19:07:44

QNo.3685865

困ってます

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

ANo.1です。
>With .Cells(k, 1).Resize(, 5)
>.Value = .Value
>End With
これは、.Cells(k ,1)から右に5個分のセルに、
”各セルの値を各セルに代入している”状態です。

”数字”である事が問題だったので、”各セルの数字”を”各セルに代入”
と言う形にして、Excelに”数値に変換できる物は数値として認識”
させるための方法です。

例えば、セルA1~A5のセルに" =ROW()"と言う数式があったとして、
With Range("A1:A5")
    .Value = .Value
End With
とすると、各セルは”数式”が”行数の値”に変換されます。
一度数式を代入させてから値にしてしまう方法として、よく使ったりします。

ご参考になれば幸いです。

投稿日時 - 2008-01-25 14:01:52

お礼

何度もすみません。
わかりやすい説明ありがとうございます。
参考になりました。

投稿日時 - 2008-01-25 14:42:15

ANo.5

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

こんばんは。

今試してみましたが、セルに代入するときに、自動キャスティングが利くかと思ったのですが、やはり、キャスティングされない状態で文字列になってセルに入るようです。
>加算数値が0になってしまいます。
もちろん、配列数式で、数値化させてもよいのですが、それよりも、最初から数値にしてあげたほうがよいしょうね。

'Dim k As Integer '←モジュールレベル変数は、この場合、プロシージャ内で取ったほうが、この場合は確実だと思います。ただし、途中で、何か値が入るようなら、A1000ぐらいから、End で遡ったほうがよいかもしれません。

Private Sub CommandButton1_Click()
Dim k As Integer
  With ActiveSheet
    '最後尾の次の行を取る
    k = Range("A65536").End(xlUp).Offset(1).Row
    If k < 4 Then k = 4
    If k > 1000 Then Exit Sub
        .Cells(k, 1) = Val(TextBox1.Text)
        .Cells(k, 2) = Val(Label6.Caption)
        .Cells(k, 3) = Val(Label7.Caption)
        .Cells(k, 4) = Val(TextBox2.Text)
        .Cells(k, 5) = Val(Label8.Caption)
        
        TextBox1.Text = ""
        Label6.Caption = ""
        TextBox2.Text = ""
        Label7.Caption = ""
        Label8.Caption = ""
  End With
  'MsgBox WorksheetFunction.Sum(Range("E4:E" & k))
End Sub

投稿日時 - 2008-01-17 00:10:17

ANo.3

セルの書式が標準なら、単にプロパティをきちんと付けないからですよ!!

.Cells(k, 1).value = TextBox1.value
.Cells(k, 2).value = Label6.caption
.Cells(k, 3).value = Label7.caption



こういうプロパティは付ける癖をつけましょうね!!

投稿日時 - 2008-01-16 21:05:09

お礼

簡潔明瞭な回答ありがとうございます。
正常に計算しました。
プロパティを付ける癖をつけます。

投稿日時 - 2008-01-25 13:13:43

ANo.2

セルの中身が文字列になっているためだと思います
sum関数では文字列は計算してくれません
(=E4+E5+E6・・・の場合は、自動で変換される)
.Cells(k, 1) = val(TextBox1) としてみてください

投稿日時 - 2008-01-16 20:26:52

ANo.1

>.Cells(k, 5) = Label8
>
>TextBox1 = ""

.Cells(k, 5) = Label8
With .Cells(k, 1).Resize(, 5)
.Value = .Value
End With
TextBox1 = ""

3行追加してみては?
*セルには数値ではなく数字(文字列)として入っているので、
SUM関数が使えないのだと思いますよ。

投稿日時 - 2008-01-16 20:25:36

お礼

計算、正常に処理できました。
何度もすみません、教えていただきたいのですが
>With .Cells(k, 1).Resize(, 5)
>.Value = .Value
>End With
文字列を数値に置き換えているようなのですが
上記3行はどのような意味の処理を行っているのでしょうか?

投稿日時 - 2008-01-25 13:17:44

あなたにオススメの質問