- ベストアンサー
エクセル マクロ 線対称・点対称の位置に色づけする
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
sub macro1() ’J10セルに対して点対象位置 dim org as range set org = range("J10") on error resume next org.offset(org.row - activecell.row, org.column - activecell.column).interior.colorindex = 4 end sub sub macro2() ’J列に対して線対象位置 dim org as range set org = cells(activecell.row, "J") on error resume next org.offset(org.row - activecell.row, org.column - activecell.column).interior.colorindex = 6 end sub #同じマクロを流用していますが,勿論行オフセットをゼロに固定して構いません
その他の回答 (3)
- NotFound404
- ベストアンサー率70% (288/408)
遅ればせながら・・・。 下記コードをシートモジュールにコピペッタン。 使い方 A2セルに基準となるアドレスを入れます。 半角で、L10 とか m15 など。 A3セルには、半角小文字で、p h v のいずれか。 p→点 h→水平 v→垂直 A1セルに、半角で0以外を入力。 青(選択セル)に合わせて 赤セルが移動します。 エラー処理は手抜きなので、動かなくなったらエクセルを再起動のこと。 もしかしたらバージョン違いで動かないかも?当方Excel2010。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next Dim rBase As Range '基準点(線) Dim hB As Integer, vB As Integer Dim cC '点、縦、横の選択 If Range("A1") = 0 Then Exit Sub Set rBase = Range(Range("A2").Value) If Err.Number <> 0 Then Exit Sub cC = Range("A3").Value Application.EnableEvents = False Application.ScreenUpdating = False 'シート内の色をクリア Cells.Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With '基準点(線)設定 Select Case cC Case "p" rBase.Interior.Color = vbBlack Case "h" Rows(rBase.Row).Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorDark1 .TintAndShade = -0.349986266670736 .PatternTintAndShade = 0 End With Case "v" Columns(rBase.Column).Select With Selection.Interior .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorDark1 .TintAndShade = -0.349986266670736 .PatternTintAndShade = 0 End With End Select Target.Select Target.Interior.Color = vbBlue hB = rBase.Row - Target.Row vB = rBase.Column - Target.Column Select Case cC Case "p" rBase.Offset(hB, vB).Cells.Interior.Color = vbRed Case "h" Cells(rBase.Offset(hB, 0).Row, Target.Column).Cells.Interior.Color = vbRed Case "v" Cells(Target.Row, rBase.Offset(0, vB).Column).Cells.Interior.Color = vbRed End Select Application.ScreenUpdating = True Application.EnableEvents = True End Sub
お礼
ご教授ありがとうございました。 エラー無く実行できました。 基準値をセル入力できるので,応用が利きそうです。 また何かありましたらよろしくお願いいたします。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 面白そうなのでトライしてみました。 Sheetモジュールです。 Dim myRow As Long, myCol As Long, c As Range, r As Range 'この行から Dim myX As Long, myY As Long Sub SAmple1() If Selection.Count > 1 Then MsgBox "1セルのみ選択" Exit Sub End If With ActiveSheet .Cells.ClearContents .Cells.Interior.ColorIndex = xlNone End With With Selection .Value = "○" .Font.ColorIndex = 6 .Interior.ColorIndex = 6 End With MsgBox "点対象の場合はひとつのセルを" & vbCrLf & "線対象の場合は複数セルを選択" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set c = ActiveSheet.Cells.Find(what:="○", LookIn:=xlValues, lookat:=xlWhole) Set r = ActiveSheet.Cells.Find(what:="×", LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing And Not r Is Nothing Then Exit Sub With Target If .Count = 1 Then .Value = "×" .Font.ColorIndex = 1 .Interior.ColorIndex = 1 myRow = Abs(c.Row - .Row) myCol = Abs(c.Column - .Column) If c.Row > .Row Then myX = myRow * -2 Else myX = myRow * 2 End If If c.Column > .Column Then myY = myCol * -2 Else myY = myCol * 2 End If c.Offset(myX, myY).Interior.ColorIndex = 3 ElseIf Target(1).Row = Target(Target.Count).Row Then .Value = "×" .Font.ColorIndex = 1 .Interior.ColorIndex = 1 myRow = Abs(c.Row - .Row) If c.Row > .Row Then myX = myRow * -2 Else myX = myRow * 2 End If c.Offset(myX).Interior.ColorIndex = 3 ElseIf Target(1).Column = Target(Target.Count).Column Then .Value = "×" .Font.ColorIndex = 1 .Interior.ColorIndex = 1 myCol = Abs(c.Column - .Column) If c.Column > .Column Then myY = myCol * -2 Else myY = myCol * 2 End If c.Offset(, myY).Interior.ColorIndex = 3 Else MsgBox "1行、または1列を選択してください" Exit Sub End If End With End Sub 'この行まで ※ まず最初のセル(起点のセル)を選択してマクロを実行してみてください。 ※ 対象セルがSheet外の場合はエラーとなります。m(_ _)m
お礼
ご教授ありがとうございました。 基準セル・基準列がその都度指定できるのが,応用が利きそうでおもしろかったです。このコードをアレンジしてみたいと思いました。 また何かありましたらよろしくお願いいたします。
- satoron666
- ベストアンサー率28% (171/600)
とりあえず、ヒントまで。 Sub Sample2() Dim SelectRangeAddress As String SelectRangeAddress = Selection.Address Names.Add Name:="中心", RefersTo:="=" & SelectRangeAddress End Sub Sub Sample3() Dim SelectRangeAddress As String SelectRangeAddress = Selection.Address Names.Add Name:="アクティブセル", RefersTo:="=" & SelectRangeAddress End Sub 上記のものは、選択した位置に名前を定義するものです。 プログラムの流れとして、 1.セルを選択させるウィンドウを出す(対象の軸を選択してください。) ⇒きちんとした値が出るまで繰り返す きちんとした値が入力されたら、色を塗る 2.セルを選択させるウィンドウを出す(対象の中心?を選択してください)⇒きちんとした値が出るまで繰り返す きちんとした値が入力されたら、色を塗る 3.アクティブセルと軸?の対象位置を割り出す (Offsetとか色々算出方法はある?) うーん、こんな流れですかねぇ… せめて、対称位置の割り出し方法は考えてもらえませんか?
お礼
ご教授ありがとうございました。 OFFSETで対称位置を割り出してみたいと思います。 また何かありましたらよろしくお願いいたします。
お礼
ご教授ありがとうございました。 私のやりたいことに一番近かったコードでした。 また何かありましたらよろしくお願いいたします。