下記のような表があり、B列の冒頭9文字が同一の行があれば、その同一の行のC列の数値の合計をM列のに記入するマクロを作っています。B列は冒頭が同一のものは連続で並んでおり、同じ冒頭のものが飛び石で存在することはありませんが、行数は不定です。
またB列には他にも空白行や別の文字が入る行が存在します。余計な行の削除は不可能。
B列 C列 M
○○○✖✖ 3 15(C列の合計)
○○○✖✖ 10
○○○✖✖ 2
△△△○○ 5 12(C列の合計)
△△△○○ 7
構造としてはB列の始め9字を変数に入れ、その変数でB列内を頭から検索、ヒットした行の1行目~n行目のC列の数値を合計し、M列のそのうちの1行に入力…ということがしたいのですが、実際に動くものがなかなか作れません。
修正すべき箇所などご教授いただける方がいらっしゃいましたらぜひアドバイスお願い致します。
どうぞよろしくお願い致します。
===========
Sub ()
Dim a As String
Dim x As String
Dim b As Long
Dim c As Long
Dim e As Long
Dim i As Long
Dim Rng As Range
Dim o As Object
Dim ws As Worksheet
a = "abcde"
set ws = ActiveWorkbook.Worksheets(1)
With ws
e = .Cells(Rows.Count, "B").End(xlUp).Row 'eにB行の最終行を取得
Set Rng = .Range("B1", .Cells(Rows.Count, "B").End(xlUp)) '検索対象範囲
End With
For i = 5 To e '5行目から処理開始
Dim txt As String
txt = Range(Cells(i,"B")).Value
x = Mid(txt, 1,9)
IF a <> x And ws.Range(Cells(i,"C")) > 0 ) Then
'↑xがaと異なるかつC列i行に0以上の数が入っていたら
a = x 'aを今回のB列i行の最初9文字で書き換え
Set o = Rng.Find(What:=a.Value, LookIn:=xlValues, LookAt:=xlPart) '検索対象範囲Rngでaを検索
If Not o Is Nothing Then '検索対象があったら
FirstAddress = o.Address 'アドレスを取得し
b = o.Row 'ヒットした一番上の行を取得
Do
c = o.Row 'FindNextで最初ヒット以外だったらここにヒット最終行が入る
Set o = Rng.FindNext(o) 'FindNextで同じ処理
Loop While Not o Is Nothing And o.Address <> FirstAddress '最初のアドレスに来たら抜ける
If b = c Then ws.Range(Cells(b,"M")) = ws.Range(Cells(i,"C")).Value
'↑もしb=cだったらBの合計列Mに数量Dを入れる
Else 'b<>cだったらBの合計列Mに数量合計=SUM(b:c)を入れる
ws.Range(Cells(b,"M")) = "=SUM(" & Cells(b,"C").Value & ":" & Cells(c,"C") & ")"
EndIf
EndIf
End with
Next i
End Sub
No.1ベストアンサー
- 回答日時:
こんにちは!
VBAでなくても関数で出来そうですが・・・
M5セルに
=IF(COUNTIF(B$5:B5,LEFT(B5,9)&"*")=1,SUMIF(B:B,LEFT(B5,9)&"*",C:C),"")
という数式を入れフィルハンドルで下へコピー!
これで大丈夫だと思います。
どうしてもVBAで!というのであれば、一例です。
他の方がお考えになったコードに手を加えるのは好きではないので、勝手にやってみました。
VBAでもワークシート関数がそのまま使えるので、ワークシート関数を使用しています。
コードを拝見すると5行目からループさせるようにしていると思いますので
4行目は項目行になっていて、データは5行目以降にあるという前提です。
Sub Sample1()
Dim i As Long, lastRow As Long, c As Range
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Application.ScreenUpdating = False
Range("N:O").Insert '//←作業用の列として使用//
Range("N4") = "ダミー"
Range(Cells(5, "N"), Cells(lastRow, "N")).Formula = "=LEFT(B5,9)"
Range(Cells(4, "N"), Cells(lastRow, "N")).AdvancedFilter Action:=xlFilterCopy, copytorange:=Range("O4"), unique:=True
For i = 5 To Cells(Rows.Count, "O").End(xlUp).Row
Set c = Range("N:N").Find(what:=Cells(i, "O"), LookIn:=xlValues, lookat:=xlWhole)
Cells(c.Row, "M") = WorksheetFunction.SumIf(Range("N:N"), Cells(i, "O"), Range("C:C"))
Next i
Range("N:O").Delete '//←作業列の削除//
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
WorksheetFunction.SumIf関数をこちらで初めて知りました。
理想通りの関数があることにびっくり!
大変勉強になりました。ありがとうございました。
No.2
- 回答日時:
同じキーが2件以上連続した場合、M行に出力するようにしています。
空白行は2件以上連続していても、M行へ出力することはしません。
同じキーが空白行をはさんであった場合、同じキーが連続したとはみなしません。
上記の条件で作成しました。
リラン(マクロの再実行)を考慮して、各行の処理の頭でM行をクリアしています。
-----------------------------------------
Option Explicit
Public Sub M列設定()
Dim maxrow As Long
Dim row As Long
Dim ws As Worksheet
Dim oldkey As String
Dim newkey As String
Dim sum As Variant
Dim count As Long
Dim oldline As Long
Set ws = Worksheets(1)
maxrow = ws.Cells(Rows.count, "B").End(xlUp).row 'B列目の最終行を求める
oldkey = ""
count = 0
For row = 5 To maxrow
ws.Cells(row, "M").Value = "" 'M列クリア
newkey = Left(ws.Cells(row, "B").Value, 9)
If newkey <> oldkey Then
'キーが異なる場合
If oldkey <> "" And count > 1 Then '同じキーが2件以上ある場合M列へ設定
ws.Cells(oldline, "M").Value = sum
End If
oldkey = newkey
oldline = row
count = 1
sum = ws.Cells(row, "C").Value
Else
'キーが同じ場合
sum = sum + ws.Cells(row, "C").Value
count = count + 1
End If
Next
'最後の処理
If oldkey <> "" And count > 1 Then '同じキーが2件以上ある場合M列へ設定
ws.Cells(oldline, "M").Value = sum
End If
MsgBox ("処理完了")
End Sub
スマートな記述を提示して頂きありがとうございます。
findを使用する方法しか思いつきませんでしたが、それ以外の着眼点、大変勉強になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) VBAで教えて頂きたいのですが? 1 2022/04/29 02:36
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで大量のファイルをシート名...
-
Vba 実数および実数タイプの変...
-
エクセルVBAについて
-
ユーザーフォームに別シートか...
-
VB.net(VB)で、フォームにExcel...
-
Excelのマクロについて教えてく...
-
エクセルの合計を自動で表示さ...
-
Excelのマクロでワードのテキス...
-
VBAの計算で@が出てしまう件
-
VBA listBoxから
-
エクセルのマクロについて教え...
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
左右の表のキー位置を合わせたい
-
VBAの質問になります メッセー...
-
Excel マクロについての相談
-
VBA レジストリの値の読み方に...
-
2つのマクロでチェックボックス...
-
Vba SelStart、SelLen教えてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報