- ベストアンサー
ユーザーフォームのコードから検索条件の設定
ユーザーフォームから、請求書を月別に作成するVBAを組みました。 コンボボックスで月度を選択し、オートフィルタをかけ値を請求書 フォーマットに転記させています。 月別に請求書を作れるようにはなったのですが、会社が100社程ある ので、その月に請求データがあるかどうかを個別に検索すると時間がかかってしまいます。 そこで下記の様に動作するようにしたいです。 1、選択した月に請求データがあるかどうかを検索 ※選択した月で実行させたときに検索、抽出条件・元データシートの会社名 2、ヒットした会社をリストに表示 ※リスト表示の際に複数選択できるのでしょうか? 3、選択した会社の請求書を作成する ※個別に作成は出来るので、roop処理でしょうか? この様にユーザーフォームから動作させるにはどのように したら良いでしょうか? 元データ = sheet1 請求書 = sheet2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
データの件数(毎月の件数や何年分の保存)を明示してないので、一案ですが 1、売上データも入力時に日付順に入力してある。 2、オートフィルターや配列関数を出来るだけ使わない。 オートフィルターも件数が増えると時間もかかりますし、100件となると大変だと思います。 例えば、売上シートが 5月31日 C社 請求月 6月2日 D社 2008/6/1 6月3日 A社 6月4日 A社 6月5日 A社 6月29日 A社 7月1日 A社 7月2日 B社 取引先マスターシート A社 4 B社 0 C社 0 D社 1 を作成して 売上シートのC2に請求月入れたとして =MATCH(DATE(YEAR(E1),MONTH(E1),1)-0.5,A:A)+1 6月最初のデータの行番号(仮にE29) =MATCH(DATE(YEAR(E1),MONTH(E1)+1,0),A:A) 6月最後のデータの行番号(仮にE3) が得られると思いますので、VBAでも利用します。 取引先マスターのB2セルに =COUNTIF(INDEX(売上シート!B:B,売上シート!E$2):INDEX(売上シート!B:B,売上シート!E$3),A1) 下フィルすると、取引先ごとに6月のデータの件数(有無)がでますので、この結果をVBAに利用してみてください。 例えば i=1 Do While Sheets("取引先マスター").Cells(i,1) <>"" If Sheets("取引先マスター").Cells(i,2)>0 '売上があるかどうか判断 STAGYOU = Sheets("売上データ").Range("E2").Value ENDGYOU = Sheets("売上データ").Range("E3").Value Do While STAGYOU <= ENDGYOU 'VBAの範囲を絞り込む ・・・ 条件で請求書シートにデータを入れる ・・・ STAGYOU = STAGYOU + 1 Loop End If i=i+1 Loop の様な構成ではいかがでしょうか。 データが多く保存などに時間がかかるようであれば、アクセスの導入検討してください。 アクセスで請求書(レポートやフォーム、サブフォーム)で検索すると いくらでも参考ファイルが出てくると思います。
その他の回答 (1)
- siroakaki
- ベストアンサー率47% (21/44)
元データからピボットテーブル作成し、該当月で請求データが1以上のものを集計すると、請求データがある会社一覧ができると思います。 そのピボットテーブル集計で表示された会社と該当月を条件にして、元データにフィルターをかけて、請求書フォーマットに転記して、印刷というのはどうでしょうか? リスト表示してから選択して実行させる場合、マルチセレクトできるかどうかは、不確かですが、プロパティウインドウ内で設定すれば、できたかと思います。ctrl+クリックで。
お礼
ご回答ありがとうございます。 (1)コンボボックスから月度を選択 (2)選択月度から一致する会社名をリストボックスに表示 (3)リストボックスにチェックONの会社の値と(1)の値を条件に検索 (4)請求書フォーマットに転記 を何とか作成できました。 ありがとうございました。