Excel VBAでデータを加工する方法
- エクセルでデータを加工する際、関数を使用すると処理が遅くなることがあります。そこでVBAを使用して作業を行う方法を模索しています。
- Sheet1とSheet2で取引先と支店名の情報が記載されています。Sheet1のC列に、Sheet1のA列のB列と一致する支店がSheet2に存在するかを確認したいです。
- 現在はSUMPRODUCT関数を使用してSheet1のC列にカウントしていますが、処理が重いです。他のSheetでVBAを使用して関数のような処理を行っている部分があり、それと同様の方法でVBAを使用したいです。お力を貸してください。
- ベストアンサー
エクセル VBAで関数
こんばんわ。いつもお世話になっております。 エクセルでデータを加工しているのですが、関数で加工するととても遅くなってしまうので なんとかVBAで作業できないかと模索中です。 Sheet1の、A列=取引先 B列=支店名 となっており、それが3,000行ほどあります。 Sheet2も、A列=取引先 B列=支店名 となっており、 Sheet1のC列に、Sheet1のA列のB列という支店が、Sheet2にあるか確認したいのです。 現在は、Sheet1のC列に、SUMPRODUCT関数でカウントさせているのですが、大変重いです。 ほかのSheetで、VBAを使って関数のような働きをさせている部分があります(前任者作成) そのように、なんとかVBAを使用したいのですが、なかなかうまく出来ません・・・。 どうか、お力を貸してください!! うまく説明できなくて、わかりづらかったらごめんなさい。 よろしくお願いいたします。
- hyorono
- お礼率83% (40/48)
- オフィス系ソフト
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ではこんな方法はどうでしょう。 高速化が見込めるかは未確認です。 1.Sheet1と2両方に空白行を挿入。 2.両方のシートのA1を「=CountA(A2:A65536)」とする。 3.Alt+F11でVBE画面を表示する。 4.挿入、標準モジュールをクリックする。 5.以下のFunctionプロシージャを貼付け。 6.Sheet1のC2を「=KOUSIN(A2,B2,Row())」 Function KOUSIN(sHonten as String, sShiten As String, iRow as Integer) as Integer Dim i As Integer Dim j As Integer j = Sheets("Sheet2").Range("A1").Value + 1 i = iRow KOUSIN = Application.Evaluate("=sumproduct((Sheet2!A2:A" & j & "=""" & sHonten & """)*(Sheet2!B2:B" & j & "=""" & sShiten & """))") End Function
その他の回答 (1)
- soaikats
- ベストアンサー率58% (14/24)
何かしらの更新がかかるたびに再計算がかかっていると 思われます。必要な時だけ更新処理を流すようにしては? 1.Sheet1と2両方に空白行を挿入。 2.両方のシートのA1を「=CountA(A2:A65536)」とする。 3.Sheet1に以下のSubプロシージャを貼付け。 Sub KOUSIN() Dim i As Integer Dim j As Integer j = Sheets("Sheet2").Range("A1").Value + 1 For inti = 2 To Range("A1").Value Range("C" & i).Value = Application.Evaluate("=sumproduct((Sheet2!A2:A" & j & "=""" & Range("A" & i).Value & """)*(Sheet2!B2:B" & j & "=""" & Range("B" & i).Value & """))") Next inti End Sub いかがでしょうか。
補足
アドバイスありがとうございます! なるほど、再計算ですね~ 参考になります!! ですが、ごめんなさい。 知りたいのは、マクロの中で計算させて、結果のみ表示なんです><。 せっかく時間を割いてくださったのに、本当にすみません もしよかったら、結果のみ表示させる方法をご教授願えないでしょうか・・・。 もうしばらく、このまま回答をお待ちしております。 ありがとうございました!
関連するQ&A
- エクセルの関数(~以外)
http://okwave.jp/qa4938678.html にて質問させて頂いた者です。 また、ご存知の方がいらっしゃいましたら教えていただけたら幸いです。 A列 B列 C列 D列… 1 ID 部名 課員 取引先… 2 1 A a 関西 3 2 A c 関東 4 3 A b アメリカ 5 4 A a 関東 6 5 A a 中国 7 6 A a 台湾 [シート名:入力] A列 B列 C列 D列 E列… 1 地域 a b c 合計(←上記シート「入力」の課員) 2 関東 1 1 1 3 3 関西 1 0 0 1 4 その他 2(Q1)0 0 2 [シート名:合計] (Q1)=SUMPRODUCT(入力!$C$2:$C$7="a")-((COUNTIF(入力!$H$2:$H$7,"関東")+COUNTIF(入力!$H$2:$H$7,"関西"))) と入力すると、本来の答えは「2」のはずがマイナスと出てきてしまいます。 求めたい式は 「a員であって、関東と関西以外の取引先」です。 メインの取引先が「関東」と「関西」で、一方で海外の取引先が(この表からは伺えませんが…)あまりないのですが、地域が広く数が少ない(例えばアメリカ:1、タイ:1、といった具合)ので、「その他」という項目をたて、そこに全て落とし込みたいと考えています。 前任者のデータを引き継ぐ形となり、去年とは少し違う集計方法・データ抽出になるに伴い出てきた問題です。 前任者はSUMPRODUCT関数を多用しているので、できれば去年までのデータに干渉しないかたちでできるだけおおくの部分を引き継ぎたいと考えているのですが…何か良い方法があれば教えて頂ければ幸いです。
- ベストアンサー
- オフィス系ソフト
- エクセル、VBA、抽出複数検索について
エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
- ExcelのVBAについて
ExcelのVBAについて VBA全くの初心者です。 以下のような処理を行いたいのですが、どなたかご教授をお願いします。 以下のように支店(1)~(3)のシートがあります。 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、 一致しない行を不一致データシートに出力する もう一つ別のマクロで、 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、、 一致する行を一致データシートに出力し、D列に対象データがあるシート名を表示する ※可能でしたら、E列に対象データがある行番号も表示する -------------------------------- シート名:支店(1) A B C 商品No 商品名 備考 011 商品A 備考A 009 商品B 備考B 015 商品C 備考C -------------------------------- シート名:支店(2) A B C 商品No 商品名 備考 008 商品A 備考A 023 商品B 備考B 004 商品C 備考C -------------------------------- シート名:支店(3) A B C 商品No 商品名 備考 007 商品A 備考A 033 商品B 備考B 018 商品C 備考C -------------------------------- シート名:入力シート A B C 商品No 商品名 備考 ※ここに複数行入力する -------------------------------- シート名:不一致データシート A B C 商品No 商品名 備考 ※ここに出力される -------------------------------- シート名:一致データシート A B C 商品No 商品名 備考 ※ここに出力される
- 締切済み
- Visual Basic
- エクセルVBA及び関数
初心者です。お教えお願いします エクセル2003です 空白行及び0をなくしたいのですが(C列を入力された時点で自動でE列のようにしたい) 関数の場合及びVBAのシートコードを両方教えていただけないでしょうか VBAのコードは勉強の為です Sheet1 A B C D E F 16 文字A 文字A 17 文字B 文字B 18 0 文字C 19 文字C 文字D 20 0 文字E 21 文字D 文字F 22 23 文字E 24 25 文字F 文字はC16~C80まで入っております B16~E80までのセルのみで行いたいのですが 他の場所は関数やグラフ等がすでに入ってますのでいじりたくありません E16~をフォームのコンボボックスのリストにしようと思ってます よろしくお願いましす
- ベストアンサー
- オフィス系ソフト
- エクセルの関数について
エクセルの関数について ある条件での最大値、最小値を求める関数はないですか。 表のシートとは別シートに一覧として出力したいのですが。 例 A列 B列 支店名 金額 この場合の支店別の最大値、最小値を求める関数はないですか。
- ベストアンサー
- その他MS Office製品
- Excelの関数またはVBAについて
A1-B1の結果がC1に出るような表を作りました。C1の結果が自動でA1に表示され、ループするようにしたいのですが VBAになるのでしょうか?VBAは全くわからないので、できれば列を挿入するなどして関数で出来たら。。。と思ってます。すいませんが、ご教授ください。お願いします
- 締切済み
- オフィス系ソフト
- 関数を使ってデータの抽出
win excel97を使用しています。 sheet1に下記のようなデータが3000件程度あります。 A B 会社名 取引先会社名 2 aaa ○○ 3 aaa ■■ 4 bbb △△ 5 bbb ◆◆ 6 bbb ●● 7 ccc ×× sheet2のB~のセルに、sheet1の取引先会社名を列方向に 抽出させてたいのですがどうしたらよいでしょうか? マクロやVBAは苦手なので関数で教えていただきたいです。 sheet2 A B C D 会社名 取引先会社名1 取引先会社名2 ・・・ 2 aaa ○○ ■■ 3 bbb △△ ◆◆ ●● 4 ccc ××
- ベストアンサー
- オフィス系ソフト
- Excel VBA Find関数の使い方
下記のようなマクロを作りたいと思います。 <シート名:元データ> B列(商品番号)がA列(ファイル名)に含まれていれば、 A列のファイル名をC列(チェック)に転記するものです。 <シート名:完成形> やりたいことの完成形がこちらのシートです。 詳しいデータは画像データを添付しました。 Findを使用するところまでは調べたのですが、VBA初心者のため シンプルな方法があれば教えてください。
- ベストアンサー
- その他MS Office製品
- VLOOKUP関数をVBAで書くには
EXCEL VBAの初心者です VLOOKUP関数をVBAで書きたいのですが、よくわかりません すいませんがどなたかご教授、願えないでしょうか? sheet1 sheet2 A B A B 名称 CD 名称 CD 滋賀県 25 滋賀県 25 京都府 26 大阪府 27 大阪府 27 兵庫県 28 兵庫県 28 sheet2のA列をキーにsheet1のA列と照合して sheet2のB列にsheet1で一致した行のB列をコピーする VLOOKUP関数を使うと、sheet2のB2は =IF($A2="","",VLOOKUP($A2,Sheet1!$A$2:$B$5,2,0)) としたら、25を得ることができました VBAでする場合、どのように書けばいいのでしょうか? よろしくお願いします
- ベストアンサー
- Visual Basic
- エクセルでHLOOKUP関数の選択範囲について
エクセルでHLOOKUP関数を使って、検索したいのですが、 シートは、一覧表のシートと データが入っているA101、B203、C305、...シートは300シートくらいあります。 一覧表のシートには、下のような表になっていて、 A列 B列 C列 D列 ... 1003、1004、1005、1006、... 2行目 A101 3行目 B203 4行目 C305 . . . データのはいっているシート、A101は下の表になっています。 B列 C列 D列、・・・、Z列 2行目 1004、1005、1006、... 3行目 100、 200、 150、... 一覧表のB列の2行目には HLOOKUP(B2、シートA2のB2:Z3、2行目、FALSE) という感じで、シート名をセルA2のものを参照にして 探して表示させ、B列、C列、D列の2行目から下の行も 表示させたいのですが、うめくできませんでした。 INDIRECT関数を使ってみましたが、セル範囲が無効という エラーがでてしまいます。↓こんな感じで入力してみたのですが... SUMPRODUCT((INDIRECT($A2&"!$B$2:$Z$3"))=$B$1,(INDIRECT($A2&"!$B$2:$Z$3"))) 1つづつデータを見て手打ちはデータが多く、 どんどんデータが増えていくので できれば関数を使って表示させたいと思っています。 詳しい方いらっしゃいましたら、どうか教えてください よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
アドバイスありがとうございます!! お礼が遅くなってしまい、申し訳ございませんでした とても勉強になります^^ このアドバイスを参考に、今後も頑張って勉強しますね!! またぜひお知恵を拝借させてください^^ 本当にありがとうございました。