VBA SumIfについて教えてください

このQ&Aのポイント
  • A列が「犬」となっている行のB列数字を全て足してCの1行目に答えデータを入れる。
  • 上記の場合、A列が「犬」のB列数字200+130+120でC1には「450」と値が入る。
  • Sub monthResult()の中で、Worksheets関数のCellsメソッドを使ってセルの値を取得し、Application.WorksheetFunction.SumIf関数を使って計算を行っていますが、エラーが出てしまいます。
回答を見る
  • ベストアンサー

VBA SumIfについて教えてください。

【やりたいこと】 A列が「犬」となっている行のB列数字を全て足してCの1行目に答えデータを入れる。   A   B  C   犬  200   猫  100   鳥  150   犬  130   犬  120   ・   ・   ・   ・   ・   ・   ・   ・ 上記の場合、A列が「犬」のB列数字200+130+120でC1には「450」と値が入る。 以下が書いてみたものですがエラーが出てしまいます。 何がいけないのでしょうか?ご教示頂ければ幸いです。 Sub monthResult() Dim ans As String 'ユーザフォームで「犬」という値を取得    i = 2    Do Until Worksheets("データ").Cells(i, 1).Value = ""       'データという名前のシートA列のデータが無くなるまで      Worksheets("データ").Cells(1, 3).Value =       Application.WorksheetFunction.SumIf(Cells(i, 1).Value, ans, Cells(i, 2).Value)       '↑ここでエラーになります。ans(犬)の値は取得出来ています。      i = i + 1    Loop End Sub

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

  • ベストアンサー
  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.2

1です 説明がなってなくて、すみませんでした。 do loopでも条件足し算はできます。1個ずつ足すようにコードを書いたらいいです。 sumifの場合、条件を探す範囲、条件、その条件があった時足すための数字のある範囲、を指定したらよいので そしごめんなさい。あれでは動くわけないですね。 いろんな意味で、あわわなコードを書いていました。 メモ帳からコピペする時失敗したのかな・・・。 今度は動作確認済みです。 Sub monthResult() Dim ans As String Dim k As Integer k = Cells(4, 1).End(xlDown).Row 'kに最終行を代入。今は4にしています(セルA4のこと)が、空欄ではないセルをえらんでください。 ans = "犬" 'ansは検索の条件です。 Cells(1, 3).Value = Application.WorksheetFunction.SumIf(Range(Cells(1, 1), Cells(k, 1)), ans, Range(Cells(1, 12), Cells(k, 2))) '検索の範囲は自由に書き換えてください End Sub 一行に入りきっていないやつ(途中で改行されているもの)はつないでやってください。

nanacolobiyaoki
質問者

お礼

>sumifの最後の項目12ではなくて2です。 ご教示いただきましてありがとうございました!! もちろん「12」でも動きました☆ (12はどこから来た数字だろうとまだ初心者なので悩んでいた ところでしたのでとても助かりました) 最終行の値を得て代入するのですね。 新たな発見でしたので本当に勉強になりました。 この度はありがとうございました!

その他の回答 (2)

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.3

恥ずかしながら1,2です。 確認したつもりだったのに・・・。間違いがありました。 sumifの最後の項目12ではなくて2です。 12でも動きますけど、なんで12??と思われたことでしょう・・・。

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.1

do...loopではないですね。 Sub monthResult() Dim ans As String 'ユーザフォームで「犬」という値を取得 Dim k As Integer  k=Cells(4, 1).end(xldown).row       'kに最終行を代入      Worksheets("データ").Cells(1, 3).Value =       range("c1")=Application.WorksheetFunction.SumIf(range(cells(1,1),cells(k,1)), ans, range(cells(1,12),cells(k,2))        End Sub 確認してませんが、これで出ませんか?

nanacolobiyaoki
質問者

お礼

早速のご回答まことにありがとうございます。 そしてお礼が遅くなってしまい申し訳ございません。 頂きましたもので試したのですが、「コンパイルエラー 構文エラー」と 表示されてしまいます。 VBA初心者のため、どこが間違っているのか分からず・・。 どうぞよろしくお願い致します。

関連するQ&A

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • VBA 別のシートから文字列参照して全て表示

    ExcelのVBAでSheet1のA3に5文字の文字列(大文字、小文字を区別しない)を入力してSheet2のC列にあるA3の文字列から始まるデータ(10文字以上)をすべてを参照してSheet2のD列を含めSheet1のA5,B5から下にすべて表示させる。 宜しくお願い致します。 Sub macro1() Dim V2 As Variant V1 = Sheets("sheet1").Cell("A3").Value '文字列を取得 V2 = Application.InStr(Sheets("sheet2").Range("C:C"), V1) '検索するテーブルでC列の文字列を探す 'みつけたら、その行、無かったら、エラーのコードが変数に入る If IsError(V2) Then 'テーブルに無かったらなにもしない Else str0 = Worksheets("Sheet2").Cells(V2, 7).Value str1 = Worksheets("Sheet2").Cells(V2, 8).Value str2 = Worksheets("Sheet2").Cells(V2, 9).Value Worksheets("sheet1").Cells(i, 2).Value = str0 Worksheets("sheet1").Cells(i, 3).Value = str1 Worksheets("sheet1").Cells(i, 4).Value = str2 End If End Sub

  • Excel VBA グラフ作成のときのエラー

    VBA初心者です。Excel2003を使っています。 Sheet1に作りたいグラフがあります。 データは下記のとおりです。 ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。 不思議なのは、昨日は動いていたのです。 なぜ、エラーが出るようになったのかわかりません。 ご教授よろしくお願いします。 A B 1 a 1 2 2 3 3 4 4 5 5 6 b 6 7 7 8 8 9 9 10 10 11 c 11 12 12 13 13 14 14 15 15 Sub test() Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Wrow If Worksheets("sheet1").Cells(i, "A").Value = "a" Then a_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then b_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then c_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then d_data = Worksheets("sheet1").Cells(i, "A").Row End If Next Sheets("sheet1").Select Range(Cells(a_data, "B"), Cells(b_data, "B")).Select ActiveSheet.ChartObjects.Add(30, 10, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(a_data, "B"), Cells(b_data - 1, "B")), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" Sheets("sheet1").Select ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A") ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(c_data, "A") End Sub

  • Excel VBA 日付フォーマットを統一したい

    Excel VBAについてお教え下さい。Excel2010を使用しています。 A列に下記のようなデータが入っています。 20141130 20141201 B列に下記のようなデータが入っています。 2014/11/30 2014/12/01 C列にA列の値を変換して表示したいと思っています。 20141130 ⇒ 2014/11/30 20141201 ⇒ 2014/12/01 D列にB列の値を変換して表示したいと思っています。 2014/11/30 ⇒ 20141130 2014/12/01 ⇒ 20141201 下記のようなコードを書いてC列を埋めようと思いました。エラーメッセージが出て、オーバーフローしましたというメッセージでした。 For i To 100 Format(ThisWorkbook.Worksheets("データ").Cells(i, 3).Value, "yyyymmdd") Next i さらに、D列を埋めようと下記のコードを書きました。 Format(ThisWorkbook.Worksheets("データ").Range("D" & i).Value, "@@@@/@@/@@") そうしたら、2014/12/1 といったように、桁数が足りなく、「01」となりません。 質問 やりたい事はA列、B列をどちらかのフォーマットで統一したいと思っています。 どのようなコードを書けば問題は解決されるでしょうか? よろしくお願い致します。

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。

  • VBAの操作

    ↓の事を行いていのでうまくいきません。 アドバイスをお願いできませんか? 変更前(Sheet1); (A列) (B列) 1 ABC010 Data_010 2 ABC020 (同上) 'B1-B2は結合セル 3 ABC030 Data_020 4 ABC040 (同上) 'B3-B4は結合セル . . 変更後(Sheet2); (A列) (B列) 1 ABC010 "OK" 2 ABC020 "OK" 3 Data_010 "Comp" '追加行 4 ABC030 "OK" 5 ABC040 "OK" 6 Data_020 "Comp" '追加行 . . Sheet1(B列)に値があれば、 Sheet2(A列)に結合セルの単位で値をコピーする。 Sheet2(B列)には"OK"コメント その都度、必ず最後に行追加して結合セルの値、"Comp"コメントをコピーする. 現象は毎行、追加行が挿入されてしまいます。 Sub testVBA() Dim i Worksheets("Sheet1").Range("A:B").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial For i = 1 To 1000 If .Cells(i, 2) <> "" Then .Cells(i + 1, 1) = .Cells(i, 2) .Cells(i + 1, 2) = "Comp"   .Cells(i, 2) = "OK" End If Next i End With End Sub

  • VBA SUMPRODUCTについて3

    A     B     C    東京  みかん1  200 大阪  りんご3  150 愛知  いちご2  200 東京  みかん2  170 東京  いちご1  190            560(←出したい値:atai) 【やりたいこと】 A列が「東京」で、B列が「みかん」または「いちご」の文字列を含む C列の合計を出したいです。 つまり、200+170 +190 = 560 下記、書いてみたのですがatai(値が#VALUE!)になります。。 ※本来は560と出したいところです。 何が間違っているのでしょうか? --------------- Sub monthResult3() Dim ans As String ans = "東京" atai = Evaluate("SUMPRODUCT((A1:A5= """ & ans & """ )*((B1:B5 Lile ""*みかん*"")+(B1:B5 Lile ""*いちご*"")) * C1:C5)") Range("C7") = atai End Sub

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • VBAのコードについて質問です

    独学でエクセルVBAの初心者です。 定尺の鋼材から一定の長さのものが何本切り出せるかを調べるプログラムを作りたいです。 ネットで調べたところカッティングストック問題というものすごい難しいサイトに当たりましたが、 そのような難しいものではなく単純に同じ長さのものを切っていき、必要本数が取れたら次の長さを 切っていくというものを作りたいと思います(最終的に定尺何本必要か知りたい)。 まだまだ始めたばかりなのですが、do while文でorを使ったのですが反映されません。 なぜなのでしょうか? iが3になった時点で引くのを止めたいのですが止まりません教えてください。 Sub Test() Worksheets("Sheet1").Cells(1, 2).Value = 5500 Worksheets("Sheet1").Cells(2, 2).Value = 1000 Worksheets("Sheet1").Cells(3, 2).Value = Range("B1").Value Dim i i = 0 Do While Range("B3").Value > Range("B2").Value Or Range("B4").Value = 3 i = i + 1                           ↑この部分 Range("B3").Value = Range("B3").Value - Range("B2").Value Loop Worksheets("Sheet1").Cells(3, 2).Value = Range("B3").Value Worksheets("Sheet1").Cells(4, 2).Value = i End Sub

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

専門家に質問してみよう