Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10330 / 13644 ツリー ←次へ | 前へ→

【21934】他ブックのデータ抽出 モコ2 05/2/4(金) 10:19 質問[未読]
【21939】Re:他ブックのデータ抽出 Jaka 05/2/4(金) 13:01 回答[未読]
【21947】Re:他ブックのデータ抽出 モコ2 05/2/4(金) 16:08 質問[未読]
【21948】Re:他ブックのデータ抽出 Jaka 05/2/4(金) 16:43 回答[未読]
【21956】Re:他ブックのデータ抽出 モコ2 05/2/4(金) 18:47 お礼[未読]
【22444】今ごろわかった不具合。 Jaka 05/2/21(月) 9:33 発言[未読]

【21934】他ブックのデータ抽出
質問  モコ2  - 05/2/4(金) 10:19 -

引用なし
パスワード
   エクセルVBA半年、アクセス学習1ケ月の初心者です。
今エクセルのブックが複数あって、名前を検索キーにして、複数のブックからデータを抽出するシステムを作ろうと思っています。
他ブックのシートを一度検索キーのあるブックにコピーすればフィルタオプションの設定で検索可能なのでしょうが、処理速度やメモリの問題から、出来れば他のブックから直接データを抽出したいのですが、可能でしょうか。

【21939】Re:他ブックのデータ抽出
回答  Jaka  - 05/2/4(金) 13:01 -

引用なし
パスワード
   こんにちは。

例えば、

検索するブックを1度開いていいのなら

検索キー = "AAA10"
ブック名 = "データ1.xls"
結果 = Application.Match(検索キー, Workbooks(ブック名).Sheets("Sheet1").Columns(1), 0)
If IsError(結果) Then
  MsgBox "無い"
Else
  MsgBox 結果 & "行目に有"
End If


開きたくないんだったら、適当なセルに関数を入れて判定した方が簡単かつ速いと思います。

検索キー = "AAA10"
ブック名 = "データ1.xls"
pas = "'" & CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
KKL = "=MATCH(""" & 検索キー & """," & pas & "[" & ブック名 & "]" & "Sheet1'!$A:$A,0)"
Cells(1, 5).Formula = KKL
If IsError(Cells(1, 5).Value) Then
  MsgBox "無い"
Else
  MsgBox Cells(1, 5).Value & "行目に有"
End If
Cells(1, 5).ClearContents


他ブックをオートフィルタし、結果を自ブックにコピペの場合。
(フィルタ結果の有無は判定してません。)

With Workbooks("データ1.xls").Sheets("Sheet1")
  .Range("A1").AutoFilter Field:=1, Criteria1:="AAA10"
  .Range("A2", .Range("A63336").End(xlUp)).SpecialCells(xlCellTypeVisible).Copy
  .AutoFilterMode = False
End With
ThisWorkbook.Sheets(2).Range("A1").PasteSpecial


こんな感じの物をループで1ブックづつ探していくしかないと思います。
(つまり遅い)
アクセスなら1っぱつポンで済むかもしれませんが...。

【21947】Re:他ブックのデータ抽出
質問  モコ2  - 05/2/4(金) 16:08 -

引用なし
パスワード
   すみません。
教えていただいたコードを試してみたのですが、次のようなエラーが出ます。
何が悪いのか分からないので教えて下さい。
1. そのまま試した場合
  Else に対する Ifが有りません。
2. If からEndifまでをコメント行にした場合
  オブジェクト変数またはWithブロック変数が設定されていません。

'********************
Sub test1()
'********************
Dim kekka As Object

kekka = Application.Match("山本 太郎", Workbooks("会員名簿.xls"). _
Sheets("新規会員").Columns(9), 0)

If IsError(kekka) Then MsgBox "無い"
Else
MsgBox kekka & "行目に有り"
End If

End Sub

【21948】Re:他ブックのデータ抽出
回答  Jaka  - 05/2/4(金) 16:43 -

引用なし
パスワード
   ▼モコ2 さん:
>1. そのまま試した場合
>  Else に対する Ifが有りません。
そのまま試してません。
手を加えられて、動きませんでは何も言えません。
こういう方結構いますけど...。

>If IsError(kekka) Then
MsgBox "無い"
>Else
>MsgBox kekka & "行目に有り"
>End If

【21956】Re:他ブックのデータ抽出
お礼  モコ2  - 05/2/4(金) 18:47 -

引用なし
パスワード
   参りました。
実のところ変数に漢字を使える事を忘れていて、あえてアルファベットに直してコードを書いていたのですが、教えられたとおりに入力したら、見事に動きました。
ものすごく得をした気分です。
残りの二つのサンプルも試してみます。
本当にありがとうございました。
ちなみに次のようなコードでテストしてみました。

'********************
Sub test2()
'********************

Dim 検索キー As String
Dim ブック名 As String
Dim 結果 As String

検索キー = "山田 太郎"
ブック名 = "会員名簿"
結果 = Application.Match(検索キー, Workbooks(ブック名).Sheets("新規会員").Columns(9), 0)

If IsError(結果) Then
  MsgBox "無い"
Else
  MsgBox 結果 & "行目に有"
End If

End Sub

【22444】今ごろわかった不具合。
発言  Jaka  - 05/2/21(月) 9:33 -

引用なし
パスワード
   今ごろ、記載したコードに不具合があることが解りました。
修正して下さい。

>With Workbooks("データ1.xls").Sheets("Sheet1")
>  .Range("A1").AutoFilter Field:=1, Criteria1:="AAA10"
>  .Range("A2", .Range("A63336").End(xlUp)).SpecialCells(xlCellTypeVisible).Copy
>  .AutoFilterMode = False
>End With
>ThisWorkbook.Sheets(2).Range("A1").PasteSpecial

  ↓

With Workbooks("データ1.xls").Sheets("Sheet1")
  AER = .Range("A65536").End(xlUp).Row
  .Range("A1").AutoFilter Field:=1, Criteria1:="AAA10"
  .Range("A2:A" & AER).SpecialCells(xlCellTypeVisible).Copy
  .AutoFilterMode = False
End With
ThisWorkbook.Sheets(2).Range("A1").PasteSpecial

10330 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free