- ベストアンサー
エクセルマクロ 範囲内のTOP行位置等を知りたいです。
エクセルマクロで以下の事がしたいのですが、行き詰ってしましました。 どなかたご教授願います。 事前に セルのA1:B3 に名前をつけておきます。 名前は"board"とします。 (1)選択したセルが"board"内に含まれるかどうかをマクロで判定したい。 (2)"board"範囲のセルに対して一つづつある処理をしたいのです。 (たとえば、色を変えるとか、データをSETするとか。) FOR文をふたつ組み合わせて 順番に処理しようとしているのですが、"board"のTOPの行 と 最終行、及び 同じくTOPの桁位置 と 最終桁 を取得するにはどうすればいいでしょうか? ROW1 = 7 ← この4つの変数を動的に取得したいのです。 ROW2 = 17 COL1 = 9 COL2 = 21 For I = ROW1 To ROW2 For K = COL1 To COL2 Cells(I, K).Select If Selection.Interior.ColorIndex = COLKUROX Then Selection.Interior.ColorIndex = COLKURO ElseIf Selection.Interior.ColorIndex = COLSIROX Then Selection.Interior.ColorIndex = COLSIRO ElseIf Selection.Interior.ColorIndex = COLWAKUX Then Selection.Interior.ColorIndex = COLWAKU End If Next Next (3)これはマクロとは関係ないのですが・・・ "board"の名前を設定するときに間違って違うセル範囲につけてしまいました。 一旦つけた名前を削除したいのですが、やり方がわかりません。 以上 3 点 についてお願いします。 (1)は(2)を解決できれば、IF 文を使ってできそうなのですが、 Intersect を使ってできないでしょうか? Set myRange = Application.Intersect(??????, Range("board")) ↑ ?????のところに指定したセルを書けば、このマクロの結果がエラーになるかならないかで判定できないかな・・・・と。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1) Set x = Range("A1") Set board = Range("board") Set unionRange = Application.Union(board, x)'合体したRange If unionRange.Address = board.Address Then'合体したRangeがboardのRangeと等しい(はみ出ていない)ならboardに含まれる MsgBox "含む" Else MsgBox "含まない" End If (2) 順番が関係あるなら、 Range("board").cells(1,1) が指定されて範囲の左上のセルになります。 なので、 Range("board").cells(r,c) でそれぞれのセルにアクセスできます。 指定された範囲に何行及び何列あるかは、 Range("board").rows.count Range("board").Columns.Count で得られます。 (3) ワークシート画面 メニューの挿入~名前~定義 で、範囲の再設定や、名前の削除ができます。
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 (2)だけですが、、、 >(2)"board"範囲のセルに対して一つづつある処理をしたいのです。 Dim rngC As Range For Each rngC In Range("board") With rngC.Interior Select Case .ColorIndex Case Is = COLKUROX: .ColorIndex = COLKURO Case Is = COLSIROX: .ColorIndex = COLSIRO Case Is = COLWAKUX: .ColorIndex = COLWAKU End Select End With Next rngC For Each と With と Select Case を組み合わせるとコードがスッキリします。 ちなみに、ご質問の範囲の各頂点は下記で求められます。 ROW1 = Range("board").Row COL1 = Range("board").Column With Range("board") ROW2 = .Rows(.Rows.Count).Row COL2 = .Columns(.Columns.Count).Column End With
お礼
ありがとうございます。 FOR EACH ってあんまり使った事がないのです。 このように使うと便利そうですね。 WITH の中でこんな事もできるんですね・・・ ありがとうございます。 すっきりできるコードにしたと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)はUnionを使う (2)はFor Eachでよいでしょう 範囲の名aaaで 1 3 2 4 3 5 の時、1-3-2-4-3-5の順に処理されますが。 Sub test01() Dim cl As Range For Each cl In Range("aaa") MsgBox cl Next End Sub (3)名前の抹消 ActiveWorkbook.Names("aaa").Delete マクロの記録より判る。
お礼
さっそくの回答ありがとうございます。 (1)Unionですか? 使った事ないのえ調べてみます。 簡単に使えるでしょうか・・? (2)ありがとうございます。 For Each で書き換えてみます。 これを使えばTOPの行と桁を変数に入れる事もできない事はないですね。一番小さいのが、TOPで、大きいのが最終・・・ (3)はマクロではなく、操作方法がわからないのです・・・ 間違って名前をつけたのですが、取り消せなくなったので・・・・・
お礼
ありがとうございます。 UNIONの使い方わかりました。 全て解決しました。 (3)・・・こんな所にあったんですね・・・・ ありがとうございます。 勉強になりました。