エクセルVBAマクロで条件付き合計の方法

このQ&Aのポイント
  • エクセルVBAマクロを使用して、条件付き合計を行う方法を教えてください。
  • 特定の列(B列)にある特定の値(a銀行)に基づいて、別の列(E列)の値を合計する方法を知りたいです。
  • セルの位置が変動しても、合計範囲を自動的に調整する方法があれば教えてください。
回答を見る
  • ベストアンサー

エクセルVBAマクロで条件付き合計の方法

Bに銀行名 a銀行 b銀行・・・ E F G H I Jにデータ末尾変動の数値(金額)が記入されており、 For i% = 1 To 6 adr2$ = Range("e7").Cells(1, i%).Address Range(adr2$).Cells(DatNum + 3, 1).Formula = "=SUMIF(B7:B1000,""a銀行"",E7:E1000)" と記入してa銀行の合計金額を記入しています。 しかし、上記記述ではEからセルが横に移動しても全てE7:E1000の合計となり意味がありません。 そこで、eのデータ末尾+3にE7~データ末尾      fのデータ末尾+3にF7~データ末尾 以下順番にforの条件が完了するまで としたいのですが、どのように書き換えればよろしいでしょうか。 逐一対応セルに標記するようにマクロを記述する方法もあるとはおもいますが、簡潔にできるのではないかと思い質問させて頂きました。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

はて……???? >データ末尾=各列最終行ではございません。 >値が入力されているセルの一番下ということです。 回答2のマクロは「値が入力されているセルの一番下」の+3行に数式を記入するよう,作成してありますが,いったいどういうことでしょうか。 回答2のマクロを実際に動かして,いったい「どのように違っている」(具体的に。今のアナタのエクセルで回答のマクロを動かしたら,ここの番地にこういう数式が入ったけど,これこれの理由でここの番地にこういう内容で数式が入って欲しい,と)のか,キチンと教えてください。 そもそも。 >各列毎に設定する方法ではなく、まとめて設定できないものかと思い質問させて頂いております。 いまE列はE80までデータが記入されていて,E83に数式を入れたい いまF列はF103までデータが記入されていて,F106に数式を入れたい  : いまJ列はJ345までデータが記入されていて,J348に数式を入れたい それらのE83,F106…J348に,まとめて数式を入れたい,とそういう事を言ってるように見えますが,そういう事でしょうか? やれば勿論出来ますが,なんとも無意味なコダワリにしか思えません。 それとも? アナタの用意した正体不明のdatnumの値(仮に423とか)を信頼して,E列:J列の実際のデータの入り具合はもう見る必要は無くて,datnum+3行に(たとえばE426:J426に)まとめて一斉に数式を記入したいと言いたいのでしょうか。 こちらも実際に試してください: sub macro2()  dim datnum ’アナタが用意したdatnumの値の取得をここに書き写す  cells(datnum, "E").resize(1, 6).formular1c1 = "=SUMIF(R7C2:R[-3]C2,""a銀行"",R7C:R[-3]C)" end sub 回答1然り,回答2も同じですが,それぞれ回答で寄せられたマクロを実際に試してから「アナタが書いてくれたマクロを実際に動かしてみたら,ここが違うのでこうしたい」という具合に,もうちょっとキャッチボールしてみるのもいいんじゃないでしょうか?

quindecillion
質問者

お礼

質問の仕方、返答の仕方につきまして失礼を重ね申し訳ございません。 No.2のマクロを実行したところ、確かに最終行+3ではあるのですが 合計 a銀行 b銀行 と既にマクロにて先に標記していますので、その更に3列下に表示され、 合計 a銀行 b銀行 1列目 2列目 3列目 合計値 合計値・・・ という形になってしまい、希望とは違うものだと判断をしてしまっておりました。 この度のご指摘を受けた後+3の数値を+1や+2に変えて銀行名を変更していけば対応できることに気がつき、現在は希望に添った形になっております。 For c = 5 To 10 r = Cells(65536, c).End(xlUp).Row If r >= 7 Then Cells(r + 1, c).FormulaR1C1 = "=SUMIF(R7C2:R[-3]C2,""a銀行"",R7C:R[-3]C)" End If Next c For c = 5 To 10 r = Cells(65536, c).End(xlUp).Row If r >= 7 Then Cells(r + 1, c).FormulaR1C1 = "=SUMIF(R7C2:R[-3]C2,""b銀行"",R7C:R[-3]C)" End If Next c と記述させていただき、使わさせて頂きます。 範囲がそのうち合計やa銀行などに被さってきますが、Bを銀行名検索なのでこだわらずにいこうと考えております。 もし、このまま数が増えると問題が起こる可能性がありますようでしたらご教授頂ければ幸いです。 >いまE列はE80までデータが記入されていて,E83に数式を入れたい >いまF列はF103までデータが記入されていて,F106に数式を入れたい > : >いまJ列はJ345までデータが記入されていて,J348に数式を入れたい > >それらのE83,F106…J348に,まとめて数式を入れたい,とそういう事を>言ってるように見えますが,そういう事でしょうか? >やれば勿論出来ますが,なんとも無意味なコダワリにしか思えません。 こちらにつきましては、私の説明がわるかったことが招いた誤解でありますことをお詫び申しあげます。 >sub macro2() > dim datnum >’アナタが用意したdatnumの値の取得をここに書き写す > > cells(datnum, "E").resize(1, 6).formular1c1 = "=SUMIF(R7C2:R[-3]>C2,""a銀行"",R7C:R[-3]C)" >end sub こちらのマクロにつきましても描いていたものと同じ作業ができました。 色々と作法につきましてもご教授頂き、感謝致しております。 この度は色々とご無礼が有りましたことをこの場をかりましてお詫び申しあげます。 この度は本当にありがとうございました。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

数式を記入するのは,各列の最下行+3行目でいいんですね?(アナタが掲示したマクロは,そうは書かれていませんが,マクロの方を無視します) 作成例: sub macro1()  dim c as integer  dim r as long  for c = 5 to 10   r = cells(65536, c).end(xlup).row   if r >= 7 then    cells(r + 3, c).formular1c1 = "=SUMIF(R7C2:R[-3]C2,""a銀行"",R7C:R[-3]C)"   end if  next c end sub

quindecillion
質問者

お礼

ご回答ありがとうございます。

quindecillion
質問者

補足

当方の記述がおかしかったことをお詫びさせて頂きます。 データ末尾=各列最終行ではございません。 値が入力されているセルの一番下ということです。 100行目まで値があれば103行目にa銀行の合計 200行目まで値があれば203行目にa銀行の合計 という形です。 最終行が変動しますがDatNumが入力値の最終行になるように設定してあります。 E列からJ列の入力値の最終行+3行目にBがa銀行なら合計をする という形をとりたいと思っております。 各列毎に設定する方法ではなく、まとめて設定できないものかと思い質問させて頂いております。 非常に言葉足らずな質問で申し訳ありませんでした。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一例です。 Range(adr2$).Cells(datnum + 3, 1).FormulaR1C1 = _ "=SUMIF(r7c2:r1000c2,""a銀行"",r7c:r1000c)"

quindecillion
質問者

お礼

ご回答ありがとうございます。

quindecillion
質問者

補足

ご返事ありがとうございます。 Range(adr2$).Cells(datnum + 3, 1).FormulaR1C1 = _ "=SUMIF(r7c2:r1000c2,""a銀行"",r7c:r1000c)" これですと Range(adr2$).Cells(DatNum + 3, 1).Formula = _ "=SUMIF(B7:B1000,""a銀行"",E7:E1000)" を絶対値形式で書き直しただけで解決に至っていないと思われるのですが当方の勘違いでしょうか? この方法でも各セルに対応するように値をずらして行けばできるのですが、コードが長くなりすぎるのでまとめれないかと考えております。

関連するQ&A

  • VBA 複数セルを選択する場合の記述について

    マクロにて、離れた複数のセルを選択したいのですが どのように記述してもエラーになってしまいます 例:Range("A1:C2,E1:F2") ※ 選択する部分を可変にしたいので全て cells(a,b)の方法で記述したいです ※ グラフのデータ選択に用いたいので一行で書きたいです 【失敗した記述】 ・Range(Cells(1,1),Cells(2,3),Cells(1,5),Cells(2,6)) ・Range(Range(Cells(1,1),Cells(2,3)),Range(Cells(1,5),Cells(2,6))) お手数ですが、よろしくお願いします

  • エクセル マクロで行の合計を数値で入力したい

    マクロ初心者です。 F列からAJ列までの合計をAK列に数値で入力しようとしています。 ただし、FからAJ列の各セルに全てデータは入っていません。 したがってFからAJ列のいずれかにデータが入っている最終行を 見つけて合計を算入しようとしているのですが下記の通りやっても うまくいきません。教えてください。 エクセルのバージョンは2002です。 Sub () 'データが入っている最終行まで合計額を数字で入力 LastRow = Cells(65536, COL).End(xlUp).Row For i = LastRow To 6 Step -1 Set myRange = Range(Cells(i, 6), Cells(i, 36)) Cells(i, 37).Value = WorksheetFunction.Sum(myRange) Next i 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

  • エクセル マクロの設定方法について

    差込印刷でSheet1に作成した名簿データにより、sheet2に作成しているデータへ差込印刷をしています。現在、次のようなマクロを組んで名簿の件数に合わせて、For = 2 To 500 Step 8を修正しながら、印刷しています。できたら、名簿の件数の増減に関係なく印刷できるようになればと考えています。始めたばかりのマクロ初心者です。よろしくご教授ください。お願いします。 Dim i As Long Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = sheets(″sheet1″) Set ws2 = sheets(″sheet2″) For i = 2 To 500 Step 8 ws2 .Range(″A1″).Value = ws1.Cells(i+1,2).Value ws2 .Range(″A7″).Value = ws1.Cells(i+2,2).Value ws2 .Range(″A13″).Value = ws1.Cells(i+3,2).Value ws2 .Range(″A19″).Value = ws1.Cells(i+4,2).Value ws2 .Range(″F1″).Value = ws1.Cells(i+5,2).Value ws2 .Range(″F7″).Value = ws1.Cells(i+6,2).Value ws2 .Range(″F13″).Value = ws1.Cells(i+7,2).Value ws2 .Range(″F19″).Value = ws1.Cells(i+8,2).Value DoEvents ws2.PrintOut Next End Subws2 .Range(″F1″).Value = ws1.Cells(i+5,2).Value ネット等で調べて、上記のようなマクロで作業してます。(マクロの設定方法が間違っているところがあると思いますが?)

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • VBA 検索をかけ合計数とGrp番号を抽出    

    現在、関数ではなく VBAでマクロを勉強しているのですが、 下記のコードでエラーが発生してしまいます。 是非、ご教授願えませんでしょうか。 Sheet3を作業用のSheetとして使用しています。  Sub Sample1() Dim i As Long, k As Long, lastRow As Long, wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet2") Set wS3 = Worksheets("Sheet3") Application.ScreenUpdating = False With Worksheets("Sheet1") lastRow = .Cells(Rows.Count, "A").End(xlUp).Row .Range("A:A").AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True For i = 2 To wS3.Cells(Rows.Count, "B").End(xlUp).Row .Range("B1").AutoFilter field:=1, Criteria1:=wS3.Cells(i, "B") Range(.Cells(3, "B"), .Cells(lastRow, "B")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(3, (i - 1) * 2) For k = wS2.Cells(Rows.Count, (i - 1) * 2).End(xlUp).Row To 2 Step -1 wS2.Cells(k, (i - 1) * 2 - 1) = WorksheetFunction.CountIfs(.Range("A:A"), wS3.Cells(i, "A"), _ .Range("C:C"), wS2.Cells(k, (i - 1) * 2)) For j = 2 To wS3.Cells(Rows.Count, "E").End(xlUp).Row .Range("E1").AutoFilter field:=1, Criteria1:=wS3.Cells(j, "E") Range(.Cells(3, "E"), .Cells(lastRow, "E")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(3, (j - 1) * 2) For l = wS2.Cells(Rows.Count, (j - 1) * 2).End(xlUp).Row To 2 Step -1 wS2.Cells(j, (j - 1) * 2 - 1) = WorksheetFunction.CountIfs(.Range("A:A"), wS3.Cells(j, "A"), _ .Range("E:E"), wS2.Cells(k, (j - 1) * 2)) If WorksheetFunction.CountIf(wS2.Columns((j - 1) * 2), wS2.Cells(k, (j - 1) * 2)) > 1 Then wS2.Cells(l, (j - 1) * 2 - 1).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub 実際に抽出結果を出したい概要は下記に用になります。 検索したいsheet1には セルBにはUsername番号などがあります。      A        B       C     D     E     F     G 1           Username      Grp番号    2           yamada10x      Grp1             3           yamada4x       Grp1    4           yamada10x      Grp1 5           yamada10x      Grp1 6           yamada4x       Grp2 7           yamada10x      Grp2 8           yamada4x       Grp2 9           yamada10x      Grp3 . . 50           yamada4x      Grp40 Sheet2にはセルBとCにyamada10xの合計数とgrp番号、セルEとFにはyamada4xの合計数とgrp番号などがあります。      A        B          C       D        E           F      1 2       yamada10xの合計数 Grp番号       yamada4xの合計数  Grp番号   3                                   4                                  5               . . 10                                          sheet1で検索したユーザ名・Grp番号などを行数3のセルC・FにはGrp番号を抽出 行数3のセルB・EにはGrp番号ごとのyamada10xとyamada4xの合計数をsheet2に 抽出させたいという形になります。       A        B          C       D        E          F      1 2       yamada10xの合計数  Grp番号       yamada4xの合計数 Grp番号   3               3         Grp1            1        Grp1 4               1         Grp2            2        Grp2 5               1         Grp3 . . 10                                         1       Grp40 わかりにくい図と説明で申し訳ございません。 お手数をおかけしますが、ご教授の方をお願いできますでしょうか。 よろしくお願い致します。

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • excel vba 複数の条件に一致する項目の削除

    以下のような表があって、その中から条件に一致する行を削除したいのですが、 よくわからず困っています。    A    B    C    D    E 1  No,  伝票種類 管理No,  日付  部署 2   1  A伝票   16-001  15/8/29 営業課 3   2  B伝票   16-021 15/10/11 販促課 4   3  A伝票   16-009 15/9/10 広報課 この表で、 F1セルに「削除する伝票種類」、 F2セルに「管理No,」を入力した後、 シート上に作成したコマンドボタンをクリックすると該当するナンバーの伝票種類、管理No,、部署を削除するようにしたいのです。 For i = 2 To cells(Rows.count, 1 ).End(xlUp).Row IF cells(i, 2) = Range("F1").value And cells(i,3) = Range("F2").value Then Range(cells(i , 2) , cells( i , 3) , cells(i , 5)).Select Selection.Clear End If Next i にすればいいのかなと思ってやってみたのですが、 削除されないのです。VBAに関しては初心者なのでよくわからず困っています。 どなたか助けていただけると嬉しいです。 よろしくお願いいたします。    

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • EXCELでマクロを使って、小計、合計の出し方

    1.部の中にそれぞれ、営業1課、営業2課、…があり、社員と売上金額が表示されている下記のようなデータがあります。 部、課、社員の数は、実際はもっとたくさんあり、それぞれの件数は、毎月変化します。 マクロを使って、課毎計、部毎計、総合計を出す方法を教えて下さい。 試しに作りましたら、下記のような結果になり、うまくいきません。 元データ 部 課 社員 金額 A 営業1課 a 10 A 営業1課 b 20 A 営業1課 c 30 A 営業2課 d 40 A 営業2課 e 50 A 営業2課 f 60 B 営業1課 g 70 B 営業1課 h 80 B 営業1課 I 90 B 営業2課 j 100 B 営業2課 k 110 B 営業2課 l 120 実行結果           ×   正解 部 課 社員 金額   金額 A 営業1課 a 10   10 A 営業1課 b 20   20 A 営業1課 c 30   30   営業1課 計  60   60 A 営業2課 d 40   40 A 営業2課 e 50   50 A 営業2課 f 60   60   営業2課 計 210   150 A 合計     110   210 B 営業1課 g 70   70 B 営業1課 h 80   80 B 営業1課 I 90   90   営業1課 計 240   240 B 営業2課 j 100   100 B 営業2課 k 110   110 B 営業2課 l 120   120   営業2課 計 570   330 B 合計     230   570 総合計     780   780 Sub 合計計算() Sheets("元").Select Sheets("元").Copy Before:=Sheets(2) Dim GYO1 As Long '部 グループの先頭行 Dim GYO2 As Long '部 グループの最終行 Dim GYO3 As Long '課グループの先頭行 Dim GYO4 As Long '課グループの最終行 Dim GYO As Long '小計、合計行 Dim strFORMULA As String GYO = 2 '空白でない間、次の作業を繰り返す Do While Cells(GYO, 1).Value <> "" GYO1 = GYO GYO = GYO + 1 '部が同じ間、次の作業を繰り返す Do While Cells(GYO, 1).Value = Cells(GYO1, 1).Value GYO = GYO + 1 '課が同じ間、次の作業を繰り返す GYO3 = GYO Do While Cells(GYO, 2).Value = Cells(GYO3, 2).Value GYO = GYO + 1 Loop '課計 GYO2 = GYO - 1 Rows(GYO).Insert Cells(GYO, 2).Value = Cells(GYO3, 2).Value & " 計" Cells(GYO, 4).FormulaR1C1 = "=SUBTOTAL(9,R" & GYO1 & "C:R" & GYO2 & "C)" GYO = GYO + 1 Loop '部計 GYO4 = GYO - 1 Rows(GYO).Insert Cells(GYO, 1).Value = Cells(GYO1, 1).Value & " 合計" Cells(GYO, 4).FormulaR1C1 = "=SUBTOTAL(9,R" & GYO3 & "C:R" & GYO4 & "C)" GYO = GYO + 1 Loop ' 総合計 Cells(GYO, 1).Value = "総合計" Cells(GYO, 4).FormulaR1C1 = "=SUBTOTAL(9,R1C:R" & GYO2 & "C)" Range("A1").Select End Sub 2.尚、この質問のように表形式のデータを間隔をあけて原稿を作成しても確認画面になると、間隔が詰まります。間隔が詰まらない方法も教えて下さい。

専門家に質問してみよう