• ベストアンサー

ExcelVBA 変数について

ExcelでD列が500以上のデータの合計をセルD21に表示するプロシージャを作成する場合、 Sub Test3_4_2() Dim i, total '合計用変数total For i = 2 To 19 If Cells(i, 4) >= 500 Then total = total + Cells(i, 4) End If Next Range("D21") = total End Sub 上記の変数Totalの使い方で、total=total+cells(i,4)の部分の意味が 分かりません。 お分かりになられる方がいらっしゃいましたら、ご教示願います。

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

プログラムのコードは、数学の式と似ていますが、意味合いが違います。 「=」は等号ではなく、右辺の計算結果を、左辺の変数(=記憶場所)に代入しなさいという意味です。 なので total = total + Cells(i, 4) は total(=それまでの値)に Cells(i,4) の値を足したものを、改めて total に代入することを意味しています。 間単に言えば、totalに Cell(i,4)を加算しろということだけど、こういう書き方をすることになっています。  temp = total + Cells(i, 4)  total = temp の2行を1行にまとめたと思えば、わかりやすいかも ということで、totalにD2、D3・・・と順に加算してゆくので、合計が求められるという仕組み。

yukki117
質問者

お礼

とても良くわかりました。 ありがとうございました。

その他の回答 (4)

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.5

No.4です。 まだ締め切られていないようなので補足を。 VBAって Visual BASIC for Application というらしいですが、BASICというプログラミング言語で「代入」は、本来 LET total = total + Cells(i, 4) のように LET文で行うものだったとのことです。 マイクロソフトやその他でLET文のLETを省略できるように製品としてのBASIC言語の仕様を変えてしまったことが、代入とイコールが原因のようですね。 なお、VBAでもLET文は使えます。

yukki117
質問者

お礼

お礼が遅くなりましてすみません。 良く分かりました。ありがとうございました。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.4

そうそう、この場合の「=」記号は、イコール(等しい)じゃなくて「代入」と考えて下さいね。 Pascal言語だとイコールは「=」、代入は「:=」と明示的に替えているけど、大多数の言語は、判断ならイコール、変数に繋ぐときは代入と意味を使い分けます。

yukki117
質問者

お礼

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

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.2

こんにちは cells(i,4)  i は、行アドレス、4は、列アドレス(=D)でセルの内容です。  で、FOR文で iが変わるごとにD列の2行目から19行目までの内容をtotalに足しこんでいきます。 For i = 2 To 19  If Cells(i, 4) >= 500 Then   total = total + Cells(i, 4)  End If Next

yukki117
質問者

お礼

良くわかりました。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

total の値に Cells(i, 4) の値を足した値を、total に入れると言う意味です。 tmp = tmp + 1 など、普通に使われる記述方法です。

yukki117
質問者

お礼

ご回答ありがとうございました。 変数の意味がわかりました。

関連するQ&A

  • ExcelVBAの変数を使うコツ

    matyuといいます。よろしくお願い致します。 基本的な部分の質問です。 VBAでプログラムを考える際に変数を使うタイミングは非常に多いと思いますが、 どういうタイミングでどういう部分を変数として扱えばいいか分からなくて困っています。 添付したファイルのような問題があったとします。 この問題では、日給の部分を"kyuyo"として宣言していますが、 私が考えると曜日も平日と休日で変化するし、時給も1000円と1200円、勤務時間も何が入るか分からないな・・・となってしまい、いくつもいくつも変数にしようとして結果答えと違ってしまいます。 どこに着目して必要最小限の変数宣言ですっきりしたプロシージャーを書くようにしたらよいのでしょうか? 私が考えるに、最終的に導きだされなくてはならないのは"日給(kyuyo)"だからという考え方でいいのでしょうか 【問題】 セル【C16】に曜日として「平日」「休日」を、【D16】に勤務時間を入力してプロシージャを実行すると、日給をセル【E16】に表示する「練習1」プロシージャを作成しましょう。 また、勤務時間が空欄の場合はセル【E16】に「休み」と表示されるようにします。 【この問題の回答】 Sub 練習1() Dim kyuyo As Currency If Range("D16").Value = "" Then Range("E16").Value = "休み" Else If Range("C16").Value = "平日" Then kyuyo = 1000 * Range("D16").Value Range("E16").Value = kyuyo ElseIf Range("C16").Value = "休日" Then kyuyo = 1200 * Range("D16").Value Range("E16").Value = kyuyo End If End If End Sub

  • VBAの変数の定義について

    いつもお世話になっております。 VBAでの変数の定義についてお尋ねします。 VBAの勉強を始めたばかりの超初心者です。 I.チェック:A列とC列の和をE列に記載してその正誤を判定。 II.リセット:E列をクリアし、A列、C列の数字をランダムに置き換える。 という練習問題のコードを私が書いたものです。 以下について質問させていただきます。 (1)下記はモジュールレベルでの変数の宣言になると思いますが、変数の定義?例えば、最終値 = Range("A4").End(xlDown).Rowはそれぞれのプロシージャで定義しなければならないのでしょうか? (2)モジュールレベルでの変数の宣言は,Dimではなく、Privateでやるべきなのでしょうか? (3)何か指摘事項があれば、教えてください。 超初歩的な質問で、申し訳ありませんが、よろしくお願いいたします。 Option Explicit Dim i As Integer '処理用カウンタ変数 Const 初期値 As Integer = 4 '表の最初 行 Dim 最終値 As Integer '表の最終 行 Sub チェック() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 If Cells(i, 1).Value + Cells(i, 3).Value = Cells(i, 5).Value Then 'A列+B列 Cells(i, 5).Font.Color = vbBlue '回答が正ならフォントを青 Else Cells(i, 5).Font.Color = vbRed '回答が誤ならフォントを赤 End If Next i End Sub Sub リセット() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 Cells(i, 5).ClearContents '回答をクリア Cells(i, 5).Font.Color = vbBlack '回答のフォントを黒 Cells(i, 1).Value = Int(Rnd * 100) 'A列にランダムな数値 Cells(i, 3).Value = Int(Rnd * 100) 'C列にランダムな数値 Next i End Sub

  • エクセルマクロの部分比較について

    こんばんわ! エクセルマクロのLike演算子を使用した部分比較をしようとしたのですが下記のtes1は動いたのですが、tes2が動きません。 動くマクロ Sub tes1() For i = 5 To 20 Step 1  If Cells(i, 1) Like "*" & Range("b1") & "*" Then   Cells(i, 3) = 1  End If Next i End Sub 動かないマクロ Sub tes2() Dim name As String name = Range("b1") For i = 5 To 20 Step 1 If name Like "*" & Cells(i, 1) & "*" Then Cells(i, 3) = 1 End If Next i End Sub まだ、理解が足りていないところが多く、動かない理由が分からないですが、よろしければ、説明を兼ねてアドバイスのほどよろしくお願いいたします。

  • vba 四捨五入 について教えてください。

    VBA初心者です。お世話になりますがよろしくお願いします。 vbaでRound関数を使って四捨五入したいと考えております。 以下のコードで実行するとエラー(プロシージャの呼び出し,または引数が不正です。)が出ます。 何がなんだかわからずに困っております。 どうかご教授よろしくお願いします。 Sub 計算() Worksheets("abc").Activate Dim LastRow As Long Dim i As Integer LastRow = Worksheets("abc").Range("K65536").End(xlUp).Row For i = 6 To LastRow If Cells(i, 11) = 0 Then Cells(i, 12) = "" Else Cells(i, 12) = Round(Cells(i, 9) / Cells(i, 11),-2) End If Next End Sub

  • 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

  • 【Excelマクロ】もっと頭の良い書き方って無いかな?

    5行空白列があったらそこで処理を終わりたいんですが、もっといい書き方はないでしょうか? 下記が私の考えた頭の悪いやり方です。 Sub macro() Dim i As Integer For i = 1 To 1000 If Cells(i, 1) = "" Then  If Cells(i + 1, 1) = "" Then   If Cells(i + 2, 1) = "" Then    If Cells(i + 3, 1) = "" Then     If Cells(i + 4, 1) = "" Then      If Cells(i + 5, 1) = "" Then       MsgBox (i - 1 & "行目で終わりです")       Exit For      End If     End If    End If   End If  End If End If Next End Sub

  • エクセルVBAラベルの変数?

    エクセル2000VBAにて下記のように作成しました。 With ActiveSheet For i = 4 To 200 If Label1.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label6.Caption = .Cells(idx, h) Label7.Caption = .Cells(idx + 2, h) GoTo ラベル2 End If Next idx End If Next h End If Next i ラベル2: For i = 4 To 200 If Label2.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label8.Caption = .Cells(idx, h) Label9.Caption = .Cells(idx + 2, h) GoTo ラベル3 End If Next idx End If Next h End If Next i ラベル3: ・・・ End With Label1~5まで同じ処理を行うため 1~5まで変数を使用して簡単にしたいのですが Label(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • エクセル マクロで行削除のコードについての質問です

    ある指定のセル範囲が空白ならその行自体を削除したいですが 上手くいきません。 記述したコードは以下の通りです。 Sub A01() Dim IRow As Long Dim d As Variant, i As Variant d = InputBox("抽出する日数を入力してください", "日数") If d = "" Then Exit Sub lRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lRow To 2 Step -1 If ActiveSheet.Range(Cells(i, 5), Cells(i, d)) = Empty Then ActiveSheet.Rows(i).EntireRow.Delete End If Next End Sub Ifの判定の部分でエラーが出ます。 どう修正したらよいかご教示願います。

  • マクロエラー処理

    下記のマクロを実行すると、If (.Range のところでコンパイルエラー参照が不正または不完全です。というメッセージが出るのですが、どこを修正すればよいのでしょうか 教えてください。 Sub 再表示1() Dim SheetName As String Dim i As Integer Dim LastRow As Integer Dim rng As Range LastRow = 3000 '最終行の番号 Sheets("ACT").Select For i = 6 To LastRow If (.Range("D" & i) = "A310" Or .Range("D" & i) = "A505") And .Range("V" & i) < 0 Then .Cells(i, "W").Resize(1, 3).ClearContents End If Next Stop End With End Sub

  • ExcelのAutoFilter への変数の使用がうまく行きません!

    ExcelのAutoFilter への変数の使用がうまく行きません! Windows XP Home Edition SP3 Office XP Personal 2002 Excel 2002 下記の NNN に 「 InputBox に 入力した整数 」 を変数で使用したいのですが、 どのようにすればよろしいでしょうか? 何卒、ご教示のほどをお願い致します。 Sub TEST1() Dim NNN As Integer Dim msg As String Dim i As Integer Application.ScreenUpdating = False   msg = "【整数】 を入力してください。"   NNN = InputBox(msg)   If ActiveSheet.AutoFilterMode Then    With ActiveSheet.AutoFilter    For i = 88 To 90    .Range.Rows(1).Cells(i).AutoFilter Field:=i, Criteria1:="<=NNN" '←この NNN です    Next i   End With   End If Application.ScreenUpdating = True End Sub