![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
いつもお世話になっております。
下記のコードは検索フォルダの中にある
エクセルすべてを検索して
どのワークブックに含まれているかを
シートに書き込んでしらべるというものに
なります。
ネットで検索して調べました。
意外と時間がかかってしまいます。
やく、50秒ほどです。
10秒ぐらいに短縮することは
できますでしょうか
できるからいましたら
おしえてくれませんでしょうか
コードになります。
フォルダの中には5個だけあります。
Private Sub CommandButton1_Click()
Dim WSC As Object
Dim kword As String, fpath As String, fname As String, fadd As String
Dim wb As Workbook
Dim sh1 As Worksheet, sh2 As Worksheet
Dim frng As Range, r As Long
kword = TextBox1.Value
If StrPtr(kword) = 0 Then Exit Sub
Application.ScreenUpdating = False
Set sh1 = ActiveSheet
r = 1
fpath = "C:\Users\user\OneDrive\デスクトップ\検索フォルダ\"
fname = Dir(fpath & "*.xlsm", vbNormal)
Do Until fname = ""
Set wb = Workbooks.Open(fpath & fname)
For Each sh2 In wb.Worksheets
With sh2.Cells
Set frng = .Find(What:=kword, LookIn:=xlValues, LookAt:=xlPart)
If Not frng Is Nothing Then
fadd = frng.Address
Do
r = r + 1
sh1.Cells(r, 1).Value = fname
Set frng = .FindNext(frng)
If frng Is Nothing Then Exit Do
Loop Until frng.Address = fadd
End If
End With
Next sh2
wb.Close
fname = Dir()
Loop
Set WSC = Nothing
Application.ScreenUpdating = True
End Sub
No.6ベストアンサー
- 回答日時:
こんばんは
メインの処理が良く分かりません。
r = r + 1
sh1.Cells(r, 1).Value = fname
=fname & sh2.Nameかな
にしても
WorksheetFunction.CountIf(sh2.UsedRange, "*" & kword & "*")
で良さそう・・かな
開くのに時間がかかると解っているのなら、対象のデータをExcelでなく
カンマ区切りtxtやcsvに加工した方が早そうですね。
60ファイルの検索位なら望まれている処理速度になると思います。
まあ、加工データを作る時、少し時間がかかると思いますが1度だけですし
対象のExcelを保存する時にcsvなどを吐くようにしておけば、気にならない
処理で済むのでは無いかと思いますよ。
WorksheetFunction.CountIfでやるなら
.xlsmを開くのでEnableEvents = False も・・意味なかったかも
Private Sub CommandButton1_Click()
Dim WSC As Object
Dim kword As String, fpath As String, fname As String
Dim wb As Workbook
Dim sh1 As Worksheet, sh2 As Worksheet
Dim AryFile()
Dim n As Integer
kword = TextBox1.Value
If StrPtr(kword) = 0 Then Exit Sub
Set sh1 = ActiveSheet
fpath = "C:\Users\user\OneDrive\デスクトップ\検索フォルダ\"
fname = Dir(fpath & "*.xlsm", vbNormal)
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Do Until fname = ""
Set wb = Workbooks.Open(fpath & fname)
For Each sh2 In wb.Worksheets
If WorksheetFunction.CountIf(sh2.UsedRange, "*" & kword & "*") <> 0 Then
ReDim Preserve AryFile(n)
AryFile(n) = fname & ":" & sh2.Name
n = n + 1
End If
Next sh2
wb.Close
fname = Dir()
Loop
sh1.Range("A1").Resize(UBound(AryFile) + 1) = WorksheetFunction.Transpose(AryFile)
Set WSC = Nothing
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
No.7
- 回答日時:
敢えてコードは回答せず、もう少し考え方を身に付けて欲しかったですけど。
かれこれ2年程経つと思いますが、やりたいことの手順がコードを受け取ることで抜けてしまっていると感じだしましたので。
SQLってのもBOOKに順に接続させるのはともかく、12シートの名前を開かず取得できるのかと言う点が抜けてませんか?
一応ヒントは出したつもりですが、そこからコード化するのをまずは自力でやってみないと。
他力本願では益々組み立てる知識が身に付かないと思いますよ。
どちらになりたいのかは自由ですが、2年前の方が積極的な人と感じてましたのにちょっと残念です。
No.5
- 回答日時:
No.3の補足について。
応用だと思いますよ。
どのワークシートに対してってのは出来ていますから、同じようにどのワークブックに対してってのも出来るはず。
無論自Book名と同じになった場合は除外する。
そしてBookオブジェクト変数から個々のBookのSheetオブジェクトへと繋ぐだけでは?
Findメソッドについては私も有無だけの為もですけど、繰り返し検索をしても何も利用されていないように思えます。
もう一度何をしたいのかについてコード以前に考え方を纏めるのが宜しいかと。
いつもありがとうございます。
検索してら ExecuteExcel4Macroで検索できるか
ためしてみます。これなら開いて閉じるのが省けます
しかし、それならSQLのほうがいいのかな
No.4
- 回答日時:
こんばんは
ほとんどの時間はブックの開/閉に使われていると推測できますので、速度の向上はあまり見込めないと思います。
少しくらい要領を良くできたとしても、全体の時間にはほとんど影響はないと思われますので。
シートの実態がどうなのかやシート内のデータ量がまったくわかりませんが、FINDメソッドは検索回数が多いと遅くなるようです。
https://officedic.com/excel-vba-highspeed-find/
他に可能性がありそうなのは、せいぜい、
・画面の更新を止める
・シートの再計算を止める
(こちらは、関数の設定状態によっては効果ありません)
くらいかと思われます。
(たいして効果があるとは思えませんが・・)
No.2
- 回答日時:
No.1です。
あとファイル名を書き込んでいるみたいですが、1つのシートに検索値があったとして他のセルやシートを調べる必要はあるのでしょうか?
何かCOUNTIF関数を使いシート内で有無を調べるだけで良いような気もしますけど、目的が不明なので違うのかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ワークシート内 検索 HITしたら すべて選択する 6 2021/11/11 22:50
- Visual Basic(VBA) excel VBAでメールを送る方法について 2 2021/11/03 15:34
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Visual Basic(VBA) EXCEL VBA シート貼り付け 3 2021/11/15 12:33
- Visual Basic(VBA) VBA EXCELからメールを送る方法について 5 2021/11/04 06:30
- Visual Basic(VBA) シート名をフォルダ名に変更 1 2021/12/01 15:59
- Visual Basic(VBA) EXCLE VBA シートクリックしたら該当シートコピー 1 2021/11/11 16:37
- Visual Basic(VBA) シート名でファイル検索する 2 2021/11/30 17:05
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Visual Basic(VBA) VBA Find でオートメーションエラー(エラー440)が出ました 1 2021/11/09 21:22
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
書式のみを変更できなくする方法
-
エクセルのシート名変更で重複...
-
シートが保護されている状態で...
-
ユーザーフォームに入力したデ...
-
VBAで指定シート以外の選択
-
VBA 指定した回数分、別シート...
-
リストボックスの複数データを...
-
VBAで同じシート名のコピー時は...
-
原本シート複写してリストの氏...
-
vbaでworksheetfunctionでの複...
-
ExcelVBA:複数の特定のグラフ...
-
userFormに貼り付けたLabelを変...
-
ExcelのVBAコードについて教え...
-
【Excel VBA】書き込み先のシー...
-
VBA イベントプロシージャ Deac...
-
【VBA】色のついたシート名を取得
-
エクセルvba シートを順次アク...
-
Excelマクロのエラーを解決した...
-
別のシートから値を取得するとき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
【ExcelVBA】全シートのセルの...
-
別のシートから値を取得するとき
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
ブック名、シート名を他のモジ...
-
【VBA】シート名に特定文字が入...
-
シートが保護されている状態で...
-
VBAで指定シート以外の選択
-
エクセルのシート名変更で重複...
-
XL:BeforeDoubleClickが動かない
-
VBA 存在しないシートを選...
-
IFステートの中にWithステート...
-
実行時エラー'1004': WorkSheet...
-
Excel VBA リンク先をシート...
-
エクセルVBA Ifでシート名が合...
-
ExcelVBA:複数の特定のグラフ...
-
実行時エラー1004「Select メソ...
-
ExcelのVBAのマクロで他のシー...
おすすめ情報
とくにこだわりありません。
早く検索できればいいのですが。
シートの構成は添付ファイルのようになっています。
C列で名前を検索
シートは1月から12月まで存在しています。
×5年分となります。
ブックを開いて閉じるのに時間がかかるみたいです。
どのファイルに存在するか調べて
そのファイルを開いて確認するだけです。
そんなに急いでいません。
明日、いろいろ調べるつもりです。
ブックが5個なら先に全て開いておいて検索し
するのはよいですが
どうやって検索するのですか