プロが教えるわが家の防犯対策術!

VBAを学習しております。
変数への追加でつまづいており質問させていただければと思います。

C列に数値があり、selectを使用して複数の検索条件結果を集計しようとしております。
合致する項目をcells(1,1)へまとめて表示させたいのですが、うまくいきません
tempへ一度格納させているのですが、最終結果しか反映しません。
sh.cells(1,1)= temp + temp としても最後の値しか代入されませんでした。
変数への代入方法の理解が追い付いていないと思います。
どう記述したらよいでしょうか?
それともselectではこの方法は行えないのでしょうか?

============================
Sub test()

Dim a As Range
Dim j As Long
Dim last As Long
Dim sh As Worksheet

Set sh = ThisWorkbook.Worksheets("Sheet1")

last = sh.Cells(Rows.Count, "B").End(xlUp).Row - 1

For j = 1 To last

Set a = sh.Cells(j + 1, 3)

Select Case a

Case 80 To 90, 170 To 180

Set temp = a.Offset(0, -1)

msgbox temp '対象の値は検索できている
sh.cells(1,1)= temp '追加していきたい

End Select

Next j

End Sub

A 回答 (1件)

こんにちは



いろいろありそうですけれど、とりあえず直接関連する部分に関して・・・

>変数への追加でつまづいており~~
ここでいう「追加」って、該当する値を見付ける毎に逐次加算して行きたいってことですよね?

ご提示のコードの場合は、「変数」というよりはセルを利用しているようですが、追加するのに
>sh.cells(1,1)= temp
としているので、その時の検索値を代入していることになります。
(その時の値で上書きしている)

加算したいのであれば、
 sh.cells(1,1)= sh.cells(1,1).Value + temp
のように、それまでの値に足し算して行けば、最終的に合計値になると思いませんか?
セルでなくて変数に入れておくとすれば、同様に
 total = total + tmp
のようにすることで、変数に合計値を求めることが可能です。

いずれの場合も、最初に値をクリアしておくことが必要で、
ループの開始前に、
 sh.cells(1,1).Value = 0
とか、
 totla = 0
などと明示的にクリアしておく方が、間違いは少なくなるでしょう。

合計値だけを求めたいのではなく、全ての値を順に保持しておきたいというような場合は、配列に順次記憶していくとか、あるいは(変則的な方法ですが)文字列にカンマ区切りなどで記憶しておくといった方法等も考えられます。
    • good
    • 0
この回答へのお礼

fujillinさん

こんにちわ
ありがとうございます。
わかりづらい質問だったので理解していただいてありがとうございます。
その通りです。

>sh.cells(1,1)= sh.cells(1,1).Value + temp
>total = total + tmp
この方法です!

>いずれの場合も、最初に値をクリアしておくことが必要で、
>ループの開始前に、
>  sh.cells(1,1).Value = 0
>とか、
>  totla = 0
>などと明示的にクリアしておく方が、間違いは少なくなるでしょう。
この記述に見覚えがあります。そのときは理解できていませんでした。
ご丁寧に説明いただいてありがとうございます。

>合計値だけを求めたいのではなく、全ての値を順に保持しておきたいというような場合>は、配列に順次記憶していくとか、あるいは(変則的な方法ですが)文字列にカンマ区>切りなどで記憶しておくといった方法等も考えられます。
はい、ちょうど配列ということばを見かけるようになってきたので
新たに学習中です。

fujillinさんに教えて頂いたことを発展させて今後の学習や業務に活かしていきたいと思います。
ありがとうございました。

お礼日時:2017/05/24 18:31

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