- ベストアンサー
エクセルVBAで条件に応じて一覧表を取り出す方法
- エクセルVBAを使用して、formフォルダ内のすべてのファイルから条件に応じて一覧表を作成する方法を教えてください。
- 条件として、formフォルダ内のファイルのA1セルが0でない場合、A4:B7及びA9:B12の中で日付が入っている行の日付と内容を一覧表に取り出します。
- 取り出したデータは、ActiveWorksheetのB列とC列にレコードとして表示されます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 最初から、書き込みが遅くなっているのに、その上に失敗して、ご迷惑掛けてしまい、すみません。 こちらの問題から先にします。 >また、行の数だけ「移動またはコピーしようとしている数式またはシートには >移動またはコピー先のワークシートに既にある名前'※※'が含まれています。 >この名前を使用しますか?」 その場合は、値コピーのほうがよいですね。もし、書式情報もほしい場合は、別々のコピーをしなくてはなりません。当面、値コピーだけにしておきます。 > .Cells(c.Row, 1).Resize(, 2).Copy _ > dbBkSh.Range("B3").Offset(i, 0) ↓ dbBkSh.Range("B3").Offset(i, 0).Resize(0, 2 ).Value = .Cells(c.Row, 1).Resize(, 2).Value というスタイルになりますね。ちょっと試してみていただけますか? 前から、名前定義登録、独特のトラブルがあるのは知っていましたが、今回のトラブルの件は、想定外というところです。 --------------------------------------------------- >最後の日付と内容の1行分ずつしかデータベースに入っていきません。 ↓ この位置が違っていました。 i = i + 1 ループの中でなくてはいけませんでした。 With Workbooks.Open(myPath & "form\" & Fn, , True) '---------------------------- Set dbBksh = Worksheets("Sheet2") With .ActiveSheet ' If .Range("A1").Value <> 0 Then For Each c In .Range("A3:A9") If IsDate(c.Value) Then 'A:B の該当する2列 dbBksh.Range("A3").Offset(i, 0).Value = i dbBksh.Range("B3").Offset(i, 0).Resize(, 2).Value = .Cells(c.Row, 1).Resize(, 2).Value i = i + 1 'この位置ですね。※ End If Next c End If End With '---------------------------- ちょっと、これで様子を見ていただけますか。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >4行目以降の内容をとにかく全部削除するにはどう記述すればよいのですか。 Set dbBkSh = ThisWorkbook.Worksheets("一覧表") With dbBkSh.UsedRange If .Cells(.Cells.Count).Row > 3 Then .Range("A4", .Cells(.Cells.Count)).Clear End If End With こんなコードはどうでしょう。二度マクロをRunしても、これなら問題ありません。また、UsedRangeは、必ずしも、A1 から始まるということにはなりません。.Cells(.Cells.Count) は、最後のセルを選択しています。 それと、同じだと思っていましたが、SpecialCells(xlCellTypeLastCell) は、いくら、Clear(書式と値を削除)しても、それでも、消したはずの最後のセルを示しています。こちらは使えませんね。
お礼
UsedRangeプロパティというのがあるんですね。 何もかもが驚きの連続です。 Cells(.Cells.Count) にも感動しました。 勉強しなければならないことは山ほどありますが、今回おかげさまで、 知識不足でありながらもVBAの方はなんとか間に合いました。 本当にどうもありがとうございました。m(_ _)m
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 質問は読んでいたのですが、すっかりレスを忘れていました。 >A4:B7及びA9:B12の中で日付が入っている行の日付と内容を、 とはなっていたけれども、実害がなさそうなので、「.Range("A4:A9")」とつなげてしまいました。一応、日付認識のテスト試験はしています。 >【★たぶんこの部分に入るものです★】 たぶん、線の中を入れ替えてあげれば、問題はないと思います。 With Workbooks.Open(myPath & "form\" & Fn, , True) '---------------------------- With .ActiveSheet ' If .Range("A1").Value <> 0 Then For Each c In .Range("A4:A9") If IsDate(c.Value) Then 'A:B の該当する2列 dbBkSh.Range("A3").Offset(i, 0).Value = i .Cells(c.Row, 1).Resize(, 2).Copy _ dbBkSh.Range("B3").Offset(i, 0) End If Next c End If End With '---------------------------- .Close False i = i + 1
お礼
いつもお世話になっておりますm(_ _)m。 ご回答ありがとうございました。 なるほど、Rangeをつなげて認識でチェックするのですね。 コードを試してみたところ、formフォルダにあるブックの日付と内容のうち、 最後の日付と内容の1行分ずつしかデータベースに入っていきません。 また、行の数だけ「移動またはコピーしようとしている数式またはシートには 移動またはコピー先のワークシートに既にある名前'※※'が含まれています。 この名前を使用しますか?」 というメッセージが出て、全部クリックしないと先に進みません。 これを表示させないようにできますでしょうか。 調べてもよくわかりません。ご教示よろしくお願いいたします。
お礼
ご回答どうもありがとうございました。 おかげさまですべて思い通りのことができるようになりました。m(_ _)m あと、ひとつだけお聞きしたいのですが、このデータは、多く見積もっても 300件くらいのデータなので、再読込するときには1000行分ほど削除して 更新すればいいと思い、次のようにしてみたのですが、 Range("4:1000").Clear '全データ削除 もし1001行目以下になにか入っていたら、それは残ってしまうことになります。 4行目以降の内容をとにかく全部削除するにはどう記述すればよいのですか。 お礼の欄で質問してしまって申し訳ありません。