質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2218閲覧

VBA AutoFilterで複数条件で別ブックからデータを抽出、また別の条件で抽出を繰り返し 

marebito777

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/07/27 09:16

編集2022/07/28 09:57

前提

VBAでオートフィルターを使い別ブックから日付と時間に合うデータをコピーしようとしているのですが繰り返しがうまくいきません。
該当データは1つのみで、複数のデータがあるわけではありません。
何卒、改善点をご教授ください。

実現したいこと

オートフィルターでセルの値を検索条件に別ブックからのデータを抜き出そうとしているのですが、変数を使って検索条件を動的にして繰り返し(コピー先の表全部を)
データを抜き出せるようにしたいです。
これを別のブックから行います。

発生している問題・エラーメッセージ

画像を添付しますが、時間の部分で
4:00:00や0:05:00がコピーされません。
20:00:00や12:15:00はされるので○○時〇〇分の時間が2桁以上は反応してくれるようです。
また、秒数は00秒固定です。時間と分のみが変動します。
また
別ブックからコピーさせるようにしてみると
「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」と
エラー表示が起きます。
wb2.Range("A1").AutoFilter 1, Format(wb1.Worksheets("コピー先").Cells(i, 1), "yyyy/m/d")
この部分で止まっているようです。

イメージ説明
イメージ説明
コピー先とコピー元は最終的には別ブックにしたいです。
別ブックからの分を試そうとしたら動きすらしなかったので
画像の分は同じブック内の動きの分のスクショを貼り付けました。

該当のソースコード

VBA

1Sub 改めて日付時間を表示形式にする繰り返し10() 2 Workbooks.Open Filename:=ThisWorkbook.Path & "\実験用コピー元.xlsx" 3 Dim wb1 As Workbook 4 Dim wb2 As Workbook 5 Set wb1 = ThisWorkbook 6 Set wb2 = Workbooks("実験用コピー元.xlsx") 7 8 9 With wb1.Worksheets("コピー先").UsedRange 10 Dim i 11 For i = 2 To .Rows.Count 12 wb2.Range("A1").AutoFilter 1, Format(wb1.Worksheets("コピー先").Cells(i, 1), "yyyy/m/d") 13 wb2.Range("A1").AutoFilter 2, Format(wb1.Worksheets("コピー先").Cells(i, 2), "hh:mm:ss") 14 15 With wb2.Worksheets("コピー元").Range("A1").CurrentRegion 16 Dim rng As Range 17 Set rng = Intersect(.Cells, .Offset(1)) 18 If IsVisible(rng) Then rng.Copy wb1.Cells(i, 7) 19 End With 20 21 wb2.Worksheets("コピー元").Range("A1").AutoFilter 22 Next 23 End With 24 wb1.AutoFilterMode = False 25 wb2.Close False 26End Sub 27 28Function IsVisible(r As Range) As Boolean 29 On Error Resume Next 30 IsVisible = r.SpecialCells(xlCellTypeVisible).Count > 0 31End Function

試したこと

時間の問題については
おそらくは下の部分のcount>0の部分の表記を変えれば10:00:00台だけでなく5:00:00台や8:00:00台にも対応できるのではとは思うのですが(0を"00:00:00"にしてみるなど)うまくいきません。
VBAはまだまだ勉強したてで考え方が間違っているのでしょうか。

Function IsVisible(r As Range) As Boolean
On Error Resume Next
IsVisible = r.SpecialCells(xlCellTypeVisible).Count > 0
End Function

補足情報(FW/ツールのバージョンなど)

追記、現状です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

wb2.Range("A1") の部分でシートを指定してないのでエラーになります。

wb2.Worksheets("コピー元").Range("A1")というようにシートを指定しましょう。

おまけ

Dictinary を使って検索するサンプルコード

vba

1Sub 改めて日付時間を表示形式にする繰り返し_Dictinary() 2 Dim i As Long 3 Dim wb1 As Workbook 4 Dim wb2 As Workbook 5 Set wb1 = ThisWorkbook 6 Set wb2 = Workbooks.Open(FileName:=ThisWorkbook.Path & "\実験用コピー元.xlsx") 7 8 Dim dic As Object 9 Set dic = CreateObject("Scripting.Dictionary") 10 'コピー元データをDictionaryに登録 11 With wb2.Worksheets("コピー元").Cells(1).CurrentRegion 12 For i = 2 To .Rows.Count 13 Set dic(Format(.Cells(i, 1), "yyyy/m/d") & " " & Format(.Cells(i, 2), "hh:mm:ss")) = .Rows(i) 14 Next 15 End With 16 'Dictionaryを検索して該当データをコピー先にコピー 17 With wb1.Worksheets("コピー先").Cells(1).CurrentRegion 18 For i = 2 To .Rows.Count 19 Dim key As String: key = Format(.Cells(i, 1), "yyyy/m/d") & " " & Format(.Cells(i, 2), "hh:mm:ss") 20 If dic.Exists(key) Then dic(key).Copy .Cells(i, 7) 21 Next 22 End With 23 24End Sub 25

投稿2022/07/27 12:13

編集2022/07/28 11:58
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marebito777

2022/07/27 15:19

前の質問の時から何度もありがとうございます。 頂いたコードで試してみたところうまくいきそうです。 今日は時間が取れずまだコードの内容を読み解けていないのですが、また内容を自分なりに理解して学習を進めて 応用できればと思います。 コードの要所要所に解説を入れていただけるのも初心者の私にとってはすごくありがたいです。 ありがとうございます。
marebito777

2022/07/28 10:02

hatena19さん たびたびすいません。現状で追記した画像のような挙動をするのですが。 日付は対応できるのですが、時間が日付の最後の時間の分が全部コピーされているような形です。 この解決方法としては連想配列に連想配列を入れ込む?方向の考え方で探していけばいいのでしょうか。
hatena19

2022/07/28 11:57

あっ、済みません。コードが間違ってました。 Format(.Cells(i, 1), "yyyy/m/d") & " " & Format(.Cells(i, 1) の部分を Format(.Cells(i, 1), "yyyy/m/d") & " " & Format(.Cells(i, 2) に修正してください。(2か所あります。) 回答のコードも修正しておきました。
marebito777

2022/07/28 15:00

動きました!ありがとうございます。 自分でもそれは試したつもりなんですが2つ目を見落としていたみたいです汗 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問