![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
こんばんは
既出の質問かもしれませんが探し出せず、
また、VBA勉強中の初心者ですが質問させていただきます。
今データベースの検索マクロを組んでいます。
検索ブックとデータベースブックに分けており
検索対象としてその別ブックのデータベースの複数シート(図1)から参照し
検索ブックの「検索結果シート」に抽出したいです
(検索条件は検索シートの項目入力です(図2))
データベースブックのシート数は更新によって都度変わります。
For~next でできるとは思うのですが
うまく組めません。
フィルタオプションとマクロの記録を使い
特定シートの参照はできるのですが…
Sheets("検索結果").Select
Workbooks("全データベース.xlsm").Sheets("2013").Range("A3:X10000").AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=Range("検索!Criteria"), CopyToRange:= _
Range("A3:V3"), Unique:=False
記録そのままのマクロですが
上記にFor~nextを組み込めばいいのか、他の式が良いのか…
あと、データブックシートは常に開いているわけでないので
openメソッドも必要かと思うのですが…
知識不足で恐縮ですが
どなたかご教授願えますか?
![「エクセルVBA 別ブックの複数シートの参」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/2/542295045_56f95d5e4c2e5/M.jpg)
No.2ベストアンサー
- 回答日時:
こんにちは
基本的にはNo1様のご回答に同感ですが、何らかの経緯やご質問の様にしなければならない事情などがあるのかも。
>For~next でできるとは思うのですが
>うまく組めません。
の部分と
>あと、データブックシートは常に開いているわけでないので
>openメソッドも必要かと思うのですが…
の部分に関するところをごく簡単なサンプルにしてみました。
>特定シートの参照はできるのですが…
とのことなので、各シート毎の実際の処理は質問者様におまかせです。
1)特定のブック(データベースブック)が開いているかチェックし
開いていなければ、新たに開く
2)ブック内の全てのシートに対してループで処理を行う
シート数は可変(非固定)です
(それぞれのシートでの処理内容は質問者様にお任せ)
というものです。
とりあえずは、動作チェックも兼ねて各シート名を列挙するようにしてあります。
Sub Sample()
Dim wb As Workbook, flg As Boolean
Dim sh As Worksheet, shOrg As Worksheet
Const dataWB = "DataBook.xlsm" '←データベースブックの名称
Const dataPath = "C:\hoge\data\" '←データベースブックへのパス
'現在のシートを記憶しておく
Set shOrg = ActiveSheet
'データベースブックが開いているかをチェック
flg = True
For Each wb In Workbooks
If wb.Name = dataWB Then
flg = False
Exit For
End If
Next wb
'ブックが開いていなければ新たに開く
If flg Then Workbooks.Open Filename:=dataPath & dataWB
Set wb = Workbooks(dataWB)
'データベースブック内の全シートを対象にループする
For Each sh In wb.Worksheets
'shに各シートオブジェクトが取得された状態でループするので
'このループ内で必要な処理を行ってください
'
'とりあえずは動作確認もかねて、各シート名をA列に追記
'
shOrg.Cells(shOrg.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Value = sh.Name
Next sh
'終了処理。ブックを新たに開いた場合は閉じる
If flg Then wb.Close SaveChanges:=False
Set wb = Nothing
End Sub
>>fujilin様
ありがとうございます!><私も頼まれている側なので困ってしまって…
コードも細かく書いていただきありがとうございます。
openも私のコードは大雑把なので助かります。
再度考えつつ、参考にさせていただきます!
No.3
- 回答日時:
re.re.さんの都合でデータベースブックを考えたのだと思っていました。
事情を知らず申し訳ありません。そこで、データベースブック内のすべてのシートをひとつのテンポラリシートにまとめるマクロを書いてみました。
テンポラリシートを元に、re.re.さんの書いたAdvancedFilter メソッドを実行すれば実現可能と思います。
Sub sample()
Dim wbDB As Workbook
Dim wsDB As Worksheet
Dim ws As Worksheet 'テンポラリシート
Set wbDB = Workbooks.Open("C:\hoge\data\DataBook.xlsm", , True)
For Each wsDB In wbDB.Worksheets
If ws Is Nothing Then
'最初のシートの場合は、そのままコピーして新規ブックを作成。
wsDB.Copy
Set ws = ActiveSheet
Else
'2番目以降のシートの場合は、2行以降をコピーして追加。※見出し行数に応じて要調整!!
wsDB.Rows("2:" & wsDB.Cells(Rows.Count, 1).End(xlUp).Row).Copy
ws.Rows(ws.Cells(Rows.Count, 1).End(xlUp).Row).PasteSpecial
End If
Next
Application.DisplayAlerts = False
wbDB.Close
Application.DisplayAlerts = True
'ここから先は、re.re.さんが書いたコードです。
Sheets("検索結果").Select
ws.Range("A3:X10000").AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=Range("検索!Criteria"), CopyToRange:= _
Range("A3:V3"), Unique:=False
End Sub
>>ママチャリ様
こちらの説明不足なのでとんでもございません!こちらこそ気を遣わせてしまいまして申し訳ないです><
そしてデータまで書いてくださりありがとうございます!本当に助かります!
参考に(大部分をですが笑)させていただきます!
No.1
- 回答日時:
「検索ブックとデータベースブックに分けており」…ここまでは良いでしょう。
「データベースの複数シート」って、NGですよ。
せっかく、データベースブックを作ったのなら、同じデータはひとつのシートに統合してください。そうすれば、こんな質問をしなくて済みます。
もし、1シートで入りきらない程のデータを処理するのであれば、Access等のDBを検討して下さい。
ちなみに、AdvancedFilterメソッドでは、1シート目の抽出はできても、2シート目の抽出結果を追加することができないと思います。結局は、全シートをひとつのテンポラリシートに纏める。もしくは、1シートづつマクロで、ちまちま抽出することになると思います。
>>ママチャリ様
お礼が遅れてすみません。
やはり無駄処理ですか…。シートに統合したら確かに解決ではあるんですが。。。
もう少し考えます、ご指摘ありがとうございました(´人`)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 5 2023/06/02 08:44
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/06/01 14:45
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Excel(エクセル) シートを配列にいれることはできますか? 3 2023/06/04 19:06
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
excel2010 マクロで複数シート検索し、一致した行をコピーしたい
Excel(エクセル)
-
Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について
Visual Basic(VBA)
-
【マクロ】【VBA】別ブックへのデータ転記について
Excel(エクセル)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
エクセルのマクロで全シートを検索したい
Excel(エクセル)
-
6
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
7
エクセルでエラーが出て困っています。
Excel(エクセル)
-
8
【Excel VBA】ブックを複数開いている際、任意のブックをアクティブにしたい
Excel(エクセル)
-
9
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
10
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
11
VBA 値と一致した行の一部の列のデータを転記について教えてください
Visual Basic(VBA)
-
12
VBA 既に開いているBookに継続作業(転記)する追加コード
Visual Basic(VBA)
-
13
VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルを共有するとPCによっ...
-
エクセルにおける,「ブック」...
-
エクセルの複数シートをCSV...
-
複数ファイルから特定シートの...
-
VBAでブックを非表示で開いて処...
-
WorkBooksをオープンさせずにシ...
-
VBA:ワークブックを変数でActi...
-
エクセルで50行ごとに区切った...
-
VBA マクロを削除して保存したい
-
Excelで複数ブックの同一セルに...
-
エクセルで別ブックをバックグ...
-
エクセルでSheetの数は最大限ど...
-
Excelを開くと文字の表示がおか...
-
【マクロ】【VBA】別ブックへの...
-
エクセルシートの一部を送りたい
-
(マクロ)vlookupの元データを同...
-
エクセルVBAでブック保護のUser...
-
エクセル 複数のブックを一度...
-
Excelでブックの共有を掛けると...
-
エクセル2013 すべてのにシート...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの関数 ENTERを押...
-
VBAでブックを非表示で開いて処...
-
エクセルを共有するとPCによっ...
-
エクセルで参照しているデータ...
-
WorkBooksをオープンさせずにシ...
-
Excel(2010)のフィルターが保...
-
フォルダ内の複数ファイルから...
-
Excelでブックの共有を掛けると...
-
複数ファイルから特定シートの...
-
エクセルで「ディスクがいっぱ...
-
Excelで複数ブックの同一セルに...
-
エクセルファイルを開かずにpdf...
-
エクセルで別ブックをバックグ...
-
エクセルで50行ごとに区切った...
-
外部ブック参照が#REF!になって...
-
エクセル2016です。「ブッ...
-
エクセルの関数について教えて...
-
エクセルシートの一部を送りたい
-
ブックのピボットを別ブックに...
-
Excel起動時に特定のワークシー...
おすすめ情報