[[20050415103520]] 『マクロについて』(まりお) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロについて』(まりお)

 WindowsXP Excel2000です。
 またまた、お世話になります。
 今度はマクロについてなのですが、この学校の過去ログや Let's Excel VBA 
 入門講座などを拝見してがんばろうと思ったのですが理解できませんでした。
 マクロの自動登録をやってはみたのですが、それから先に進むことが出来ず、
 わからないでいます・・・トホホ 
 とりあえず、表と何をしたいのかを記載しますので、誰か助けてください。

     A       B      C      D       E          F      G      H      I       J  
 2  日付 工事番号 コード 費目 取引先名 メーカー 品名  数量 単価  金額
 3 12/15  C05-001  805   材料費  ○○会社        金型  1  50,000 50,000
 4  1/10  C05-002  836   消耗品@××会社        ハケ    2      400    800
   ・
   ・
   ・
 と2000件ほど入っています。(これからも増え続けます。)
 工事番号・メーカーは入っていないこともあります。

    L       M     N     O       P       Q       R
 2 805     826   832   836     856     521     545
 3 材料  外注 修繕 消耗@ 雑費@ 消耗A 雑費A
 4 ○○会社      ××会社 
 5 ・ 
 6 ・
 と費目の下に会社名が60件ほど入っています。
 ほんとうは会社名をいれると費目が表示されるようにしたいのですが、
 設定がわからないので、C列に数字(コード)を入力すると費目が表示されるように
 しています。 

 D(費目)=IF(C3="","",HLOOKUP(C3,$L$2:$R$3,2,0))
 J(金額)=IF(ISBLANK(I3),"",H3*I3) 
 と関数が入っています。

 この表一つで作りたいものは、
 月別    ○/21〜○/20     と日付を入れると該当する一覧が表示される。
 工事別  C05-001           と工事番号を入れると該当する一覧が表示される。
 費目別  ○/21〜○/20 材料費  と月日と費目を入れると一覧が表示される。
 取引先別  ○/21〜○/20 ○○会社 と月日と会社名をいれると一覧が表示される。

 すべてを教えていただくことにはなるかと思いますが、よろしくお願いいたします。


 ご希望のことは「ほぼ」オートフィルタ、およびそのオプションで可能かと思います。
表のいずれかのセルを選択し、データ>フィルタ>オートフィルタ
で見出し部分にプルダウンボタンが現れます。
 工事別  C05-001
を抽出したい場合は工事番号見出しのプルボタンをクリックして
該当工事番号をリストから選択すると該当する一覧が表示されます。
日付の期間での抽出は日付のリストから(オプション)を選択し、
表示されたダイアログで抽出条件を設定して抽出できます。
また、「日付期間抽出」>「費目別抽出」・・・
と複数項目で絞込みをしていくことができます。
 
「ほぼ」という表現を使ったのは、リストに表示できる重複の無いリスト項目数が
ある程度限定されるためです。1000件ぐらいであると記憶していますが、
たとえば、工事番号が2000種類あっても、リストには全部表示できない、という意味です。
(みやほりん)
#> ほんとうは会社名をいれると費目が表示されるようにしたいのですが、
#会社名によって費目が決まっているということでしょうか。


この掲示板の質問「システムの作成」 と類似の質問ですね。
 あちらで考え方(作成手順)を簡単に示しています。
 ここで違う(難しい)のは、範囲で検索する部分があることですね。
 この場合、範囲は二つの別のセルに記載して、検索時に
 両方で検索して両方を満たしたものを探し出すという手法に
 なります。そこが違う点ですが、基本は同じでえすね。
  この流れをコードで記載するれば、システムが作れます。(なお)


 みやほりんさん、なおさん、回答ありがとうございます。
 オートフィルタは使ってみたのですが、範囲が広いのと、月を何ヶ月にもわたって(約1年分)入力しなければいけないので、フィルタではゆくゆくはおいついていかないと、
 思ったのです。
 なおさんの、”この流れをコードで記載・・・というのが、わからないのです。
 「システムの作成」はあまりにも簡単に示しすぎて、なにをどうすればいいのか
 わかりません。申し訳ないのですが、もう少し詳しく教えていただけません
 でしょうか。
 (まりお)


 「システムの作成」といっても、たいそうなものにはならないと思いますよ。
あくまで別シートでの抽出をお考えですか?
「オートフィルタオプションの設定」と「可変範囲名」を組み合わせたものを
マクロの記録してみてはいかがでしょう。
モトのリストがSheet1にあるとします。
A列にはリストの最後まで空白セルがないものとすると、
リストの範囲を可変の名前つきの範囲に設定できます。
挿入>名前>定義で下記のように設定してください。
名前 LIST
参照範囲 =INDIRECT("Sheet1!A1:J"&COUNTA(Sheet1!$A:$A))
 
 次に、抽出するシートをSheet2とすると、下記のように見出しを2段作ります。
 
     A       B      C      D       E          F      G      H      I       J  
 2  日付 工事番号 コード 費目 取引先名 メーカー 品名  数量 単価  金額
 3                    ○○会社
 4  日付 工事番号 コード 費目 取引先名 メーカー 品名  数量 単価  金額
 
Sheet2を選択した状態でツール>マクロ>マクロの記録でマクロの記録を開始します。
データ>フィルタ>フィルタオプションの設定
表示されたダイアログで次のように設定します。
 
抽出先      指定した範囲
リスト範囲    LIST
検索条件範囲   Sheet2!$A$2:$J$3
抽出範囲     Sheet2!$A$4:$J$4
 
としてOK。上記の例だと、「○○会社」が5行目以下に抽出されるはずです。
うまく抽出できたら、ツール>マクロ>記録終了で記録終了します。
Sheet2の3行目へ抽出条件を記入し、記録したマクロを実行してください。
(みやほりん)


 みやほりんさん、ありがとうございます。
 お返事が遅くなり申し訳ありません。
 上記のマクロ設定は、なんとか設定することができたのですが、
 上司に言われたものと少し違うように思うのです・・・。
 文章では説明しにくいのですが、とりあえず、書ける範囲で書いてみます。
 まず、納品を管理しているシートがあり、同じシートに、
 月別・工事別・費目別・取引先別というボタンがあり、
 そのボタンを押すと、○/21〜○/20や工事番号など、条件を入力する画面が出てきて、
 "OK"なり、"実行”なりのボタンを押すと、その条件に当てはまる一覧が表示される。
 みたいなかんじのものを、作成してほしいと、言われたんです。
 マクロのことはまったくわからず、エクセルも初心者の私にとって、すごく難問
 なのですが、ゆっくりでいいので、完成させたいと思っています。
 誰か見捨てずに、ご教授いただける方、よろしくお願いします。
 (まりお)

 >パソコンがすごいことに なってしまって
どんなことになってしまったんでしょうか。
少し興味があるところですが・・・(他人の不幸を喜んでいるわけじゃないですよ)
 
>条件を変更するたびにマクロの実行をしないといけないのでしょうか?
それはその通り。
 
>そのボタンを押すと、・・・・・・条件を入力する画面が出てきて、
ユーザーフォームに条件を入力するテキストボックスなどのコントロールを
配置するなどしてユーザーフォームを設計。
シートにボタンを配置してユーザーフォームの呼び出し、
ユーザーフォームで各種条件を入力して先ほど記録したマクロを実行させる、
という形になります。
つまり、核になるのはマクロで記録したAdvancedFilterメソッドです。
条件をシートに入力するか、ユーザーフォームを作成して入力するかの
違いだけです。[まりお]さんがめげなければきっと出来ます。
私も学校の回答のために割ける時間は1日一時間程度なので、
それでよければお付き合いいたします。
 
まずは、マクロを設計するに当たって、次の要件について書き込みお願いします。

(みやほりん)(-_∂)b


 みやほりんさん、見捨てずに回答いただきありがとうございます。m(..)m
 >ユーザーフォームに条件を入力するテキストボックスなどのコントロールを
 配置するなどしてユーザーフォームを設計。
 シートにボタンを配置してユーザーフォームの呼び出し、
 ユーザーフォームで各種条件を入力して先ほど記録したマクロを実行させる。
 この方法がいいのですが・・・

 上記の要件について、回答いたします。
 --データのあるシート名とデータの範囲
 シート名・・・・・納品書
 データの範囲・・・
     A       B      C      D       E         F      G      H      I       J  

 2  日付 工事番号 コード 費目 取引先名 メーカー 品名  数量 単価  金額
 3 12/15  C05-001  805   材料費  ○○会社        金型  1  50,000 50,000
 4  1/10  C05-002  836   消耗品@××会社        ハケ    2      400    800
    ・
    ・
    ・
 以下、現在で 1200まで入っていて、以後延々と続く予定です。

 --データを抽出するシート名
 ”項目別”とでもしておきます。(まだ決まっていません)

 --データを抽出するための検索条件範囲を入力するセル範囲(マクロの記録したものと
 同じでなくてもよい)
 ごめんなさい、これはよく意味がわかりません。
 検索条件は日付(○/21〜△/20)と工事番号と費目と取引先名なので???
 どう、範囲を指定したらいいのでしょうか?
 ボタンを押すと日付等を入力する画面が出てくるのではないのでしょうか?
 バカでごめんなさい・・・

 --ボタンを配置するシート名
 ボタンはデータのある”納品書”シートに配置したいです。

 ボタンの質問事項のところで、日付のみ? 工事別のみ? 日付+費目?
 日付+取引先名? と聞いてくるものはできるのでしょうか?
 検索したいのは、この4項目なので・・・。

 すみません。こんなかんじでいいのでしょうか?
 どうぞ、よろしくお願いいたします。m(__)m(まりお)

 今日中はちょっと取り掛かれないので、明日までに粗案を挙げます。(みやほりん)(-_∂)b


 レスが遅くなってしまいました。
ボタンクリックでフォームを呼び出すところまで。
【ボタンの作成】
シート「納品書」にボタンを配置します。
""表示>ツールバー>コントロールツールボックス""でボタンを選択、
シート「納品書」の適当な位置へ配置します。
 
【ボタンクリックのイベントマクロ作成】
配置したボタンを右クリック、""コードの表示""を選択してください。
Private Sub CommandButton1_Click()
 
End Sub
VBEが起動して、↑のようなClickイベントマクロが自動作成されます。
 
【ユーザーフォームの作成】
VBEのメニューで""挿入>ユーザーフォーム""で
ユーザーフォーム(ユーザーフォームモジュール)が自動作成されます。
 
【ユーザーフォームを呼び出すマクロの作成】
VBEの左側、プロジェクトエクスプローラで「Sheetn(納品書)」となっている
シートモジュールをダブルクリックしてください。先ほど自動作成された
ボタンクリックのマクロが表示されるので、次のように書き足してください。
 
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
 
【ボタンクリックでユーザーフォーム表示】
VBEを×ボタンで閉じ、Excelに戻ります。コントロールツールボックスツールバーの
「デザインモードの終了」ボタン(定規と鉛筆のボタン)をクリックして
デザインモードを終了します。先ほど配置したボタンをクリックしてみてください。
 
(みやほりん)(-_∂)b

 みやほりんさん、ありがとうございます。
 ゆっくり進めていけて、すごく丁寧に説明していただいて、
 わかりやすいです。これからも、長くなるとは思いますが、
 よろしくおねがいします。(まりお)


 あれから、Excel全開VBAなど、いろいろなサイトを見て、
 勉強しているのですが、思うものが見つかりませんでした。
 やっぱり無理みたいです。
 今までありがとうございました。(まりお)

 [まりお]さん、私のフォローが悪く、また、まとまった時間が取れず申し訳ありません。
今週末にはサンプルらしきものを提示して、と思っておりましたが・・・。
(みやほりん)(-_∂)b

 つくりかけだったので、とりあえず仕上げてみました。
サンプルファイルです。
リンクを右クリック、「対象に名前をつけて保存」でダウンロードしてから
お試しください。
【削除済み】 http://club-ftp.excite.co.jp/pub/q/01/TEST0423.xls
(みやほりん)(-_∂)b

 みやほりんさん、ありがとうございます。
 一生懸命、サイトを探したりしてたのですが、
 なかなか思うものがみつからず(というか、わからず)、
 あきらめかけていたので、とってもうれしいです。
 ほんとうにありがとうございました。m(__)m
 やはり、VBAは奥が深いですね。コードを理解しようと、
 何度も目を通してみるのですが、なかなか難しいです。
 こんなプログラムを自分で考えれるようになるには、
 どれくらいかかるのでしょうか????気が遠くなりそうです。
   (まりお)

 [まりお]さん、こんにちは。
改良版を作れると思うので、明日まで時間をください。
> こんなプログラムを自分で考えれるようになるには、
> どれくらいかかるのでしょうか????気が遠くなりそうです。
私はExcelは十ウン年選手なので、覚えが悪いほうなのですが、
こちらで回答をつけていらっしゃる方の中には
VBAを始めて1年以内にマクロの回答をされている方も複数いらっしゃるので
それほど気の遠くなるようなことでもないように思えます。
 
(みやほりん)

 みやほりんさん、ありがとうございます。
 以前はマクロなんてみたこともなかったし、関数さえさわっていませんでした。
 ただ、文字入力・表作成をするくらいでとどまっていたので、
 ここにきて、初めて遭遇することばかりです。
 物覚えのいい人なら、VBAを1年ですか?
 私はもう少しかかりそうです・・・・
 でも、少しずつはがんばろうと思います。
 ほんとにすべてお任せすることになってしまって、申し訳ないですが、
 改良版をお待ちしております。お願いいたします。

 もう一点追加したいことがあるのですが、
 項目別シートで、抽出した分の合計金額を一行目に
 表示させたいのですが、ただ行を挿入するだけでは、
 マクロに影響があるようで、うまく出来ませんでした。
 次々とあつかましいとは思いますが、よろしくお願いします。

 何度も何度も訂正を入れてすみません。
 工事番号に改正の記号がついているものがあり、
 例えば、C05-001が正規の工事番号だとすると、
 C05-001AとかBとかいろいろな記号が入ることがあるのです、
 この改正の工事のときは正規の工事費に入れたいので、
 工事番号を抽出するときに、検索の画面でできるように、
 ”〜を含む”とかにしたいのですが、できますでしょうか?
 コンボボックスにしてしまうと無理なのかな????
 何度も何度も本当に申し訳ありませんが、よろしくお願いします。
 (まりお)


 まだ、取り掛かったばかりですが、
【行挿入してなぜ動作しなくなったか】
データの抽出自体は「フィルタオプションの設定」を記録したものに
手を加えたもので行っています。下記がそうですが、
    Worksheets("納品書").Range("List").AdvancedFilter _
            Action:=xlFilterCopy, _
            CriteriaRange:=MyRng, _
            CopyToRange:=.Range(.Cells(3, 1), .Cells(3, 256).End(xlToLeft)), _
            Unique:=False
 
Action:=xlFilterCopy が「指定範囲への抽出」
CriteriaRange:=MyRng が「検索条件範囲」
Unique:=False が「重複するレコード」の処理をそれぞれ規定します。残った
CopyToRange:=.Range(.Cells(3, 1), .Cells(3, 256).End(xlToLeft))
が「抽出範囲」の設定になります。
 
.Cells(3, 1)が「A3」セル、
.Cells(3, 256).End(xlToLeft)が「IV3からCtrl+←で選択されるセル」
つまり、3行目に入力された見出し項目が抽出範囲の先頭行になります。
 
実際には抽出前に「検索条件範囲」に割り当てる1行目、2行目を挿入、(.Range("1:2").Insert)
抽出完了後、この1,2行目を削除して元に戻している(.Range("1:2").Delete)ので、
マクロ実行前の「項目別」シートの1行目が抽出用の実際の見出し範囲となります。
 
この部分を変更せずに一行挿入してしまうと、抽出用の見出しが想定範囲から
「さようなら」してしまうので期待した動作はしなくなります。
一行挿入する場合はそれに合わせたコードにしなくてはなりません。
CopyToRange:=.Range(.Cells(3, 1), .Cells(3, 256).End(xlToLeft))
↓
CopyToRange:=.Range(.Cells(4, 1), .Cells(4, 256).End(xlToLeft))
 
【あいまい検索】
「〜を含む」のようなあいまい検索自体はとくに難しいことではありませんが、
コンボボックスへ設定する「工事番号」はどのように扱いますか?
「正規の工事番号」だけをコンボボックスのリストとするのか、
それとも、「改正の記号」のついた工事番号もリストとするのか・・・。
(みやほりん)(-_∂)b

 みやほりんさん、わかりました!
 詳しい説明ありがとうございます。
 こうして一つ一つ説明していただくと、超初心者の
 私でも、わかりやすいです。
 で、CopyToRange:=.Range(.Cells(4, 1), .Cells(4, 256).End(xlToLeft))
 に変更し、一行目に合計を出すマクロを自動設定でやってみて、
 いらないコード?を消し、作動するのは確認したのですが、
 これであっていますでしょうか?

 Sub Macro1()
'合計を出す
    ActiveCell.FormulaR1C1 = "合計金額"
    ActiveCell.FormulaR1C1 = "=SUM(R[2]C[5]:R[999]C[5])"
 End Sub

 あと、「工事番号」ですが、C05-001が含まれるすべての番号(AやBの記号のついた
 もの)、(工事番号が複合されているもの(C05-001,002とかC05-001〜003などがある)
 を表示し、チェックなどを入れてどれを抽出するかを選べる・・・
 みたいなことが出来ればいいなとは思っているのですが・・・
 それか、”C05-”までを抜き出し、001や001Aや001〜003が表示されたらチェックを
 入れて抽出できる方法。
 どちらでもいいのですが、例えばC05-001〜003の場合”003”を抽出したい時も
 あるので、こちらも抜き出せるように出来る方法がいいです。
 ややこしいことばかり言って申し訳ないですが、よろしくお願いします。
 (まりお)

 工事番号のパターンがいっぱいありますね。
C05-001
C05-001A
C05-001,002
C05-001〜003
とくに、C05-001〜003の場合はC05-002を指定したときも
抽出対象にしたいということですよね。C05-001〜009とかになる可能性も
あるということでしょうか。
(みやほりん)

 そうなんです、工事番号のパターンがいっぱいあって、条件に困っているのです。
 納品してくる会社によって、表示のパターンが違うし、このほかに、−でくくる
 会社や、","と"〜"をまぜて表示する会社もあります。
 みやほりんさんの指摘の通り、C05-001〜003の場合はC05-002を指定したときも
 抽出対象にしたいし、C05-001〜009とかになる可能性もあります。
 ただ、一つ確定していることは、C05-には意味があり、"C"のアルファベット部分は
 工事を請けた会社を記号で表しているもの(全部で20種類位)で、"05"は年数
 (2005年の05)です。なんとかなりますでしょうか?
 (まりお)

 お待たせしております。
とりあえず「工事番号」についての考察。↓
http://miyahorinn.fc2web.com/schooltxt/ex050426.html
サンプルマクロはテスト用のものなので、実際のデータには使用しないでください。
試す場合は新規ブックにデータコピーしたものを対象に実行してください。
(みやほりん)

 「工事番号」についての考察を読ませていただきました。
 やはり、難しいんですね・・・それとマクロの設定をコピペしたのですが、
 表について変化がなかったので、よくわかりませんでした。すみません。
 昨日ちょうど上司と「工事番号」についての話をしていたところで、
 ”〜”や”,”や”−”のついているものは、検索しにくいです。
 改正のアルファベットはいいですが、全部個別に分けることは無理ですか?
 と質問したところ、業者の方にその旨を伝え、訂正してもらえるか確認する。
 と返事が返ってきました。
 今まで入力してきたデータがありますので、せめて以下の検索が出来るようにだけでも
 設定できたらうれしいのですが・・・
 C05-001
 C05-001AB
 C05-001,002,003
 よろしくお願いします。
 (まりお)

 私の表現が悪かったですね。サンプルマクロは新規シートのA列へ
C05-001
C05-001A
C05-001,002
C05-001〜003
のようなデータを入力しておいて、変換したいデータを「選択して」実行すると
選択したデータのB列、C列へコードを分解する、というものでした。
「001〜003」を「001,002,003」のように展開できれば、真ん中の「002で抽出」もできるはずです。
今夜〜明朝にはある程度形のあるものを提示できるでしょう。(みやほりん)

 展開のマクロと理解できずにすみませんでした。
 新規シートで実行してみたら、出来ました。分解をしたほうが選択するマクロを
 くみやすいのですよね。ごめんなさい、何も分からないのでまかせきりに
 なってしまっていますが、よろしくお願いします。
 (まりお)

 [まりお]さん、おはようございます。お待たせしているかもしれませんが
昨晩、取り掛かれない事態が発生したため、予定通り行きませんでした。
今晩何とかしたいと思います。(みやほりん)


 みやほりんさん、ご連絡ありがとうございます。
 お忙しいのにすみません。よろしくお願いします。(まりお)

 まだちょっと手を加える必要がありますが、暫定で。
http://club-ftp.excite.co.jp/pub/q/01/TEST0429.xls
(みやほりん)(-_∂)b


 みやほりんさん、遅い時間までありがとうございます。
 サンプルを拝見させていただいたのですが、
 ”抽出”を押すと、実行時エラー'1004':'Worksheets'メソッドは失敗しました:
 'Global'オブジェクト とメッセージが出て、サンプルを見ることが
 出来ませんでした。o(-_-;*) ウゥム…
 工事番号の件ですが、一応今入っているすべてのデーターには"〜"や"−"を
 使わずに、すべて","でくくるように入力しなおしています。
 せっかく、展開のマクロを考えていただいたのですが、これからは、
 入力時に","を使わないようにしていきますので、展開なしの方法で
 考えていただけませんでしょうかm(__)m
 ほんとうに多大なるお時間をとっていただいたのに申し訳ありません。
 よろしくお願いします。(まりお)

 エラー発生時「デバッグ」でどの行でストップしているか確認して報告願います。
(Userform1 Show でストップしているようなら、F8キーで一行ずつ実行して
エラーの出る行まで進める必要があります。)
一応動作はWin XP,XL2000環境で確認しています。
なお、データは下記のようなデータ形式なら現状のままでも対応します。
C05-002,003,004,005,006
コンボボックス用のデータを作成する部分でもあるので、あまりコードの
ダイエットにはならないかも。
(みやほりん)(-_∂)b


 エラーの報告をさせていただきます。
 Worksheets("工事番号マスタ").Range("2:65536").ClearContents

 この部分が黄色になってストップしています。
 コードのダイエットは難しいですか。残念です。
 (まりお)

 ありゃりゃ、ずいぶん先頭のほうで。
ClearContentsメソッドでセルの内容を消しているだけだから、
該当エラーが出るような問題はないはずなんですが、
     Worksheets("工事番号マスタ").Range("2:65536").Delete
に書き換えてみたらどうなりますか?
(みやほりん)(-_∂)b

 みやほりんさん、ごめんなさいm(__)m,m(..)m,m(__)m
 サンプルファイルを開くときにダブルクリックをしていました。
 右クリックで保存して開いたサンプルはきちんと作動しています。
 本当にごめんなさいです。

 すごい・・・すばらしいものが出来ていますね。
 もう完成!!でいいんですよね。ありがとうございました。(*^▽^*)ノ 
  (まりお)

 現段階では「最近マクロスキルが落ちてきたみやほりんの練習&サンプル」程度に思ってください。
もしよければサンプルブックへデータをコピーして不具合な点があれば
書き込んでおいていただけるとありがたいです。
(みやほりん)

 わかりました。昼からデータをコピーして、もし不具合が出るようなら
 書き込んでおきます。
 私も、明日から会社がお休みになり、連休後しか見ることができないので、
 今日中に確認したいと思います。
 ありがとうございます。
 (まりお)

  今夜やっと仕事から解放されますので、
月曜日までにまとめてやっちゃいます。しばしお待ちを。(みやほりん) 

 ありがとうございます。
 月曜日を楽しみに待っています。
少しコードをさわりました。

 Rem 工事番号の後半部分を変数に格納
         MyStr = Mid(MySub(i), 5)
         If Len(MyStr) <= 7 Then
                         ===
 数字を4から7に変更しました。
 これで、BRとかLUG1なんかの変則な記号も読み取ることが出来ました。
  (まりお)

 お待たせしました。ダイエット(?)バージョンです。
http://club-ftp.excite.co.jp/pub/q/01/TEST0509.xls
工事番号については C05-LUG1 や C05-001A,002,004 といった形式なら
対応できてます。
・・・というか抽出自体にはこの形式なら全然問題はないんですよ。
「C05を含む」かつ「002を含む」データを検索すればよいのですから。
コンボボックスで「C05」を選択した後に「C05」に関連した工事番号だけを
いかに次のコンボボックスで表示させるか、というのが人によってやり方が
分かれてくるところでしょう。
 
さて、[まりお]さんの提示していらっしゃるマクロですが、
決まったセルに行う処理でそれが問題なく動いているのなら、
記録したもので十分間に合うはずです。
敢えて意見を求められるのであれば、
2行目の書式、また、データ範囲の列幅などは一度そのように設定してしまえば、
おそらく変化ないのではないかと思いますが、どうでしょうか。
(フィルタはセルをコピーしているわけではないので、列幅までは再現しない)
数式もB1へ=SUM(H:H)を入力しておけば毎回マクロで入力する必要はないように思えます。
I列J列の表示形式も「元データ」である納品書シートのものが継承されます。
[まりお]さんが物足りなく思えたのはみやほりんの作り込みが足りないからでしょう。
なお、抽出後データ部分の罫線については今回のサンプルブックでは
条件付書式に一任しております。
(みやほりん)(-_∂)b 


 すごいです!!ありがとうございました。(*^▽^*)ノ 
 みやほりんさんのプログラムですべて出来ていました。
 やはりあの時点では、まだだったんだ・・・ということしか
 今はわかりませんが、たくさん勉強してみやほりんさんまで、とは
 いかないと思いますが、少しずつでも自分でプログラムを作成できるように
 がんばりたいと思います。
 ほんとうに、ほんとう・ほんとうに長い間ありがとうございました。
 感謝・感謝・感謝・感謝!!!!!です。m(__)m,m(..)m,m(・・)m,m(..)m,m(__)m
 (まりお)

 みやほりんさま、何度も何度も申し訳ないのですが、不具合が発生しました。
 今出来ているのは、工事番号を含むものしか、抽出されないのですよね・・・
 まだ、マクロの記録ボタンの自動設定でしかマクロを作成することが出来ない
 私にとって、範囲がどこになっているのか、位しか理解できなくて、コードを
 作成するのは、まだ難しく、何をどう入力すればいいのか悩んでいます。
 一番最初にサンプルをいただいていたと思うのですが、工事番号が入っていない
 部分もすべて抽出させたいのです。
 先ほど、一番最初のファイルを拝見しようと思ったら、削除済みになってしまって
 いて、私も削除してしまっていたので見ることが出来ないのです・・・
 たぶんすべてできていたような・・・・で、私のやりたいことをもういちど
 説明させていただきます。

 1.月別 ○/21〜○/20 と日付を入れると該当する一覧が表示される。
 (これは日付のみ指定で工事番号の入っていないものも含む日付に該当する
    すべてのデータ)

 2.工事別  C05-001 と工事番号を入れると該当する一覧が表示される。
 (これは今の設定で出来ている分です。)

 3.費目別  ○/21〜○/20 材料費  と月日と費目を入れると一覧が表示される。
 (これは工事番号の入っていないものを含む日付・費目に該当するすべてのデータ)
 
 4.取引先別 ○/21〜○/20 ○○会社 と月日と会社名をいれると一覧が表示される。
 (これは工事番号の入っていないものを含む日付・取引先名に該当するすべての
   データ)できれば取引先は納品書のデータから抽出できるようにしたいです。

 この4つのいづれか1つを指定して、抽出させたいのです。
 ほんとうに何度も申し訳ありませんが、よろしくお願いします。
 (まりお)

 データ無しもあったんですネェ。
1.3.についてはユーザーフォームCommandButton1_Click()の抽出条件の
手直しで対応できます。以下が問題の原因の部分。
 
        Rem 工事番号の設定
        .Cells(2, 3).Value = Me.ComboBox工事番号.Value & "*"
        Rem 工事番号の設定
        .Cells(2, 4).Value = "*" & Me.ComboBox工事番号Sub.Value & "*"
 
 上記では二つのコンボボックスが空白のときは抽出条件が"*","**"となり、
「セルに何らかの値が入力されているもの」との条件で抽出されます。
"*"はワイルドカードで「何文字かの文字列」との意味で部分一致検索に
よく使用します。(一文字なら"?")
 
そこで「コンボボックスが空白("")以外(<>)のときだけ抽出条件を設定する」
つまり、コンボボックスが空白の時には抽出条件に何も書かないような処理にします。
まずは次のように手直しして動作確認してみてください。
 
        Rem 工事番号の設定
        If Me.ComboBox工事番号.Value <> "" Then
        .Cells(2, 3).Value = Me.ComboBox工事番号.Value & "*"
        End If
        Rem 工事番号の設定
        If Me.ComboBox工事番号Sub.Value <> "" Then
        .Cells(2, 4).Value = "*" & Me.ComboBox工事番号Sub.Value & "*"
        End If
 
4.は納品書シートから取引先名を収集することになりますが、
昼休みだけではちょっと時間が足りないようなので、
明日の朝までにまたサンプルをアップしておきます。(みやほりん)


 みやほりんさま、何度も手直しありがとうございます。
 上記のコードに変更し、動作確認させてもらいました。
 OKでした!!ずうずうしいですが、4.についてもよろしくお願いします。
 貴重な休み時間をさいていただいて申し訳ないです。m(__)m
 ほんとうにありがとうございます。  
 すご〜く、長いレスになってしまったので、私の書いた不要な部分を
 削除しました。 少しは書き込みがしやすくなったかも・・・
 (まりお)

 ようやくアップできました。
件数が一杯あると少し時間がかかるかもしれない。
http://club-ftp.excite.co.jp/pub/q/01/TEST0511.xls
例によって、右クリ、「対象をファイルに保存」してから開いてください。
(みやほりん)(-_∂)b

 みやほりんさま。本当に本当に本当にありがとうございました。
 長い長い時間をこんな私のわがままな条件のプログラム作成に
 つきあっていただいて、本当に感謝いたします。
 みやほりんさんがいなければ、完成することはできませんでした。
  ((8-(*'-'*)ノ...ありがとうございました...ヽ(*'-'*)-8))
 (まりお) 

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.