| このトピックに書きこむ |
|---|
| 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/
| |