
VBAで以下のような、ブック内の全シートから特定の文字列が入った行のみを新しくシート作成して一覧化するマクロを組みました。
検索する時に保護解除するなど別の作業もあるため無駄に長くなっております。
Sub 検索()
Dim Sh As Worksheet, Rng As Range
Dim StrFind As String, Res As String
Dim Rw As Long, R As Long
Dim N As Integer
Const OutShName = "検索結果"
StrFind = InputBox("検索する文字列を入力してください。" & " 検索する文字列は正確に。", "検索文字列")
If StrFind = vbNullString Then Exit Sub
Dim Ws As Worksheet
Application.ScreenUpdating = False
For Each Ws In Worksheets
Ws.Unprotect Password:=908118
Next
Application.ScreenUpdating = True
Application.ScreenUpdating = False
UserForm1.Show vbModeless
UserForm1.Repaint
For N = 1 To Worksheets.Count
If Worksheets(N).Name = OutShName Then
Set Sh = Worksheets(N)
Sh.Move after:=Worksheets(Worksheets.Count)
Sh.Cells.ClearContents
Exit For
End If
Next N
If N > Worksheets.Count Then
Set Sh = Sheets.Add(after:=Worksheets(Worksheets.Count))
Sh.Name = OutShName
End If
Worksheets(1).Rows(1).Copy Sh.Rows(1)
R = 2
For N = 1 To Worksheets.Count - 1
With Worksheets(N).UsedRange
For Rw = 1 To .Rows.Count
Set Rng = .Cells(Rw, 1).Resize(, .Columns.Count).Find(StrFind)
If Not Rng Is Nothing Then
Rng.EntireRow.Copy Sh.Rows(R)
R = R + 1
End If
Next Rw
End With
Next N
Unload UserForm1
ResultMsg:
If R < 3 Then
Res = "「" & StrFind & "」 は、見つかりません。"
For Each Ws In Worksheets
Ws.Protect Password:=908118
Next
Sheets("TOP").Select
Else
Columns("A:A").ColumnWidth = 20
Columns("C:C").ColumnWidth = 13
Rows("1:1").RowHeight = 30
Sheets("12月").Select
Rows("1:1").Select
Selection.Copy
Sheets("検索").Select
Range("A1").Select
Application.ScreenUpdating = True
Res = "「" & StrFind & "」 は、" & R - 2 & " 件 見つかりました。 " & _
String(2, vbLf) & Sh.Name & " に抽出しました。"
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Font.Bold = False
Selection.Font.Bold = True
End If
MsgBox Res, vbInformation, "検索完了"
Set Rng = Nothing
End Sub
Excel2003を使用してます。
シートは30枚程あり、複雑な計算式等が入っています。
この時、特定のシート(例:"月別データ")のみを除外したいのですが、いまいちわかっておりません。
稚拙な質問かと思いますがご指導していただきたく思います。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
う~ん、インデントしましょうね。
長いし入れ子も多いし、何が何やら…なので。if
if
for
処理
next
処理
end if
end if
みたいな具合に。また、ところどころ、行間にも改行を入れてしまったほうが見やすいかもしれません。
Application.ScreenUpdating を True にしたすぐ次の行で False にするとかは、意味がないので、そこは 2 行とも削除しましょう。
No.1 さんも No.2 さんも、多少の書きぶりの違いはあれ、「if worksheets(i).name <> "月別データ" then」という形で除外されていますね。お手元のデータの状況が分かればもっと効率の良い方法もあり得るかもしれませんが、この場の回答としてはこんな感じかと思います。
ベストアンサーは辞退します。
No.2
- 回答日時:
'こんなカンジ??
'後半はよくワカラン、、、
Sub 検索()
Const ExceptShName = "月別データ"
Const OutShName = "検索結果"
Dim Sh As Worksheet, Rng As Range
Dim StrFind As String, Res As String
Dim Rw As Long, R As Long
Dim N As Integer
StrFind = InputBox("検索する文字列を入力してください。" & " 検索する文字列は正確に。", "検索文字列")
If StrFind = vbNullString Then Exit Sub
Dim Ws As Worksheet
Application.ScreenUpdating = False
For Each Ws In Worksheets
'Ws.Unprotect Password:=908118
Next
'UserForm1.Show vbModeless
'UserForm1.Repaint
For N = 1 To Worksheets.Count
If (Worksheets(N).Name = OutShName) Then
Set Sh = Worksheets(N)
Sh.Move after:=Worksheets(Worksheets.Count)
Sh.Cells.ClearContents
Exit For
End If
Next N
If (N > Worksheets.Count) Then
Set Sh = Sheets.Add(after:=Worksheets(Worksheets.Count))
Sh.Name = OutShName
End If
Application.CutCopyMode = True
Worksheets(1).Rows(1).Copy Sh.Rows(1)
R = 2
For N = 1 To Worksheets.Count - 1
'With Worksheets(N).UsedRange
With Worksheets(N)
Const xKey_Col = 1
Dim xLast As Long
Dim xLast_Col As Long
Dim nn As Long
If (Worksheets(N).Name <> ExceptShName) Then
xLast = .Cells(Rows.Count, xKey_Col).End(xlUp).Row
If (xLast > 1) Then
nn = 1
'For Rw = 1 To .Rows.Count
Do Until (nn >= xLast)
nn = nn + 1
xLast_Col = .Cells(nn, Columns.Count).End(xlToLeft).Column
Set Rng = .Cells(nn, xKey_Col).Resize(1, xLast_Col).Find(StrFind, LookAt:=xlWhole)
If Not (Rng Is Nothing) Then
Rng.EntireRow.Copy Sh.Rows(R)
R = R + 1
nn = Rng.Row
End If
Loop
End If
End If
End With
Next N
'Unload UserForm1
ResultMsg:
If R < 3 Then
Res = "「" & StrFind & "」 は、見つかりません。"
For Each Ws In Worksheets
'Ws.Protect Password:=908118
Next
Sheets("TOP").Select
Else
Columns("A:A").ColumnWidth = 20
Columns("C:C").ColumnWidth = 13
Rows("1:1").RowHeight = 30
Sheets("12月").Select
Rows("1:1").Select
Application.CutCopyMode = True
Selection.Copy
Sheets("検索").Select
Range("A1").Select
Res = "「" & StrFind & "」 は、" & R - 2 & " 件 見つかりました。 " & _
String(2, vbLf) & Sh.Name & " に抽出しました。"
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Font.Bold = False
Selection.Font.Bold = True
End If
MsgBox Res, vbInformation, "検索完了"
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
No.1
- 回答日時:
sub macro1()
dim StrFind as string
dim i as long
dim c as range
dim c0 as string
dim N as long
dim Res as string
Const OutShName = "検索結果"
'INPUT SEARCH WORD
StrFind = InputBox("検索する文字列を入力してください。" & " 検索する文字列は正確に。", "検索文字列")
If StrFind = vbNullString Then Exit Sub
'SETUP RESULT WORKSHEET
on error goto errhandle
with worksheets("検索結果")
.move after:=worksheets(worksheets.count)
.cells.clearcontents
worksheets("12月").rows(1).copy .range("A1")
.rows(1).value = .rows(1).value
.range("A:A").columnwidth = 20
.range("C:C").columnwidth = 13
.range("1:1").rowheight = 30
.range("1:1").font.bold = true
end with
on error goto 0
'UNKNOWN USERFORM
load userform1
userform1.show vbmodeless
userform1.repaint
'ROTATE WORKSHEETS
for i = 1 to worksheets.count - 1
with worksheets(i)
'EXCLUSION
if .name <> "月別データ" and .name <> "AND SO ON" then
'MAIN
.unprotect password:=908118
set c = .cells.find(what:=strfind, lookin:=xlvalues, lookat:=xlwhole)
if not c is nothing then
c0 = c.address
do
n = n + 1
c.entirerow.copy destination:=worksheets("検索結果").rows(n + 1)
set c = .cells.findnext(c)
loop until c.address = c0
end if
.protect password:=908118
end if
end with
next i
'REPORT
unload userform1
if n = 0 then
Res = "「" & StrFind & "」 は、見つかりません。"
else
Res = "「" & StrFind & "」 は、" & n & " 件 見つかりました。 " & _
String(2, vbLf) & " 検索結果に抽出しました。"
end if
MsgBox Res, vbInformation, "検索完了"
exit sub
errhandle:
'SETUP RES SHEET cont
worksheets.add after:=worksheets(worksheets.count)
activesheet.name = "検索結果"
resume
end sub
みたいな。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) vba 転記するときの最終行について 2 2022/09/03 09:31
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル 同じ数字を他の列に自...
-
Microsoft Officeを2台目のPCに...
-
パソコンWindows11 Office2021...
-
Microsoft365、ページ設定がで...
-
エクセルからメールを作れるか...
-
Office2021を別のPCにインスト...
-
outlookのメールが固まってしま...
-
別シートの年間行事表をカレン...
-
快活CLUBについて 私用で使う書...
-
大学のレポート A4で1枚レポー...
-
libreoffice calcで行を挿入し...
-
Microsoft Formsの「個人情報や...
-
エクセルで特定のセルの値を別...
-
Excel 日付を比較したら、同じ...
-
【Excel VBA】PDFを作成して,...
-
Excelで〇のついたものを抽出し...
-
Officeを開くたびの「再起動メ...
-
office365って抵抗感ないですか?
-
Teams内でショートカットって貼...
-
Microsoft365
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA で特定のシートのみ除外
-
エクセルで文字が白くなる
-
エクセルで文字を含む式に、カ...
-
エクセル条件付書式で指定の時...
-
エクセルで長い行を5行ごとに1...
-
エクセルで円グラフに引き出し...
-
エクセルの主軸と第2軸の0を合...
-
Excelで、空白を表示したい
-
同一セルに日時があるものを日...
-
Excelで小数点以下1桁の年数を...
-
DATEDIFでマイナス表示をさせたい
-
Excel2017 フィルタ昇順並びがA...
-
EXCELの散布図で日付が1900年に...
-
アクセスで#エラーを表示させ...
-
エクセルで、時間 0:00を表示...
-
【エクセル】オートフィルタで...
-
【エクセル】区切り文字が含ま...
-
excelグラフでデータテーブルを...
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
おすすめ情報