前提
Excel VBAにてcsvファイルを1行ずつ読み込み、
その内容をまとめたものをエクセルに出力する処理を作成しております。
実現したいこと
出力されるエクセルには売上個数が多い順にランキング形式に並べたいです。
また、csvファイルを1行ずつ読み込んだ際に、
「果物」「地域」が一致する場合は「売上個数」と「値段」に加算するようにしたいです。
読取csvファイルの例、出力したいエクセルファイルのイメージは以下の通りです。
・csvファイル
|果物|地域|売上個数|値段|
|みかん|A地域|10|1000|
|みかん|A地域|20|2000|
|みかん|B地域|15|1500|
|りんご|A地域|8|800|
|りんご|A地域|9|900|
|メロン|C地域|1|3500|
・出力したいエクセルファイル
|順位|果物|地域|売上個数|値段|
|1|みかん|A地域|30|3000|
|2|りんご|A地域|17|1700|
|3|みかん|B地域|15|1500|
|4|メロン|C地域|1|3500|
発生している問題・エラーメッセージ
If文の複雑化の解消方法
別の記述方法模索中
該当のソースコード
Excel VBA Dim i As Long Dim csvData() As Variant 'csvファイルを1行ずつ読取 For i = 2 To Ubound(csvData, 1) '出力するエクセル側のA2(果物の最初の列)とB2(地域の最初の列)がブランクの場合 If sheet.Range("A2").Value = "" And sheet.Range("B2").Value = "" Then 'csvファイルの1行目のカラムを取得し、それぞれのセルに値を代入 ※順位1の行に値を代入 '果物 sheet.Range("A2").Value = csvData(i, 1) '地域 sheet.Range("B2").Value = csvData(i, 2) '売上個数 sheet.Range("C2").Value = csvData(i, 3) uVal = sheet.Range("C2").Value '値段 sheet.Range("D2").Value = csvData(i, 4) nVal = sheet.Range("D2").Value '出力するエクセル側のA2(果物の最初の列)とB2(地域の最初の列)とcsvファイルのカラム1(果物),2(地域)列目が一致した場合 ElseIf sheet.Range("A2").Value = csvData(i, 1) And sheet.Range("B2").Value = csvData(i, 2) Then '売上個数(果物名と地域名が一致した場合は売上個数を加算) ※順位1の行に値を代入 uVal = uVal + csvData(i, 3) sheet.Range("C2").Value = uVal '値段(果物名と地域名が一致した場合は値段を加算) nVal = nVal + csvData(i, 4) sheet.Range("D2").Value = nVal '出力するエクセル側のA2(果物の最初の列)とB2(地域の最初の列)とcsvファイルのカラム1(果物),2(地域)列目がどちらかが一致しない場合 ElseIf sheet.Range("A2").Value <> csvData(i, 1) Or sheet.Range("B2").Value <> csvData(i, 2) Then 'それぞれの項目を一つ下の行に代入 ※順位2の行に値を代入 '果物 sheet.Range("A3").Value = csvData(i, 1) '地域 sheet.Range("B3").Value = csvData(i, 2) '売上個数 sheet.Range("C3").Value = csvData(i, 3) '値段 sheet.Range("D3").Value = csvData(i, 4) ElseIf... (果物名または地域名が異なるたびにIf文作成が必要) EndIf
試したこと
上記のコードのようにIf文でエクセル側の値とcsvの値を比較して一致不一致を判断しておりましたが、
果物名または、地域名どちらかが異なる場合や両方とも異なる場合に都度If文を作成し、代入するセルを指定しなければなりません。
また、エクセルファイルの2行目以降の項目で、果物名と地域名が一致した際に加算する方法も不明です。
(上記例の2位りんごのような場合)
上記以外の方法でマクロ処理内で実行する方法はございますでしょうか。
ご回答をお願いいたします。

回答1件
あなたの回答
tips
プレビュー