Sheet1のA1:Q100を"東京"という名前で定義しています。
Sheet2のA1:Q100を"沖縄"という名前で定義しています。
Sheet3のA1:Q100を"北海道"という名前で定義しています。
Sheet4のA1:Q100を"宮崎"という名前で定義しています。
Sheet5は検索シートとしています。
検索のマクロを考えていて、どうしても分からないのが『Range』の使い方です。
検索をする範囲はSheet1~4のA1:Q100です。
Range("東京") として、1つの範囲ならできるのですが、"東京"、"沖縄"、"北海道"、"宮崎"の4つから検索するにはどうしたらよいのでしょうか?ただ単に
Range("東京"、"沖縄"、"北海道"、"宮崎") ではだめですよね。
No.9ベストアンサー
- 回答日時:
こんにちは。
>「抽出した範囲にはフィールド名がないか、または無効なフィールド名です」
その意味は分かっていますが、それを、マクロのほうの問題に振られてしまうのは、かなり厳しいです。本当は、フィールド行を丁寧に調べていただければよいと思います。あまり大きなクライテリアのようですから、どこかにミスがあるように思います。
端的にいうと、CriteriaRange(条件式)の "A2:Q3" と、実際のデータの上のフィールド行の名前と食い違っているからです。
細かい部分でも違っていると、エラーが出てくることがありますから、以下のマクロで、内容を調べてみてください。間違った部分が指摘されるはずです。
'---------------------------------------
Sub TestCriteria()
Dim sh As Variant
Dim rng As Range
Dim i As Integer
Dim j As Integer
Dim k As Integer
'クライテリアレンジの場所
Const CRRNG As String = "A2:Q3"
'フィールド名の行の位置
Const FROW As Integer = 1
Set rng = Worksheets("Sheet5").Range(CRRNG)
For Each sh In Array(Worksheets("Sheet1"), Worksheets("Sheet2"), Worksheets("Sheet3"), Worksheets("Sheet4"))
On Error Resume Next
For i = 1 To rng.Columns.Count
If sh.Cells(FROW, i).Value <> rng.Cells(FROW, i).Value Then
j = j + 1
Application.Goto sh.Cells(FROW, i)
If MsgBox(sh.Name & "!" & sh.Cells(FROW, i).Address & " が違っています。" & sh.Cells(1, i).Value & vbCrLf & _
"修正しますか?", vbOKCancel) = vbCancel Then
GoTo EndLine
Else
sh.Cells(FROW, i).Value = rng.Cells(FROW, i).Value
k = k + 1
End If
End If
Next i
On Error GoTo 0
Next sh
If j = 0 Then
MsgBox "正常に終了しました。", 64
Else
MsgBox k & " 個修正しました。" & vbCrLf & _
"念のためにもう一度、このマクロを実行してください。", 48
End If
Exit Sub
EndLine:
MsgBox ActiveCell.Address & " に問題があります。", 48
End Sub
No.10
- 回答日時:
#9 にちょっと加えておくと、本来、#9 のマクロを使う必要はありません。
こんなに構造的に単純で簡単なマクロは、本来、手動で出来るという条件でもって、その方法(マクロの手法のひとつ)に臨むわけで、それをマクロのコードの問題に振られると、かなり面倒な内容になってくるのです。ユーザーのエラーに対する予想できるエラー修正を施すというのは、掲示板の領域の問題ではなくなってしまいます。
今回は、フィールド行とクライテリアの項目の一行目とが一致していないということです。
マクロを動かす前に、「シートのデータを良く調べてください」というしか、本来はできないのです。それだけは、分かってください。もう一つの方のマクロでも、同じ条件だと思います。エラーのメッセージで、ワークシートから返るものは、ほとんどは、マクロ側での処理は不可能です。
No.8
- 回答日時:
#5 の回答者です。
>リストがありません。というエラーがでてしまいました。
あまり、私は深く追求するつもりはありませんが、それは、.
"東京"、"沖縄"、"北海道"、"宮崎"
>Array(Range("東京"), Range("沖縄"), Range("北海道"), Range("宮崎"))
の名前の範囲の親オブジェクトが正しく取れていないか、リストとして取れないということだと思います。だから、Range(名前定義) 型は、実際には、難しいというべきかもしれませんが、こちらでは、コード自体の問題とはも思えませんので、それ自体は難しいです。
[名前定義]というのは、親オブジェクトがシート型とApplication型と二つあります。
>Sheet1のA1:Q100を"東京"という名前で定義しています。
あえて、[名前定義]で書いたことに、私の意味があるので、A1:Q100ということで換えるなら、最初の方と同じ内容になってしまいますので、こちらとしては、これきりにします。
'標準モジュール
-----------------------------------------------------
Sub PickUpThruSheetsR()
Dim rng As Range
Dim cRng As Range
Dim sh As Variant
With Worksheets("Sheet5")
.Select
Application.ScreenUpdating = False
.Range("A10:Q10000").ClearContents
For Each sh In Array(Worksheets("Sheet1"), Worksheets("Sheet2"), Worksheets("Sheet3"), Worksheets("Sheet4"))
Set cRng = .Range("A65536").End(xlUp).Offset(1)
If cRng.Row < 10 Then
Set cRng = .Range("A10")
End If
sh.Range("A1:Q100").AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=cRng, _
Unique:=False
'タイトル行を消す
'cRng.Resize(, 17).Clear
'シート名を付ける
'cRng.Value = sh.Name
Next sh
End With
Application.ScreenUpdating = True
End Sub
この回答への補足
上記のマクロに書き換えてみたところ、前回と同じエラーがおきてしまいました。sh.Range("A1:Q100").AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=cRng, _
Unique:=False
をどう変えたらよいでしょうか。
No.7
- 回答日時:
>すみません、どこに入れ込めばいいでしょうか?
入れ込むのではなく、同じコードが書かれた所を置き換えるだけです。
コードの Rows を Row にするだけですから、入替えなくても [s] を削除すればOKです。
この回答への補足
”抽出した範囲にはフィールド名がないか、または無効なフィールド名です”というエラーがおきてしまいました。デバックをすると『.Range("A1:Q100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=Sheets("Sheet5").Range(Top), Unique:=False』が反転されます。
No.6
- 回答日時:
>型が一致しません。
ちょっとミスしました。
Rows ではなく、Row に修正して
下記のようして下さい。
If Sheets("Sheet5").Range("A65536").End(xlUp).Row < 10 Then
Top = "A10"
Else
Top = "A" & Sheets("Sheet5").Range("A65536").End(xlUp).Row + 1
End If
No.5
- 回答日時:
こんにちは。
ちょっと割り込みさせていただきます。あまり、難しい方法は考えておりませんが、以下のような方法で可能だと思います。
ただ、マクロで、[名前定義]登録を使うのは、あまり関心しませんが、マクロで名前定義を書き換えたりしなければ、良いかもしれません。特殊なエラーが発生したことがあります。
'これは、標準モジュールに書き込みのがベストです。
Sub PickUpThruSheets()
Dim rng As Range
Dim cRng As Range
Dim r As Variant
With Worksheets("Sheet5")
.Select
Application.ScreenUpdating = False
.Range("A10:Q10000").ClearContents
For Each r In Array(Range("東京"), Range("沖縄"), Range("北海道"), Range("宮崎"))
Set cRng = .Range("A65536").End(xlUp).Offset(1)
If cRng.Row < 10 Then
Set cRng = .Range("A10")
End If
r.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=cRng, _
Unique:=False
'タイトル行を消す
'cRng.Resize(, 17).ClearContents
'シート名を付ける
'cRng.Value = r.Parent.Name
Next r
End With
Application.ScreenUpdating = True
End Sub
この回答への補足
r.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=cRng, _
Unique:=False
が黄色反転になり、リストがありません。というエラーがでてしまいました。
No.4
- 回答日時:
範囲名だけで行う事は不可能なので、こんな感じになります。
動作確認はしていません。
Sub 検索2()
Dim WsAry As Variant
Dim i As Integer
Dim Top As String
'フィルタリングするシート名
WsAry = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")
'集計シートクリア
Sheets("Sheet5").Range("A10:IV10000").Clear
For i = LBound(WsAry) To UBound(WsAry)
'集計シートの転記先を設定
If Sheets("Sheet5").Range("A65536").End(xlUp).Rows < 10 Then
Top = "A10"
Else
Top = "A" & Sheets("Sheet5").Range("A65536").End(xlUp).Rows + 1
End If
'フィルタ
With Sheets(WsAry(i))
.Range("A1:Q100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A2:Q3"), _
CopyToRange:=Sheets("Sheet5").Range(Top), Unique:=False
End With
Next
End Sub
この回答への補足
Top = "A" & Sheets("Sheet5").Range("A65536").End(xlUp).Rows + 1
型が一致しません。
とでてしまいました。
No.2
- 回答日時:
>異なるシートであれば指定できますか?
異なるシートのセル(範囲)を混合して指定する事はできません。
異なるシートのセル(範囲)を指定する場合は、シートとセル(範囲)をセットで指定しないと利用できません。
あとは、作業グループにしてしまう事です。
Sheets("Sheet1","Sheet2","Sheet3","Sheet4").Range("A1:Q100").Find()
この回答への補足
Sub 検索()
Rows("10:10000").Select
Selection.Delete Shift:=xlUp
Range("A10").Select
Range("東京").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("A2:Q3"), CopyToRange:=Range("A10"), Unique:=False
End Sub
このようなマクロなんですが、どこにどう入れたらいいのでしょうか?
No.1
- 回答日時:
異なるシートのセルを一緒に指定する事はできません。
シートを指定しながら検索するしか方法はありません。
Dim i As Integer
Dim findcell As Range
For i = 1 To 4
With Sheets(i)
set findcell= .Range("A1:Q100").Find()
End With
Next
この回答への補足
マクロ初心者なもので・・・初歩的な質問なんですが、
>異なるシートのセルを一緒に指定する事はできません。
異なるシートであれば指定できますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- その他(プログラミング・Web制作) python文字化けエラーが発生しているようです 3 2022/04/13 19:41
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- 転職 長く続けられる好条件の求人でしょうか? 3 2023/07/12 18:45
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロを複数シートに実行する...
-
コマンドボタンがデザインモー...
-
エクセルでシートの並び替えで...
-
エクセルを開いたとき常に同じ...
-
EXCELの起動時に常に同じ...
-
エクセルで、マクロボタンの表...
-
VBA シート名を先月の名前に...
-
VBAで条件によってシート見出し...
-
【 Excel】シートの見出しに自...
-
マクロを特定の複数シートで実...
-
エクセルで回数をカウントする...
-
VBA ワークシートオブジェクト...
-
EXCELでワークシートを開いたら...
-
EXCELのエラー
-
エクセルVBAでcmbBoxのプロパテ...
-
エクセル2013でマクロのボタン...
-
AccessのVBAで、Excelのマクロ...
-
エクセルで複数のSheetを一括フ...
-
シートを保護した時でも並べ替...
-
うまくマクロが実行しません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロを複数シートに実行する...
-
コマンドボタンがデザインモー...
-
エクセルを開いたとき常に同じ...
-
【 Excel】シートの見出しに自...
-
エクセルでシートの並び替えで...
-
VBAで条件によってシート見出し...
-
EXCELでワークシートを開いたら...
-
EXCELでマクロを使わずに図形の...
-
マクロを特定の複数シートで実...
-
エクセルの複数のワークシート...
-
EXCELのエラー
-
複数シートの保護・解除
-
VBA シート名を先月の名前に...
-
エクセル2013でマクロのボタン...
-
VBAで作るexcel検索窓
-
EXCELの起動時に常に同じ...
-
シートを保護した時でも並べ替...
-
Excelで,特定のシートを開いた...
-
Excelのマクロの呼び出し元を知...
-
メッセージボックスでシート名...
おすすめ情報