このトピックに書きこむ |
---|
Re[14]: 何でも検索 | |
---|---|
[196305] Re[14]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/11/01(17:46)) □U R L/ 半平太様。有難うございます。 以前より早くなりました。 確かに43個のブックでSheetも10位あって、ブックの開閉と、セルに都度書き込んでいるので仕方がないのでしょうね。 dictionaryに溜めて置き、最後に一気に書く方法もあるんですね。 勉強になりました。有難うございました。 |
[196304] Re[13]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2024/10/30(17:50)) □U R L/ >後は、[196298]の処理スピードを速くしたいのです。 時間が掛かるのは、複数のブックの開閉と、セルに都度書き込んでいるセイと思われます。 前者はどうしようもないですが(私にはですが)、 後者は転記すべきデータをdictionaryにでも溜めて置き、最後に一気にセルに書き出せばいいと思います。 Sub リスト() Dim c As Range Dim i As Integer, j As Integer Dim FName As String Dim PName As String Dim FWhat As String Dim BigR As Range Dim fAddr As String Dim ThisBK As Workbook Dim destBK As Workbook Dim result(1 To 1, 1 To 3) Dim dicT As Object Set dicT = CreateObject("Scripting.Dictionary") j = 0 ' 初期化 PName = ActiveWorkbook.Path ' 自分(このBook)と同じフォルダのPath FName = Dir(PName & "\" & "*.xls") ' その中の、*.xls ファイル Set ThisBK = ThisWorkbook ThisBK.Worksheets(1).Range("A3:C1000").ClearContents ' A3からC1000セルまでクリア FWhat = InputBox("検索値を入力してください。") ' キャンセルボタンが押された場合、処理を終了 If FWhat = "" Then Exit Sub Application.ScreenUpdating = False Do While FName <> "" If FName <> ThisBK.Name Then Set destBK = Workbooks.Open(Filename:=PName & "\" & FName, ReadOnly:=True) For i = 1 To destBK.Worksheets.Count Set BigR = destBK.Worksheets(i).UsedRange Set c = BigR.Find(What:=FWhat, LookAt:=xlPart) result(1, 1) = FName If Not c Is Nothing Then fAddr = c.Address '見つかった result(1, 2) = destBK.Worksheets(i).Name Do result(1, 3) = c.Value j = j + 1 dicT(j) = result Set c = BigR.FindNext(c) If c.Address = fAddr Then Exit Do Loop End If Next destBK.Close False End If FName = Dir() Loop Application.ScreenUpdating = True If j > 0 Then '書き出し ThisBK.Sheets(1).Range("A3:C3").Resize(j).Value = Application.Index(dicT.items, 0) dicT.RemoveAll Else MsgBox FWhat & " は、このFolderのBookにはありませんでした" End If End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[196303] Re[12]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/30(15:48)) □U R L/ 半平太様 申し訳ないです。私、焦りと、考え事があると理解できないようになります。 後は、[196298]の処理スピードを速くしたいのです。 アドバイスを下さい。 宜しくお願い致します。 |
[196302] Re[11]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2024/10/29(17:39)) □U R L/ >シートモジュールが掲示出来なくなりました。 ここの掲示板は、時々そんな異常事態になりますね(困ったもんです)。 その内、知らぬ間に解消されると思います(経験則ですが) ただ、今はコード自体より、この疑問に対する答えがどうなのか知りたい所です。 ↓ >私は書く場所が「シートモジュール」で、 >プロシージャ名が「Private Sub Worksheet_BeforeRightClick(ByVal・・」と言ったのですが、 >何故、「標準モジュール」で「Sub リスト()」に変わったのですか? |
[196301] Re[10]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/29(17:11)) □U R L/ シートモジュールをコピーしたのに掲示できません |
[196300] Re[9]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/29(17:04)) □U R L/ 半平太 様 シートモジュールが掲示出来なくなりました。 |
[196299] Re[8]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2024/10/29(11:31)) □U R L/ すみません。問題の所在がよく分かりません。 私は書く場所が「シートモジュール」で、 プロシージャ名が「Private Sub Worksheet_BeforeRightClick(ByVal・・」と言ったのですが、 何故、「標準モジュール」で「Sub リスト()」に変わったのですか? |
[196298] Re[7]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/27(22:43)) □U R L/ 半平太 様 お返事ありがとうございます。 モジュールを見直しました。 標準モジュール Sub リスト() Dim c As Range Dim i As Integer, j As Integer Dim FName As String Dim PName As String Dim FWhat As String Dim BigR As Range Dim fAddr As String j = 3 ' 初期値を3に設定 PName = ActiveWorkbook.Path ' 自分(このBook)と同じフォルダのPath FName = Dir(PName & "\" & "*.xls") ' その中の、*.xls ファイル ThisWorkbook.Worksheets(1).Range("A3:C1000").ClearContents ' A3からC1000セルまでクリア FWhat = InputBox("検索値を入力してください。") ' キャンセルボタンが押された場合、処理を終了 If FWhat = "" Then Exit Sub Application.ScreenUpdating = False Do While FName <> "" If FName <> ActiveWorkbook.Name Then Workbooks.Open PName & "\" & FName For i = 1 To ActiveWorkbook.Worksheets.Count Set BigR = ActiveWorkbook.Worksheets(i).UsedRange Set c = BigR.Find(What:=FWhat, LookAt:=xlPart) If Not c Is Nothing Then fAddr = c.Address '見つかった Do With ThisWorkbook.Worksheets(1) .Cells(j, 1).Value = FName .Cells(j, 2).Value = Worksheets(i).Name .Cells(j, 3).Value = c.Value End With j = j + 1 Set c = BigR.FindNext(c) If c.Address = fAddr Then Exit Do Loop End If Next ActiveWorkbook.Close End If FName = Dir() Loop Application.ScreenUpdating = True If j = 3 Then MsgBox FWhat & " は、このFolderのBookにはありませんでした" End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[196296] Re[6]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2024/10/12(16:48)) □U R L/ >□投稿者/ あいか -(2024/10/01(13:27)) ↑ 単にここで提示された「Private Sub Worksheet_BeforeRightClick(ByVal・・以下」を 検索シートのモジュールに書いたらどうか、と言っただけなんですが・・ ※コードを書く場所が違うと言うことです。 つまり、検索シートの「シート見出し」を右クリック→「コードの表示」を選択→画面中央の白いエリアに当該コードをコピペ |
[196295] Re[5]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/12(15:49)) □U R L/ 半平太 様 お返事ありがとうございます。 すみません。 わかりません。教えて下さい。 ub リスト() Dim c As Range Dim i As Integer, j As Integer Dim FName As String Dim PName As String Dim FWhat As String Dim BigR As Range Dim fAddr As String j = 2 PName = ActiveWorkbook.Path '自分(このBook)と同じフォルダのPath FName = Dir(PName & "\" & "*.xlsx") 'その中の、*.xlsx ファイル ThisWorkbook.Worksheets(1).Range(Range("A3"), Range("A3").SpecialCells(xlCellTypeLastCell)).ClearContents FWhat = InputBox("英数字、記号【半角,全角】を検索します。") Application.ScreenUpdating = False Do While FName <> "" 'FNameがある限り繰り返す If FName <> ActiveWorkbook.Name Then Workbooks.Open PName & "\" & FName For i = 1 To ActiveWorkbook.Worksheets.Count Set BigR = ActiveWorkbook.Worksheets(i).UsedRange Set c = BigR.Find(What:=FWhat, LookAt:=xlPart) If Not c Is Nothing Then fAddr = c.Address '見つかった Do j = j + 1 With ThisWorkbook.Worksheets(1) .Cells(j, 1).Value = FName .Cells(j, 2).Value = Worksheets(i).Name .Cells(j, 3).Value = c.Value End With Set c = BigR.FindNext(c) '2個目以降を探す If c.Address = fAddr Then Exit Do '見つかったセル番地が最初と同じなら中止 Loop End If Next ActiveWorkbook.Close End If FName = Dir() '次のファイル名を探す Loop Application.ScreenUpdating = True If j = 1 Then MsgBox FWhat & " は、このFolderのBookにはありませんでした" ' Application.ScreenUpdating = False Application.ScreenUpdating = True End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Me.Columns(2)) Is Nothing Then Cancel = True Me.Cells(Target.Row, 3).Select End If End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[196291] Re[4]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2024/10/07(22:27)) □U R L/ >ThisWorkbookに以下を書いてみたのですが、思った通りには行きませんでした。 ThisWorkbookモジュールにではなく、検索シートのモジュールに書くべきじゃないですか? |
[196290] Re[3]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/10/01(13:27)) □U R L/ 匿名 様 ThisWorkbookに以下を書いてみたのですが、思った通りには行きませんでした。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim FName As String Dim PName As String Dim ws As Worksheet ' B列を右クリックした場合 If Not Intersect(Target, Me.Columns("B")) Is Nothing Then Cancel = True ' 右クリックメニューをキャンセル FName = Target.Offset(0, -1).Value ' A列のファイル名を取得 PName = ThisWorkbook.Path ' 現在のブックのパスを取得 ' ファイルを開く Workbooks.Open PName & "\" & FName ' 対象のセルを選択 Set ws = ActiveWorkbook.Sheets(Target.Value) ws.Activate ws.Cells(1, 1).Select ' 必要に応じてセルの位置を変更 End If End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[196289] Re[2]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/09/30(18:47)) □U R L/ 匿名 様 お返事ありがとうございます。 Worksheet_BeforeRightClickを調べてみます。 |
[196288] Re[1]: 何でも検索- ■記事引用/メール受信=OFF■ □投稿者/ 匿名 -(2024/09/28(11:53)) □U R L/ Worksheet_BeforeRightClickイベントプロシージャを使えば良いと思います。 |
[196282] 何でも検索- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ あいか -(2024/09/17(19:20)) □U R L/ Windows11 Office2021です。 図1 @検索@.xlsm Sheet : 検 索 図2【検索結果】 A B C A B C 2 ファイル名 シート名 セル内内容 2 ファイル名 シート名 セル内内容 3 3 中部支店 人事部 FAX 山田 4 4 新潟営業 総務・電話 fax 5 5 東京本社 電話外線 花子,鈴木 ,FAX, 1、このマクロは、指定されたフォルダ内のすべてのExcelファイル(*.xls)を検索し、特定の英数字、記号【半角,全角】を探してリスト化するものです。 2、リスト化したB列のシート名を。右クリックすると、そのシートが開くようになっています。 3、検索対象Bookは、30個で、Sheet数は8Sheet以上です。 ご教授受けたい事は 1、図2のB列シート名を右クリックで、C列セル内内容を選択して開く。】 2、【検索スピードを速くしたいのです。】 宜しくお願い致します。 Sub リスト() Dim c As Range Dim i As Integer, j As Integer Dim FName As String Dim PName As String Dim FWhat As String Dim BigR As Range Dim fAddr As String j = 2 PName = ActiveWorkbook.Path '自分(このBook)と同じフォルダのPath FName = Dir(PName & "\" & "*.xls") 'その中の、*.xls ファイル ThisWorkbook.Worksheets(1).Range(Range("A3"), Range("A3").SpecialCells(xlCellTypeLastCell)).ClearContents FWhat = InputBox("英数字、記号【半角,全角】を検索します。") Application.ScreenUpdating = False Do While FName <> "" 'FNameがある限り繰り返す If FName <> ActiveWorkbook.Name Then Workbooks.Open PName & "\" & FName For i = 1 To ActiveWorkbook.Worksheets.Count Set BigR = ActiveWorkbook.Worksheets(i).UsedRange Set c = BigR.Find(What:=FWhat, LookAt:=xlPart) If Not c Is Nothing Then fAddr = c.Address '見つかった Do j = j + 1 With ThisWorkbook.Worksheets(1) .Cells(j, 1).Value = FName .Cells(j, 2).Value = Worksheets(i).Name .Cells(j, 3).Value = c.Value End With Set c = BigR.FindNext(c) '2個目以降を探す If c.Address = fAddr Then Exit Do '見つかったセル番地が最初と同じなら中止 Loop End If Next ActiveWorkbook.Close End If FName = Dir() '次のファイル名を探す Loop Application.ScreenUpdating = True If j = 1 Then MsgBox FWhat & " は、このFolderのBookにはありませんでした" ' Application.ScreenUpdating = False Application.ScreenUpdating = True End Sub |