• ベストアンサー

Excelマクロ(Range)について

Sheet1のA1:Q100を"東京"という名前で定義しています。 Sheet2のA1:Q100を"沖縄"という名前で定義しています。 Sheet3のA1:Q100を"北海道"という名前で定義しています。 Sheet4のA1:Q100を"宮崎"という名前で定義しています。 Sheet5は検索シートとしています。 検索のマクロを考えていて、どうしても分からないのが『Range』の使い方です。 検索をする範囲はSheet1~4のA1:Q100です。 Range("東京") として、1つの範囲ならできるのですが、"東京"、"沖縄"、"北海道"、"宮崎"の4つから検索するにはどうしたらよいのでしょうか?ただ単に Range("東京"、"沖縄"、"北海道"、"宮崎") ではだめですよね。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

その他の回答 (9)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

#9 にちょっと加えておくと、本来、#9 のマクロを使う必要はありません。 こんなに構造的に単純で簡単なマクロは、本来、手動で出来るという条件でもって、その方法(マクロの手法のひとつ)に臨むわけで、それをマクロのコードの問題に振られると、かなり面倒な内容になってくるのです。ユーザーのエラーに対する予想できるエラー修正を施すというのは、掲示板の領域の問題ではなくなってしまいます。 今回は、フィールド行とクライテリアの項目の一行目とが一致していないということです。 マクロを動かす前に、「シートのデータを良く調べてください」というしか、本来はできないのです。それだけは、分かってください。もう一つの方のマクロでも、同じ条件だと思います。エラーのメッセージで、ワークシートから返るものは、ほとんどは、マクロ側での処理は不可能です。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

noa8998
質問者

補足

上記のマクロに書き換えてみたところ、前回と同じエラーがおきてしまいました。sh.Range("A1:Q100").AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=.Range("A2:Q3"), _ CopyToRange:=cRng, _ Unique:=False をどう変えたらよいでしょうか。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.7

>すみません、どこに入れ込めばいいでしょうか? 入れ込むのではなく、同じコードが書かれた所を置き換えるだけです。 コードの Rows を Row にするだけですから、入替えなくても [s] を削除すればOKです。

noa8998
質問者

補足

”抽出した範囲にはフィールド名がないか、または無効なフィールド名です”というエラーがおきてしまいました。デバックをすると『.Range("A1:Q100").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A2:Q3"), _ CopyToRange:=Sheets("Sheet5").Range(Top), Unique:=False』が反転されます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答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

noa8998
質問者

補足

すみません、どこに入れ込めばいいでしょうか?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

noa8998
質問者

補足

r.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=.Range("A2:Q3"), _ CopyToRange:=cRng, _ Unique:=False が黄色反転になり、リストがありません。というエラーがでてしまいました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答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

noa8998
質問者

補足

Top = "A" & Sheets("Sheet5").Range("A65536").End(xlUp).Rows + 1 型が一致しません。 とでてしまいました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

>このようなマクロなんですが、どこにどう入れたらいいのでしょうか? 検索ではなくフィルタだったんですね。 4つのシートのフィルタ結果をシート5に集める(一覧)ということでしょうか?

noa8998
質問者

補足

説明不足ですみませんでした。 4つのシートのフィルタ結果をシート5に集める(一覧)ということです。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>異なるシートであれば指定できますか? 異なるシートのセル(範囲)を混合して指定する事はできません。 異なるシートのセル(範囲)を指定する場合は、シートとセル(範囲)をセットで指定しないと利用できません。 あとは、作業グループにしてしまう事です。 Sheets("Sheet1","Sheet2","Sheet3","Sheet4").Range("A1:Q100").Find()

noa8998
質問者

補足

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 このようなマクロなんですが、どこにどう入れたらいいのでしょうか?

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答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

noa8998
質問者

補足

マクロ初心者なもので・・・初歩的な質問なんですが、 >異なるシートのセルを一緒に指定する事はできません。 異なるシートであれば指定できますか?

関連するQ&A

  • エクセルのマクロ(range)について

    マクロの作りと理解の方法について教えてください。 今、日報を作り直しています。 以前作成した方は、このように作っていました。 Worksheets("日報").Select Range("Q7:Q23").Value = Range("U7:U23").Value Range("S7:S59").Value = Range("V7:V59").Value Range("A1").Select MsgBox " 転写を終了しました。" End Sub マクロでは複数の行列を指定していますが、1行だけ表すと、 具体的な表とデータの変化の仕方とするとこのようになっています。 M    O    Q     S       U     V 個数 金額  累計個数 金額金額 (=M+Q) (=O+S) 0、   0、   100、   1000、    100、   1000  1,初期状態 10、  100、  100、   1000、    110、   1100 2,個数を入力すると、計算式を入力してあるUとVの数が変わる 10、  100、   110、   1100、    120、   1200 3,マクロを実行すると、UとVの数がQとSに入力され、計算式を入力してあるUとVの数がさらに変わる。 0、   0、    110、   1100、   110、    1100 4,MとOの数をゼロ(クリア)にすると、計算式を入力してあるUとVの数が変わる。      なかなか理解できないのは、Range("Q7:Q23").Value = Range("U7:U23").Valueの部分で、 2,の後にマクロを実行すると、U 110、V 1100がQ 100とS 1000に書き込まれることです。 通常の計算式だと=は対象となったセルをそのまま表示していると思うのですがのですが、 マクロに書いてある式だと3,のところでUとVの数をQとSに書き込んであります。 なぜ=なのにマクロでは一方のセルに数を書き込んでいるのでしょうか。 また、QやSをUやVへ書き込んでいないのでしょうか。 どなたか詳しく教えていただけると幸いです。

  • エクセルのマクロ

    同一ブック内の複数のシートを印刷させるマクロを知りたいのですが。 Sheet1・Sheet2・Sheet3で印刷範囲が3シートともRange("A1:H10")です。 よろしくお願いします。

  • エクセルマクロのrangeオブジェクト

    グラフを作成する下記のマクロでRangeオブジェクトにて範囲指定しておりますが,これをR1C1形式で表現するにはどうすればよいでしょうか? ActiveChart.SetSourceData Source:=Sheets(tmpSheetName).Range("A2:AM2,A81:AM81"), PlotBy:=xlRows どうかよろしくお願いします.

  • Excel Pivot 名前の定義の値をマクロで取得

    こんにちは。いつも参考にさせていただいています。 マクロでPivotを自動更新する記述をしています。 データが入力されているシートに 名前の定義をして"データ"と名前をつけ、参照範囲を以下のとおり設定しました。 =OFFSET($A$1,0,0,COUNTA($A:$A),COUNTA($1:$1)) Pivotが表示されるシートのマクロに下記のように記述して、 自動的に更新ができることを確認できました。 Private Sub Worksheet_Activate() Range("A1").Select ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _ "データ" End Sub マクロ自体は問題なく動くのですが、 目でも確認をとりたいため、MsgBoxを追加して、現在選択されているデータ範囲を表示させたいと考えています。 例) 「データ範囲は$A$1:$D$150に変更されました」 そこで、 MsgBox "データ範囲は" & データ & "に変更されました" という一文を上記に追加してみましたが、データの部分でセルの範囲を取得できませんでした。 "データ"としてもダメで、名前の定義で指定された範囲の値を取得する方法がわかりません。 マクロで可能な仕様なのかもわからないのですが、 どなたか解決法をご存知でしたら教えていただけないでしょうか。 よろしくお願いします。

  • エクセルのマクロで数式を入力したい

    エクセルのマクロで数式を入力したい エクセルのマクロでシート1のA1に シート2のA1の値を表示させる数式を入力したいと思って Sub tamesi() Sheet1.Activate Range("a1") = "=sheet2!a1" End Sub と書くと動作します ここにIF文をいれてシート2のA1に値がないときは シート1のA1には空白で返したいと思い Sub tameshi2() Sheet1.Activate Range("a1") = "=if(sheet2!a1= 0,"",sheet2!a1)" End Sub と打つと動作しませんでした アプリケーションの定義またはオブジェクトの定義のエラーです と返ってきます。 いろいろやってみたのですが、なにせ勉強し始めで よくわかりませんでした。 教えてください よろしくお願いします

  • Range("Sheet2!A1")が何故通る?

    Excel VBAでRange関数を使っていて不思議に思う事があったので、少し質問させて下さい。 バージョンは、Office Standard 2010のVer14(32bit)です。 [Range]は、実際には[ActiveSheet.Range]の省略という認識でした。 そして、例えばSheet1がアクティブな状態で[ActiveSheet.Range("Sheet2!A1")]とすればエラーがでます。 [Range(Worksheets("Sheet2").Range("A1"))]でもエラーになります。 ところがこれが、[Range("Sheet2!A1")]だけにすると、問題なくSheet2のA1セルが取得できるのです。 セルに名前を付けた場合も、同じようにアクティブでないシートのセルが取得できました。 場合によって、Rangeの親オブジェクトがActiveSheetであったりなかったりするようなのですが、これはどのような仕様なのでしょうか? Microsoft Docsをざっと見たのですが、載ってなさそうだったので。 以下、自分がチェックに使ったコードです。 Sheet2!A1セルにShTwoという名前を付けています。 Sub test()  Debug.Print Range("A1").Address  Debug.Print Range("A1").Parent.Name ' Debug.Print ActiveSheet.Range("Sheet2!A1").Address '1004:アプリケーション定義またはオブジェクト定義のエラーです  Debug.Print Range("Sheet2!A1").Address  Debug.Print Range("Sheet2!A1").Parent.Name ' Debug.Print ActiveSheet.Range("ShTwo").Address'1004:アプリケーション定義またはオブジェクト定義のエラーです  Debug.Print Range("ShTwo").Address  Debug.Print Range("ShTwo").Parent.Name ' Debug.Print ActiveSheet.Range(Worksheets("Sheet2").Range("A1")).Address '1004:アプリケーション定義またはオブジェクト定義のエラーです ' Debug.Print Range(Worksheets("Sheet2").Range("A1")).Address ''Range'メソッドは失敗しました:'_Global'オブジェクト End Sub

  • エクセルのマクロについて

    以前、こちらのマクロで Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("a1")) Is Nothing Then Exit Sub Application.EnableEvents = False Range("a3:ba28").Replace What:="=*!", Replacement:=Target.Value, LookAt:=xlPart Application.EnableEvents = True End Sub 指定した範囲を(A1)セルに入力した値に置換するマクロを教えていただいたんですが、現在,、これを使ってsheet1の指定範囲内にある(=あ!$AR$75)などが入力してある部分のシート名を置換してデータ内容の変更を行っています。 しかし、この方法だと、シート名の文字数を指定しなくてはならなくて、自分以外の人が操作すると、エラーを出してしまうことがあり困っています。そこでchangeイベントをやめて、シート名の確認をしてからマクロの実行を行うには、どういったマクロにすればいいですか?? 説明が分かりづらくすみません・・・・・・。 もし他にシートの文字数などにこだわらなくてもよい方法があれば教えてください。 よろしくお願いします。

  • EXCEL 名前の定義 VBA参照の方法

    EXCELの名前の定義を、VBAから参照する方法を教えていただきたいのですが  名前を定義する    シートA  名前:TEST 範囲:シートA    シートB  名前:TEST 範囲:シートB    シートC  名前:Pass 範囲:ブック  それぞれをVBAから参照する場合    Range("TEST").Value: シートA内のVBA    Range("Pass").Value  では、参照できず。    Worksheets("シートA").Range("TEST").Value    Worksheets("シートC").Range("Pass").Value  にて、参照できました。 明示的なシート名入力が必要なのでしょうか? よろしくお願いいたします。

  • エクセル2007のマクロについて

    実践で学ぶ Office Excel 2007 VBAというマクロの学習サイトで Sub Macro実践1() 'ブック シート セルアドレスを指定すればブック シートをアクティブにする必要はない             Workbooks("転記.xlsx").Worksheets("転記シート1").Range("A1").Value = _               Workbooks("データ.xlsx").Worksheets("データ1").Range("A1").Value                 End Sub         と入力すると「インデックスが有効範囲にありません」となってしまいます。なにか間違っているのでしょうか?

  • Excelのマクロ

    複数のシートからある特定の範囲を複数のシートにコピーしたいのです。 コピー元のシートの名前は連番では無いのですが、特定の物で、数は6種類しかありません。 またコピー先のシートはコピー元とほぼ同じ名前です。 例えば、a1とa2というシートからある特定の範囲(シートが変わっても同じところ)をaというシートにコピーしたいのです。 今は力技のマクロを組んでいるのですが、少しシート名が変わる度にプログラムを書き換えなければならず、とても面倒です。 なにか良い方法はないでしょうか?

専門家に質問してみよう