• ベストアンサー

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/17068)
回答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

  • エクセルでVBAを使うのかと思うのですが・・・

    エクセルである商品の一覧があります。 それぞれの数量合計を求めたいのですが ひとつの商品が複数行にわたって入力されており その合計を出したいのです。  ABCDEF 1 (1)  5 2 (1)  2 3 (1)  4 4 (2)  3   5 (2)  1 6 (2)  8 7 (3)  9 8 (4)  7 9 (4)  7 上記の表で(1)が合計何個、(2)が合計何個といった感じです。Eは個数です。 (1)は5+2+4=11なので別シートの商品名のみの一覧の(1)の横へ11と入力したいのです。 商品数が数百あり、行も数千あるため自動計算したいと思っています。 ちなみに今は行3の下に行の挿入を行い、セル1E~3Eまでを合計し、別のシートの商品一覧にC&P(値のみ)しています。 これではいつまでかかるか気が遠くなってきます。 VBAの出来る方よろしくお願いします。

  • ExcelのVBAに明るい方・・・

    Excelの、Sheet1 に 1日目,鈴木くん,点数,・・・ 2日目,佐藤くん,点数,・・・ 2日目,山田くん,点数,・・・ 3日目,佐藤くん,点数,・・・ 3日目,鈴木くん,点数,・・・ 4日目,山田くん,点数,・・・ ・・・ という、元ダネの一覧表があって、 このデータを日々追加入力していくごとに、自動的に、 Sheet2 には、鈴木くんのみの一覧表のデータ 1日目,鈴木くん,点数,・・・ 3日目,鈴木くん,点数,・・・ ・・・ Sheet3 には、佐藤くんのみの一覧表のデータ 2日目,佐藤くん,点数,・・・ 3日目,佐藤くん,点数,・・・ ・・・ Sheet4 には、山田くんのみの一覧表のデータ 2日目,山田くん,点数,・・・ 4日目,山田くん,点数,・・・ ・・・ が、自動的に追加入力されるVBAの記述って、 どうすればいいんでしょうか? VBAに明るい方、どうかよろしくお願いします。

  • EXCELのマクロ・VBAについて

    エクセルでデータ管理をしております。 エクセルで表になっている文字の羅列をVBA・マクロ等を使用して、 ウェブページの入力フォームに自動で入力、ウェブページの結果を再度エクセルに返すことはできますでしょうか? こちらがサイトになります。 アマゾンのFBA料金シュミレーター https://sellercentral.amazon.co.jp/hz/fba/profitabilitycalculator/i... こちらのサイトはAmazonの中に間借りして、商品を販売している業者のためのサイトです。 ここに販売している商品のコード、販売価格、仕入れ価格を入力することによって、Amazonに支払う手数料が表示されます。 例えば、「コカ・コーラ 2L ペットボトル×12本」という商品が一つ売れた場合の手数料が知りたいとします。 その場合「B018HVON60」(コカ・コーラ 2L ペットボトル×12本の商品コード)を入力して「検索」を押します。 その後、「FBA発送の場合」の下にある「商品代金」「Amazonへの納品」「商品原価」にそれぞれ「2980」「100」「1500」と入力して「計算」を押します。 結果として出てきた「純利益」である598円という数字と、「純利益率」である20%という数字をエクセルに返したいということになります。 話を整理させていただきます。 現在エクセルでは、(1)商品コード(2)商品代金(3)Amazonへの納品(4)商品原価 を一覧として表にしております。 それらのデータを利用して(5)純利益(6)純利益率 という2つの数値を取り込んで、自動でその表に入力したいと考えております。 自分で2~3日本気で調べていたのですが、求めているページも見つからず困っております。 分かる方おられましたら宜しくお願い致します。

  • エクセルマクロで一致データを検索

    エクセルのマクロを使用して以下のことを行いたいです。 (※VBA初心者なので解説を書いていただけるとありがたいです。) ・商品マスタのCSVを読み込む。  30万件以上あるので、エクセルでは表示できません。 ・読み込んだ商品マスタに記載されている商品コードを、  商品データ一覧のエクセルファイルに自動で転記したい。    商品データ一覧のエクセルファイルには、「商品番号」「色」「サイズ」があります。  この3条件が商品マスタのものと一致する商品マスタのコードを転記したいです。 量が膨大なうえ、急ぎの作業なため、何卒よろしくお願いいたします。

  • VBAに詳しい方に質問です。

    VBAに詳しい方に質問です。 私はVBA初心者です、お力添えのほどよろしくお願いいたします。 前回の質問の続きなのですが、 エクセルで入力し、それを一覧表に転記し、最終的に出力フォームにデータを呼び出し印刷するプログラムを作成しています。 そこで、一覧表から出力フォームに呼び出すVBAについて教えてください。 ☆シート2 これまでに入力したデータをすべて一覧表があります。    1     2     3   4… 1 日付    名前    年齢  電話番号 22010/06/28 山田太郎  33才 090-×× 42010/07/01 石川花子   12才  090-×× 52010/07/01 岡田君子   15才  090-××   6  7 ・ ・ ・ ☆シート3 出力.cells(1,1)に日付を入力しボタンを押すと、その日付を基準にその日付の項目すべてを出力します。     1   2    3 12010/07/01 2  3  名前  年齢  電話番号 4 石川花子 12才  090-××  5 岡田君子 15才  090-××    6  7 ・ ・ ・ このようなVBAを作り出す場合、どのような文を書いたらよいのでしょうか。 VBAに詳しい方、アドバイスのほど宜しくお願い致します。

  • ExcelのVBAでCSVを読み込むと通貨になる

    Excel2010のVBAでCSVファイルを読み込んで処理させたいのですが、読み込んだデータをExcelが勝手に別のデータに変えてしまうので困っています。 例えば、123,456というデータは、フィールドにカンマがあるので、CSVでは"123,456"となりますが、これを以下のようなVBAのコードで読み込ませると、書式が通貨として扱われてしまって、データも123456になってしまいます。文字列として読み込まれていれば正しいデータとして読み込まれるように思うのですが、文字列として読み込ませる方法が分かりません。正しく元のデータ123,456のまま読み込ませるにはどうすればいいのでしょうか。 なお、CSVの各フィールドにカンマやダブルクォーテーションが混在していると、各フィールドに分割する処理が複雑でよく分からないので、下記のコードのようにExcelの機能でCSVを各フィールドに分割される方法で読み込ませたいです。 よろしくお願いします。 Workbooks.Open Filename:= "file.csv"

  • Excel VBAの質問です。

    エクセル2010を使用しています。 Excel VBA で二つのシートを比較して合致するレコードの行を削除する方法 値下げ,まとめのシートがありまして、 値下げ:b列に商品コードのデータ まとめ:a列に商品コードのデータ のようなExcelのデータがあります。 ここから、値下げのシートの商品コードを一つ一つ読み込みながら、まとめの商品コードと比較して、合致した値下げの商品コードの行を削除するプログラムを作りたいです。 商品コードのデータ数は毎回違い、値下げとまとめでも商品コードのデータ数は違います。 どなたかご教示いただけないでしょうか? よろしくお願いいたします。

  • エクセルVBAで質問です。

    エクセルVBAで質問です。 不用な空白行を削除したいのですが、どのようにコードを書いたらいいでしょうか? 添付の画像のような表を作っています。 添付のではAAからGGまでデータが入っていますが、いつもデータ数は違います。ただし20行目 より多くなることはありません。データ範囲の5行目から20行目まででおさまります。 このような条件で、データのない空白行を自動で削除するようにしたいと考えています。 よろしくお願いします

  • エクセルVBAとWEBクエリに関する質問です

    まったくの初心者ですが、エクセルのVBAとWebクエリを駆使して、 大量(1000強)のWebページから商品情報を エクセルへ入力していくプログラムを作成したいと考えています。 やりたいことは (1)エクセルのA列にurlを1000個並べ (2)プログラムを実行すると、上から順にurlへ自動でアクセス (3)各ページの商品情報を取得(テーブルデータ)し、エクセルに入力していく 例)B列:商品名、C列:商品番号、D列:通常価格、E列:カラー展開、F列:サイズ展開 という具合に、次々と自動で商品情報を入力していくプログラムです。 エクセルのVBAとWebクエリを活用して以上のようなことをするのは可能でしょうか? VBAにてLinkの取得や、Webクエリにてテーブルデータの取得ができるのは わかったのですが、自動でアクセスして、表ではなく区切り線ごとにデータを並べたいのです。 もし可能でしたらどのようにすれば可能になるか教えていただけないでしょうか。 不可能だとした場合は、何か可能になる方法をご教唆いただけないでしょうか。 お手数ですが、ご回答よろしくお願いいたします。

  • VBAに詳しい方に質問です。

    VBAに詳しい方に質問です。 私はVBA初心者です、お力添えのほどよろしくお願いいたします。 エクセルで入力し、それを一覧表に転記し、最終的に出力フォームにデータを呼び出し印刷するプログラムを作成しています。 1つの項目のデータを表に転記したり、呼び出すVBAはなんとか作成できました。 しかし、複数のセルのデータを表に転記するVBAが作ることができません。 ☆シート1 入力フォームがあり、 氏名・電話番号・住所等の項目を100人ほど表で入力します。 それらをシート2へ転記します。    1     2      3    4…   1  日付    名前    年齢   電話番号 2 2010/07/01 石川花子   12才  090-×× 3 4  ↓以下100名ほど入力 5  ※列も行も数値で表すように設定してあります。 ・ ・ ・ ☆シート2 これまでに入力したデータをすべて一覧表にします。 シート1のデータはこれまでに入力されたデータの下に転記されます。    1     2     3   4… 1 日付    名前    年齢  電話番号 902010/06/28 山田太郎  33才 090-×× 912010/07/01 石川花子   12才  090-××   92  ↑このように日付欄に空白を見つけ、そこからデータを転記する。 93 ・ ・ ・ 私が考えたVBAは、 sub 転記マクロ() set 入力 = worksheet("シート1") set 一覧 = worksheet("シート2") 日付1=入力.cells(2,1) 名前1=入力.cells(2,2) 年齢1=入力.cells(2,3) 電話1=入力.cells(2,4) 日付2=入力.cells(3,1) 名前2=入力.cells(3,2) 年齢2=入力.cells(3,3) 電話2=入力.cells(3,4) '以下○○100まで ※一覧.(縦,2)に縦+1をしていき""の場所を探す。 (すみません、データを会社に置いてきたので表記の仕方を忘れてしまいました^^;) 一覧.(縦,1)=日付1 一覧.(縦,2)=名前1 一覧.(縦,3)=年齢1 一覧.(縦,4)=電話1 一覧.(縦+1,1)=日付2 一覧.(縦+1,2)=名前2 一覧.(縦+1,3)=年齢2 一覧.(縦+1,4)=電話2 '以下+100まで end sub 何も見ずに思い出しながら書いたので、もしかしたらどこか間違っているかもしれませんが、 このような感じで書いていきました。 さすがにこのようなことを100回繰り返すのは大変なので、for next関数でなんとかならないか試行錯誤したのですがなかなか解明できず困っています。 詳しい方、どうか教えてください。

専門家に質問してみよう