• ベストアンサー

マウスで指定した、2つのExcelBookのSheet内の任意の範囲のアドレスを取得するマクロは?

Excelの2つのファイルを開いた状態で、それぞれのシートの複数のセルをマウスで範囲指定して、そのファイル名、Sheet名、セル範囲を使って重複や検索、書き換えに関するマクロを作成しています。 一つのシート内ですと、 Set 選択範囲1 = Application.InputBox("範囲?", Type:=8) で、うまくできるのですが、シートが2枚の間では、はじめのシートで処理されてしまいます。 複数のシート、出来れば、2つのブック間で処理したいのですがどなたかお教えください。

  • tom_c
  • お礼率37% (3/8)

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

  • ベストアンサー
  • pauNed
  • ベストアンサー率74% (129/173)
回答No.4

ぁ、ごめんなさい。もうひとつ。 If 値1 <> "" Then この判定は中の 選択範囲2 のLoopの外に出して、1回だけの判定で良いですね。 その方が、値1 = ""の時、無駄なLoop処理をしないで済みます。 For Each r1 In 選択範囲1   値1 = r1.Value   If 値1 <> "" Then          For Each r2 In 選択範囲2       値2 = r2.Value       If 値1 = 値2 Then         色1 = r1.Interior.ColorIndex         Select Case 色1           '(略)         End Select         r1.Interior.ColorIndex = 色         r2.Interior.ColorIndex = 色       End If     Next r2   End If Next r1

tom_c
質問者

お礼

完璧なアドバイス、ありがとうございました。 For Each r1 In 選択範囲1 や Rangeの各要素の使用方法について学習してゆきたいと思います。 また、これをもとに、思案中のマクロを完成させることが出来そうです。 迅速に対応していただき、本当にありがとうございました。

その他の回答 (3)

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.3

>お恥ずかしいのですが、 恥ずかしがらなくてもよいと思いますよ。 現状を示して頂いたほうが、色々なアドバイスを受ける事ができて、 早く上達するのではないでしょうか。 Sub sample1()   Const msg As String = "データの連続した範囲をマウスで指定し、「OK」を押してください。"   Dim 選択範囲1 As Range   Dim 選択範囲2 As Range   Dim 値1    As Variant   Dim 値2    As Variant   Dim 色1    As Long   Dim 色    As Long   Dim r1    As Range   Dim r2    As Range   On Error GoTo myError   Set 選択範囲1 = Application.InputBox("元になる" & msg, Type:=8)   選択範囲1.Interior.ColorIndex = xlNone  '-4142  '塗りつぶし無しに設定   Set 選択範囲2 = Application.InputBox("比較する" & msg, Type:=8)   選択範囲2.Interior.ColorIndex = xlNone  '-4142  '塗りつぶし無しに設定      For Each r1 In 選択範囲1     値1 = r1.Value          For Each r2 In 選択範囲2       値2 = r2.Value       If 値1 <> "" Then         If 値1 = 値2 Then           色1 = r1.Interior.ColorIndex           Select Case 色1             Case xlNone: 色 = 33             Case 33:   色 = 41             Case 41:   色 = 5             Case 5:   色 = 6             Case 6:   色 = 43             Case 43:   色 = 12             Case 12:   色 = 38             Case 38:   色 = 7             Case 7:   色 = 3             Case 3:   色 = 9             Case Else:  色 = 10           End Select           r1.Interior.ColorIndex = 色           r2.Interior.ColorIndex = 色         End If       End If     Next r2      Next r1      Exit Sub myError:   Select Case Err.Number     Case 424  'キャンセル       MsgBox "  キャンセルされました。  "       End     Case Else       MsgBox "  予期せぬエラーが発生しました。  エラーコード" & Err.Number   End Select End Sub まず、For Each...Next ステートメントについて調べてみてください。 For Each r1 In 選択範囲1...で 選択範囲1で格納した Range の各要素をLoopします。 Loop範囲を決める行位置や列位置を調べなくても済みます。 また、先ほど書いたように Cells(行1, 列1) という記述は、ActiveSheetのCellsの 行1, 列1 を指定することになります。 For Each...Next ステートメントを使う事で、 Loop要素 r1 や r2 は 指定した範囲の各セルをダイレクトに指定するわけですから、 この指定も不要になります。 選択範囲1 や 選択範囲2 はBookやSheetも含めたRangeオブジェクトを取得していますから こちらのほうが都合いいわけです。 また >Range(選択範囲1.Address).Select >Selection.Interior.ColorIndex = -4142 このようにSelectしなくても 選択範囲1.Interior.ColorIndex = -4142 と記述できます。 そのほうが不測のエラーを防げますし、実行速度にも影響してきます。 以上、参考にしてみてください。

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.2

別Bookの選択について書きます。 (別シートは、そのシートを選択するだけですので問題ないと思えるのですが?) ユーザーに選択してもらうなら、 メニュー[ウィンドウ]から切り替えてもらえばいいです。 VBAコード内で切り替えてあげるなら、先にも書きましたが ActiveWindow.ActivateNext もしくはBook名がわかっているなら Workbooks("Book1.xls").Activate などとします。 ですが、問題は別のところにあるのでしょう。 値1 = Cells(行1, 列1).Value この Cells(行1, 列1) はActiveSheetを指しますが、それで良いのでしょうか? 取得したRangeの『選択範囲1』の(行1, 列1)なら 選択範囲1(行1, 列1) もしくは 選択範囲1.Cells(行1, 列1) や 選択範囲1.Item(行1, 列1) などとします。 詳細がわかりませんので、あまり適確なアドバイスでなかったらごめんなさい。 もし追加で説明が必要であれば、マクロの全文を提示してもらったほうがアドバイスし易いのですが。

tom_c
質問者

補足

お恥ずかしいのですが、マクロ全文です。 アドバイスお願いいたします。 --------------- Sub 比較塗り潰し() On Error GoTo myError Dim 選択範囲1 As Range Dim 選択範囲2 As Range Set 選択範囲1 = Application.InputBox("元になるデータの連続した範囲をマウスで指定し、「OK」を押してください。", Type:=8) Range(選択範囲1.Address).Select Selection.Interior.ColorIndex = -4142 '塗りつぶし無しに設定 左1 = Selection.Column '選択された範囲の左端 上1 = Selection.Row '   〃    上端 右1 = 左1 + Selection.Columns.Count - 1 '   〃    右端 下1 = 上1 + Selection.Rows.Count - 1 '   〃    下端 Set 選択範囲2 = Application.InputBox("比較するデータの連続した範囲をマウスで指定し、「OK」を押してください。", Type:=8) Range(選択範囲2.Address).Select Selection.Interior.ColorIndex = -4142 '塗りつぶし無しに設定 左2 = Selection.Column '選択された範囲の左端 上2 = Selection.Row '   〃    上端 右2 = 左2 + Selection.Columns.Count - 1 '   〃    右端 下2 = 上2 + Selection.Rows.Count - 1 '   〃    下端 For 列1 = 左1 To 右1 For 行1 = 上1 To 下1 値1 = Cells(行1, 列1).Value For 列2 = 左2 To 右2 For 行2 = 上2 To 下2 値2 = Cells(行2, 列2).Value If 値1 = 値2 Then If 値1 <> "" Then 色1 = Cells(行1, 列1).Interior.ColorIndex Select Case 色1 Case -4142 色 = 33 Case 33 色 = 41 Case 41 色 = 5 Case 5 色 = 6 Case 6 色 = 43 Case 43 色 = 12 Case 12 色 = 38 Case 38 色 = 7 Case 7 色 = 3 Case 3 色 = 9 Case Else 色 = 10 End Select Cells(行1, 列1).Select Selection.Interior.ColorIndex = 色 Cells(行2, 列2).Select Selection.Interior.ColorIndex = 色 End If End If Next 行2 Next 列2 Next 行1 Next 列1 End myError: Select Case Err Case 424 'キャンセル MsgBox "  キャンセルされました。  " End Case Else MsgBox "  予期せぬエラーが発生しました。  エラーコード" & Err End Select End Sub

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.1

こんにちは。 選択がRange型で取得できていれば そのRangeはBook,Sheet固有のものですから、問題ないと思うのですが。 Sub test()   Dim r1 As Range   Dim r2 As Range   With Application     Set r1 = .InputBox("r1", Type:=8)     Set r2 = .InputBox("r2", Type:=8)   End With   MsgBox r1.Address(external:=True) & vbLf _      & r2.Address(external:=True)   Set r1 = Nothing   Set r2 = Nothing End Sub この後Range型変数をどのように使っているか、によるかもしれませんね。 それとも、もしかしたら.InputBoxメソッド時に他Bookを参照できないという意味でしょうか? その場合は、間に ActiveWindow.ActivateNext を入れて対応したり、 またはメニュー[ウィンドウ]から切り替えてもらったり、などで対応できませんか? ご質問の意味をかん違いしていたら、補足お願いします。

tom_c
質問者

補足

早速のご回答に感謝いたします。 >>この後Range型変数をどのように使っているか、によるかもしれませんね。 ご指摘の通り、かもしれません。 この後は、 範囲の行数と列数をFor,next文を使って 値1 = Cells(行1, 列1).Value に代入して比較しています。 2つのシート間を移動しますので、ブックやシートのアクティブが必要なのですね? もし、そうでしたら、方法をお教えください。 幼稚なマクロで申し訳ありません。

関連するQ&A

  • 任意のブックを開き、任意のシートの範囲をコピーして貼り付けるマクロ

    タイトル通りなのですが、 アクティブなブックから 任意のブックを開き、任意のシートを選び任意の範囲をコピーして、 元のアクティブなブックに貼り付けるマクロがほしいです。 このとき、この任意のブックのシートにはフィルタがかかっているのですが、 フィルタ解除しなくても不可視セルも含めてすべてのデータをコピーできる方法はありますか? よろしくお願いいたします。

  • あるシートのセルを、複数のシートにコピーするマクロ

    やりたい事としては、シート名「Sample」で指定した範囲のセルを、ブック内の複数シート(※)へコピーしたいです。 ※ 他にも同じ構成のブックがあり、そこでも汎用として使えるマクロが必要となっています。 各ブックでは、「Sample」というシート名は共通ですが、コピー先の複数シートのシート名は異なっています。但し、共通している部分としては、コピー先のシートを「Start」と「End」で挟んでいます。 シートの順序としては、  「Start」 「1」 「2」 「3」 「End」 「Sample」 のような構成で、各シートごとに1~3のシート名がばらばらです。 「Start」と「End」シートを活用して、シート名を指定せずにコピーする方法をご教示頂ければと思います。 宜しくお願い致します。

  • エクセルのマクロを使ってシートごとに名前をつけて保存したい

    マクロ初心者です。宜しくお願いします。 1つのブックにシートが複数あります。 それぞれシートをコピーして新しいブックを作成し そのブックに名前をつけて保存したいです。 例えばブック名が「売上管理」でそのシートが「A店」「B店」「C店」と3シートあるとします。 シート名:A店を他のブックにコピーしてマイドキュメントに名前を付けて 保存する場合のマクロを教えてください。 ちなみにその際のブック名は「シート名+任意のセル(D2)」と できれば一番助かります。 ちなみにD2のセルにはToday関数が入ってます。

  • マクロのセルの範囲指定

    お世話になります。マクロ初心者です。エクセルの業務でマクロを作成しようとしているのですが、マクロ実行で、セルの範囲が指定される方法はありますか?例えば シート名  開始  終了  Sheet1   A1  D10 を入力して、ボタンを押したらA1からD10までのセルが選択されることです。説明不足ですみません。宜しくお願いします。

  • EXCELのシートのマクロ操作について

    EXCELについて質問がありまして、よろしくお願いします。 複数のシートがあるブックがあり、それを、それぞれシートごとに別のブックにしたいと思っています。 マクロやVBAなどを使って簡単に出来るものでしょうか? マクロ集などのサイトを探してみましたが、上手く見つけることができませんでした。 シート名をブック名として引き継いで保存できればベターだと思っております。それが出来なくてもブックとして起こせれば大丈夫です。 何かわかられましたらお教えいただけますと幸いです。 どうぞよろしくお願いします。

  • エクセルマクロ コピー元と貼り付け先を指定してコピー&ペーストを実行するマクロ

    単刀直入にやりたいことを述べます。 Cドライブと仮定します。3つのBOOKがあります。 それぞれ ----- BOOK1.xls「○○Sheet」・・・(実行するファイル)   A 1 BOOK2.xls「△△Sheet」・・・(コピーするファイル名の指定です) 2 A2:E2・・・(コピーするセル範囲の指定) 3 BOOK3.xls「□□Sheet」・・・(貼り付け先のファイル名の指定です) 4 A5・・・(貼り付け先のセルの指定) ----- BOOK2.xls「△△Sheet」・・・(コピー元ファイル)   ABCDE 1 あいうえお 2 かきくけこ 3 ・・・・・ ----- BOOK3.xls「□□Sheet」・・・(貼り付け先のファイル)   ABCDE 1 ・・・・・ 2 かきくけこ・・・(貼り付け) 3 ・・・・・ ----- >やりたいこと BOOK1.xls「○○Sheet」のA1のセルの値とA2セルの値を参照し、 その該当BOOKのセル範囲(BOOK2.xls「△△Sheet」のA2:E2)をコピーして、 BOOK1.xls「○○Sheet」のA3のセルの値と、A4セルの値を参照し、 その該当BOOKのセル範囲(BOOK3.xls「□□Sheet」のA5)へペーストする。 別のブックの指定したセルの値を別のブックの指定したセルへ貼り付けるだけなんですが、 以前関数を使って似たような事をしようとしたのですが、うまくいかなかったので、マクロならできるのでしょうか。 よろしくお願いします。(ちなみにエクセル2000又は2003です)

  • 複数ワークシートの同一印刷範囲指定(エクセル)

    エクセルでのマクロについての質問です。例えば同一ブック内に、シート1で作成した「○○請求書」をコピーしてシート1と全く同じ内容の99個のワークシートを作成しました。このとき、シート1からシート100まで一部の範囲だけ(例えばセルA3からH50)を同時に印刷範囲指定するにはどのようなマクロを作成すればよいのでしょうか、マクロの参考書等も見て自分なりにチャレンジしてはみたのですがうまくいきません。(印刷範囲まで指定したシートをコピーすればよかったのかもしれませんが・・・)

  • とあるシートの複数のセルの範囲の値と、とあるフォル

    とあるシートの複数のセルの範囲の値と、とあるフォルダにあるファイル名が部分一致していたら、そのファイルを別の指定のフォルダに入れるVBAを大まかでいいので教えてください。 (1)アクティブになっているブック内にあるシートのとあるセル範囲のそれぞれの値(例:1111、2222、3333...) (2)開いていないフォルダ内にあるファイル名(例:1111-H8-32.xlsなど) が部分一致したとき、そのファイルを別のフォルダ内に移動させたいのですが、いまいちわかりません、教えていただけないでしょうか?

  • 複数あるブックの特定シートの特定範囲を1つにしたい

    EXCEL2010を使用しています。 あるフォルダに格納されている複数のブックの、特定シートを、1つのシートにまとめたいです。 複数のブックの作りは同じです。 1つのブックに、複数シートがあり、"(配置)"というシートだけを、新規のシートにまとめたいです。 <今ある各ブック> ファイル名は、2014年度特定措置_●●.xlsで、●●だけ、ブック名が違います。 シート名が"(配置)"です。 c3セルに部署名が入っています。 b4セルからe10セルまで数式が入っています。 <行いたいこと> 新規のシートのa列に、各ブックにあるc3セルの部署名を持ってきたい。 b列からe列に、各ブックにあるb4セルからe10セルまでの数式を値張りし、取り込みたい。 以上です。 つたない説明で恐縮ですが、大変困っております。 どうか、ご回答の程、どうぞよろしくお願いいたします。

  • エクセル・マクロ・・・シート名の取得等

    エクセル・マクロ・・・シート名の取得等 エクセルのマクロで質問です。 ほぼ初心者です。 社内データの処理をしたいと考えています。 マクロを組みたいエクセルブックの構成としては・・・ シート名一覧 集計シート 操作 という3つのシートがあり、 その後ろに各社員のデータシートがあります。 山田太郎 田中花子 ・ ・ ・ 部署により社員数が異なるためシートの4枚目以降は そのエクセルファイルによりシート数が異なります。 やりたいことは以下の2点です。 (1)シート名(社員名)の取得 シート名一覧に各シート名を一行ずつ入れて 一覧を作りたいです。 シート名取得&リスト化のマクロは大体わかりますが、 「シート名一覧」、「集計シート」、「操作」の3つのシート名は 一覧から外したく、どうしたらいいのかわかりません。 また、各シート名を取得した列の横の列に 各社員のシートにあるデータの一部(セルC5:C8)を 貼り付けたいです。 (2)集計シートに各社員のシートのD列の情報(D6:D43)を順に貼り付けていく。 シート名や数が固定されたものであれば何とかできそうなのですが、 不特定になるとどうしたらよいかさっぱりわかりません。 どなたかご教授お願いいたします。

専門家に質問してみよう