質問するログイン新規登録
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

587閲覧

EXCEL VBA csvデータ読込・出力について 

Maypril

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/10/21 08:01

0

0

EXCEL VBAについて質問です。

マクロファイル内で出力ボタンを押下した際に、
あるcsvファイルの内容を1行ずつ読み込み、処理完了時に新しいエクセルファイルを出力させ、
出力ファイルで表のようなものに結果を表示させたいのですが、一部の重複データがある場合は、次の行に表示させたいです。

具体例は以下です。


・csvファイル
|果物|地区|売上個数|値段|
|みかん |A地区|10 |150|
|みかん |A地区|5 |300|
|リンゴ |A地区|10 |100|
|メロン |A地区|10 |500|
|リンゴ |B地区|30 |300|
|リンゴ |A地区|10 |100|

・出力したエクセルファイルのイメージ
|順位|果物 |地区|売上個数|値段|
|1|リンゴ|B地区|30 |300|
|2|リンゴ|A地区|20 |200|
|3|みかん|A地区|15 |450|
|4|メロン|A地区|10 |500|


出力したエクセルファイル側では、売上個数が多い順に並べたいです。
csvファイルを1行ずつ読み込んだ際に、果物列と地区列が同じ値の場合は売上個数と値段を加算するようにしたいです。(同じ果物であっても、地区が異なる場合は別の行に表示させたいです。)

現在、マクロ側で果物列または地区列が一致しない場合はひとつ下の行に追加するよう記述しております。
※記述しているマクロは以下です。


If Range("C8").Value <> csvData(i, 1) Then
□If Range("D8").Value <> csvData(i, 2) Then
□□Range("C9").Value = csvData(i, 1)
□□Range("D9").Value = csvData(i, 2)
EndIf

※C8→出力したいエクセルファイルの順位1位の果物列のセル
※D8→出力したいエクセルファイルの順位1位の地区列のセル
※C9→出力したいエクセルファイルの順位2位の果物列のセル
※D9→出力したいエクセルファイルの順位2位の地区列のセル


しかし、上記の記述の場合、果物の種類または地区の種類が増えるにつれ、If文が増えてしまいます。
さらにその右の列に売上個数、値段を表示させる記述を記載するとより複雑になってしまいます。

上記の方法以外でほかの記述方法はございますでしょうか。

ご回答のほど、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/10/21 08:35

コードは「コードの挿入」で記入しましょう。コード内の「i」とは何でしょうか?iの定義も含めたコードを提示された方が回答がつきやすくなるかと思います。
sk.exe

2022/10/21 08:46

そういう集計処理をExcelで実施なさりたいなら、PowerQueryを使用された方が分かりやすいのではないかと。
guest

回答2

0

コードなし、考え方のみですが以下でどうでしょうか?

(1)csvファイルをexcelでオープン(workbooks.open)
(2)開いたbookを[果物][地区]でsort後、[果物][地区]でグループ化し、[個数][値段]を集計
(3)合計行のみ出力側bookへ転記 ※合計行には[果物][地区]の値は表示されないので前の行から拾う
(4)出力側bookを[売上個数]でsort
(5)出力側bookに[順位]を書き込み

投稿2022/11/10 13:10

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

果物と地区をまとめたマスターを作成して
マスターのデータとCSVデータを比較する方法はいかがでしょうか?

このようにしておけば、新しい果物や地区が増えてもマスターを更新するだけでOKです。

以下のようなコードを考えてみました。
画像と一緒に参照ください。イメージ説明

VBA

1  Dim i As Long 2 Dim k As Long 3 4 Dim lastrow1 As Long '商品マスタの最終行 5 Dim lastrow2 As Long 'CSVデータの最終行 6 7 Dim 果物1 As String '商品マスタの果物データ格納 8 Dim 果物2 As String 'CSVデータの果物データ格納 9 10 Dim 地区1 As String '商品マスタの地区データ格納 11 Dim 地区2 As String 'CSVデータの地区データ格納 12 13 Dim 個数 As Variant 14 Dim 値段 As Variant 15 16 Dim 個数積算 As Variant 17 Dim 値段積算 As Variant 18 19 20 Dim ws As Worksheet 21 Set ws = Worksheets(1) 22 23 lastrow1 = ws.Cells(Rows.Count, 1).End(xlUp).Row 24 lastrow2 = ws.Cells(Rows.Count, 4).End(xlUp).Row 25 26 For i = 3 To lastrow1 27 果物1 = ws.Cells(i, 1).Value 28 地区1 = ws.Cells(i, 2).Value 29 個数積算 = 0 30 値段積算 = 0 31 32 For k = 3 To lastrow2 33 果物2 = ws.Cells(k, 4).Value 34 地区2 = ws.Cells(k, 5).Value 35 個数 = ws.Cells(k, 6).Value 36 値段 = ws.Cells(k, 7).Value 37 38 If 果物1 = 果物2 And 地区1 = 地区2 Then 39 個数積算 = 個数積算 + 個数 40 値段積算 = 値段積算 + 値段 41 42 End If 43 Next k 44 45 MsgBox 果物1 & "/" & 地区1 & "/" & 個数積算 & "/" & 値段積算 46 47 48 Next i

投稿2022/11/04 04:08

ppss

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問