まずVBA 初心者のため拙い内容で申しわけありません!
VBA でブック内全てのシートから名前を検索し、該当する人のデータ(行)を抜き出そうとしています。
今はIFステートメントとFor NEXTステートメントでループさせて、1つのシートから抜き出すことはできるのですが、それ以上進めません。
やり方としては上記2つのステートメントを使用するコードでできるでしょうか?それともVLOOKUPを使ったりなど別の方法があるのでしょうか?
どなたか教えて下さい!できれば参考のコードなども教えていただけると助かります。よろしくお願いします!
No.6
- 回答日時:
エラー処理等は考慮していませんが、とりあえず、これでどうでしょうか。
'追加のコメントがある行が、実際に追加した行です。ほかは変えていません。
---------------------------------------
Sub 氏名検索()
simei = InputBox("名前を入力")
With Worksheets("原本").Copy(after:=Worksheets("原本"))
ActiveSheet.Name = simei
End With
cnt = 2
For j = 1 To Worksheets.Count
If Worksheets(j).Name = "原本" Then GoTo CONT99 '追加
If Worksheets(j).Name = simei Then GoTo CONT99 '追加
For i = 2 To 2000
If Worksheets(j).Cells(i, 5) = simei Then
Worksheets(simei).Cells(cnt, 2) = Worksheets(j).Cells(i, 2)
Worksheets(simei).Cells(cnt, 11) = Worksheets(j).Cells(i, 11)
cnt = cnt + 1
Else
End If
Next i
CONT99: '追加
Next j
---------------------------------------
No.5
- 回答日時:
こんばんは!
お望みの動きにならなかったらごめんなさい。
Sub Sample1()
Dim k As Long, cnt As Long, simei As String, wS As Worksheet
Dim myFound As Range, myFirst As Range, myFlg As Boolean
simei = InputBox("名前を入力")
With Worksheets("原本").Copy(after:=Worksheets("原本"))
ActiveSheet.Name = simei
End With
Set wS = Worksheets(simei)
cnt = 1
Application.ScreenUpdating = False
For k = 1 To Worksheets.Count
With Worksheets(k)
If .Name <> simei Then
Set myFound = .Range("E:E").Find(what:=simei, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
myFlg = True
cnt = cnt + 1
Set myFirst = myFound
wS.Cells(cnt, "B").Resize(, 10).Value = .Cells(myFound.Row, "B").Resize(, 10).Value
Do
Set myFound = .Range("E:E").FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
cnt = cnt + 1
wS.Cells(cnt, "B").Resize(, 10).Value = .Cells(myFound.Row, "B").Resize(, 10).Value
Loop
End If
End If
End With
Next k
Application.ScreenUpdating = True
If myFlg = False Then
Application.DisplayAlerts = False
wS.Delete
Application.DisplayAlerts = True
MsgBox "該当データなし"
Else
MsgBox "完了"
End If
End Sub
※ 「原本」シートの2行目以降にはデータがないとします。
こんな感じではどうでしょうか?m(_ _)m
今まで使ったことのない記述がたくさんで、コードの意味がほとんど読み取れません…このようなコードをさらっと書けるなんて尊敬します!
少しずつ調べながら試していきたいと思います^ ^
回答ありがとうございました!
No.4
- 回答日時:
補足要求です。
質問1)検索対象となるシートは、”原本”もふくまれますか?
①原本
②原本をコピーしたシート(氏名のついたシート)
上記以外を検索すると理解して良いですか?
それとも、①②以外にも検索をスキップしたいシートはありますか。
質問2)検索対象シートを
①2~2000行まで検索していますが、マッチデータがあった場合、その行以降の行にも、マッチデータが
ある可能性がありますか。(ないならそこで検索を打ち切ったほうが速い)
②2~2000行まで検索していますが、途中で、空白行(E列が空白の行)があった場合、それ以降の行を
検索する必要がありますか。(ないならそこで検索を打ち切ったほうが速い)
No.3
- 回答日時:
Worksheets.Countで全シートの数を出す前にシートの挿入を行っているため、そのシート自体もループの対象となっているように思います。
a=Worksheets.Count
With Worksheets("原本").Copy(after:=Worksheets("原本"))
ActiveSheet.Name = simei
End With
cnt = 2
For j = 1 To a
For i = 2 To 2000
のようにやってもうまく行かないでしょうか?
挿入するsimeiシートは必ず一番右になるようにして下さい。
Worksheets("原本").Copy(after:=Worksheets(a))
とか。
No.2
- 回答日時:
Worksheets(1)はシート名に関係なく必ず左端のシートになります。
以下、Worksheets(2)は左から2番目…となります。ということで、For~Nextでやる時は左端もしくは右端のシートから順番にループすることになります。
>はじめのシート番号が変わる
のなら、その順番にシートを並び替えればとも思いますが、現実的じゃないですよね。
あとはシート名の一覧表を別に作り、それを並び替えてループするとか、並び替えずに番号を振ってその順番にするとか、考え方次第ですがどれも邪魔臭そうですね。
No.1ベストアンサー
- 回答日時:
Worksheets.Count でシート数が分かるので、それを
a = Worksheets.Count
For i = 1 To a
if Worksheets(i)・・・
のようにしてループすれば同じやり方で行けるのでは。
あと、For Each~Next でも行けると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロで複数条件に当てはまるものを全て抽出したいです 7 2022/05/21 08:51
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Excel(エクセル) VBA セルの値と同じ名前のシートにデータを貼り付けするやり方を教えてください 2 2022/05/17 16:26
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Visual Basic(VBA) Excel VBA シートを追加後に余分なシートを削除する、の意味 21 2022/05/19 22:46
- Excel(エクセル) エクセルVBA VLOOKUPを使ってのカウント作業 2 2023/02/19 09:03
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
特定の文字を含むシートだけマ...
-
VBA 入力月で該当シートを選択...
-
VBA 存在しないシートを選...
-
Excel VBA 複数行を数の分だけ...
-
別のシートを参照して計算する方法
-
ユーザーフォームに入力したデ...
-
実行時エラー1004「Select メソ...
-
excelのマクロで該当処理できな...
-
【ExcelVBA】全シートのセルの...
-
実行時エラー'1004': WorkSheet...
-
Excel チェックボックスにチェ...
-
セルのコピーで「オブジェクト...
-
エクセルVBAでダブルクリックを...
-
複数シートに色付きセル(条件つ...
-
重複するidをデータごとにまと...
-
一括印刷マクロ シート名を数字...
-
VBA 最終行まで数式をコピーする
-
Excel マクロについての相談
-
エクセルのシート名変更で重複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
【ExcelVBA】全シートのセルの...
-
同じ作業を複数のシートに実行...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
XL:BeforeDoubleClickが動かない
-
ExcelVBA シート名を複数セルか...
-
実行時エラー'1004': WorkSheet...
-
VBA 存在しないシートを選...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
【Excel VBA】Worksheets().Act...
-
ExcelのVBAのマクロで他のシー...
-
エクセルのシート名変更で重複...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
Excel マクロについての相談
-
VBA 検索して一致したセル...
おすすめ情報
回答いただきありがとうございます。
その方法で試してみたいと思うのですが、シートをループするときのはじめのシート番号が変わることがあるのです。
シート名からシート番号を取得することは可能でしょうか?
もしくはそこも変数にして対応しなくてはいけないでしょうか?
続けてありがとうございます。シート番号の件は解決いたしました!すみません。
別の問題としてシートをまたいだループが上手くいかず…データは抜き出せるのですが、それを最終行まで繰り返してしまいます。For NEXTを2つ記述しているのでそこが原因だと思うのですがどうしても改善できません。
何度も申しわけありませんが、コードを書きますのでアドバイスいただけたら助かります!
Sub 氏名検索()
simei =InputBox("名前を入力")
With Worksheets("原本").Copy(after:=Worksheets("原本"))
ActiveSheet.Name = simei
End With
cnt = 2
For j = 1 To Worksheets.Count
For i = 2 To 2000
If Worksheets(j).Cells(i,5) = simei Then
Worksheets(simei).Cells(cnt,2) = Worksheets(j).Cells(i,2)
・
・
・
Worksheets(simei).Cells(cnt,11) = Worksheets(j).Cells(i,11)
cnt = cnt + 1
Else
End If
NEXT i
NEXT j
End Sub
ありがとうございます!再度やってみます!
遅れてしまいすみません!
検索対象に原本は含みません。スキップするシートも今の所はありませんので大丈夫です。
また、マッチデータは重複はないはずですが、今後変わることもあるかもしれないので速度は犠牲になってもいいかなと思っています。
よろしくお願いします!