• ベストアンサー

VBAの質問です。

エクセルVBAの質問です。商品と価格をCSVでデータを取り込んで別の表に商品一覧に価格の合計をSAMIFの常駐で出しているのですが商品項目が増えた場合に表に自動で追加できるようにしたいのですが、どのようなコードを書けばいいんでしょうか?是非教えていただけないでしょうか?

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> 実際にはどうやってやるんでしょうか・・・。 例えば、CSV で取り込んだ内容が   [商品名] [価格] としますよね? 以下の話は、1 行目がこのような見出し行になっている 前提なので、見出し行が無ければ追加して下さい。 1. A1 セルを選択 2. [Ctrl]+[*] または、[Ctrl]+[G] で [ジャンプ]-[セル選択]-   [アクティブセル領域]で表全体を選択 3. [データ]-[ピボットテーブルと..(略)] をクリック 4. ピボットテーブル/ピボットテーブルウィザード(以下PW)-1/3 は   そのまま [次へ] 5. PW-2/3 もそのまま [次へ] 6. PW-3/3 で [レイアウト] クリック 7. 画面右側に見出しのラベルが並んでます。この内、[商品名] をクリック   したまま画面左側の[行]までドロップします。同様に、[価格] を   [データ] までドロップし、[OK] 8. PW-3/3 画面で、結果をどこに表示するか指定し、[完了] という手順です。慣れれば 30 秒ぐらいの作業ですよ。 Excel の標準機能で容易にできることなのですが、これをあえて VBA でやる 特別なご事情があるのでしょうか? ご質問の処理フローを考えると、 1. CSV 読み込み 2. 商品名の重複のないリストを取り出す 3. 2. で取り出した商品名リストについて、価格を集計 となりますが、2. の処理が以外と面倒なのです。  ・ AdvancedFilter  ・ Collection  ・ Dictionary などの手法があります。また、ピボットテーブル自体を VBA で作成する こともできますから、これを利用すれば、2~3 を一気に行うことも可能 です。 しかし、VBA 中/上級者向けの内容ですよ。今後のメンテまで考えると それなりの知識と経験が必要になりますけども。。。 ご質問主様がどれぐらいのスキルをお持ちなのかも分りませんので... いかがでしょうか?

dezalyusui
質問者

お礼

ご丁寧に詳しくご回答して頂きありがとうございます。 ほとんどスキルはないのですが仕事上どうしてもやらなくてはいけなくなってしまいました。現在も苦心中です(泣) 重複の無いリストを取り出せば関数常駐でなんとかなるので3は カットできるのですが・・・。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.4

質問の意味と状況が理解できません。私が回答で常々やってますが、シートとセルの列と行を使って(示して)模擬実例でも挙げて質問してください。 ーー >商品と価格をCSVでデータを取り込んで CSVから取り込んだことはその後に影響ないでしょう。多分余分な記述です。この結果日々増える・変動するデータがエクセルシートにできるのですね(データ表)。 エクセルに読み込んだシートの各行、各列の内容構成は? >別の表に商品一覧に SUMIFで合計を出している。->商品一覧の商品名か商品コードをSUMIF関数の第2引数として、その商品の該当行を合計しているのですね。 ーー 例データ Sheet1(データシート) 商品 データ A列  B列 a 10 b 20 c 30 d 30 e 20 f 10 g 40 h 90 i 100 Sheet2 (送品一覧シート) A列  B列 商品 データ a 10 c 30 d 30 f 10 g 40 ーー 実行後 Sheet2は 商品 データ a 10 c 30 d 30 f 10 g 40 b 20 e 20 h 90 i 100 コードは、標準モジュールに Sub test01() On Error GoTo err1 Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d1 = sh1.Range("A65536").End(xlUp).Row d2 = sh2.Range("A65536").End(xlUp).Row k = d2 + 1 'MsgBox d1 'MsgBox d2 '-- For i = 2 To d1 'MsgBox i 'MsgBox sh1.Cells(i, "A") x = Application.WorksheetFunction.VLookup(sh1.Cells(i, "A"), _ Range(sh2.Cells(1, "A"), sh2.Cells(d2, "A")), 1, False) Next i End err1: MsgBox sh1.Cells(i, "A") & "追加" sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B").Formula = "=SUMIF(Sheet1!$A$2:$A$100,A" & k & ",Sheet1!$B$2:$B$100)" k = k + 1 Resume Next End Sub ーー 上記を新データが入るごとに実行する。 ーー しかし上記コードは癖のある、関数を使ったやり方で難しいと思うかもしれないが、本質問はしたいことだけ丸投げで、VBAをはじめてまもなくの人が、作れるわけがない。ひょっとすると理解もできないかもしれない。 課題に取り組むのがちと早過ぎるようにおもうが。

すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

ピボットテーブルを使ってみては? マクロ不要で、ご希望のことができると思いますよ。

dezalyusui
質問者

お礼

ご解答ありがとうございます。 実際にはどうやってやるんでしょうか・・・。 しかしながらマクロで制作したいのでもうちょっとがんばって見ます。

すると、全ての回答が全文表示されます。
  • xcode_15
  • ベストアンサー率18% (19/102)
回答No.1

While Range(x,y).offset(hoge,0) <> "" 足し算します命令群   hoge = hoge + 1 Wend こんな感じで、いいですか?

dezalyusui
質問者

お礼

解答一番乗りですみませんありがとうございます。 ””間がヌルなのはなぜなんでしょうか? 初歩的な質問でごめんなさい。

すると、全ての回答が全文表示されます。

関連するQ&A