• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:8方向との数字の差が0か1の場合にセルを塗潰す方法)

8方向との数字の差が0か1の場合にセルを塗潰す方法

このQ&Aのポイント
  • 質問文章から8方向との数字の差が0か1の場合にセルを塗潰す方法を知りたいです。
  • 6×6のセルがあり、1~99までの数字がランダムに重複ありで入っています。
  • 左上から右下へセルの数字を見て、8方向の数字との差が0か1の場合にセルを塗潰したいです。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.2

全プログラムに獏がありました。B2とA1のような左斜めは無視されます。差し替えです。 ' Sub Macro1() '   Dim Cell1 As Range   Dim Cell2 As Range   Dim RowF As Boolean   Dim ColF As Boolean      [A1:M6].Interior.Pattern = xlNone '   For Each Cell1 In [A1:M6]     RowF = Cell1.Row > 1     ColF = Cell1.Column > 1 '     For Each Cell2 In Cell1.Offset(RowF, ColF).Resize(2 - RowF, 2 - ColF) '       If Cell1 < "01" Or Cell2 < "01" Then       ElseIf Cell1.Address <> Cell2.Address And Abs(Cell2 - Cell1) < 2 Then         Cell1.Interior.Color = vbYellow         Exit For       End If     Next Cell2   Next Cell1 End Sub

その他の回答 (5)

回答No.6

> 8方向(上、下、左、右、右下、左下、右上、左上)の数字との差が0と1の場合に、 端っこの処理が面倒なので、0や99と2以上の差がある数で埋めとくのが良いかも。   A  B  C  D 1 -99 -99 -99 -99 2 -99  01  11  15 3 -99  03  26  30 式が長くなるけど、フツーに条件付き書式を設定すれば良いのでは。 上のB2セルだと、 =OR((ABS(B2-A1)<=2), (ABS(B2-B1)<=2), (ABS(B2-C1)<=2), (ABS(B2-A2)<=2), (ABS(B2-C2)<=2), (ABS(B2-A3)<=2), (ABS(B2-B3)<=2), (ABS(B2-C3)<=2)) とか。

moguo4649
質問者

お礼

はじめまして。 回答頂きありがとうございます。 条件付き書式を駆使すれば可能性ありなんですね。

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.5

確認させてください。 類似の質問を延々と続けられていますが、何か“超難問クイズ”擬きの作成をしておられるのでしょうか?

moguo4649
質問者

お礼

いつも回答頂きありがとうございます。 >何か“超難問クイズ”擬きの作成をしておられるのでしょうか?  それを解くためにエクセルの可能性を探っています。 皆さんのお力を拝借して。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

訂正 Range("A1:M11").Interior.Color = xlNone     ↓ Range("A1:M6").Interior.Color = xlNone

moguo4649
質問者

お礼

いつも回答頂きありがとうございます。 また、無駄のないソースとバリエーションも豊富ですね。 またよろしくお願いします。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

Sub Test()   Dim c As Range, i As Long, n As Long   Dim arrR As Variant, arrC As Variant   Range("A1:M11").Interior.Color = xlNone   arrR = Array(0, 0, 0, 1, 1, 2, 2, 2)   arrC = Array(0, 1, 2, 0, 2, 0, 1, 2)   On Error Resume Next   For Each c In Range("A1:M6")     For i = 0 To 7       With c.Cells(arrR(i), arrC(i))         n = Val(c.Value) - Val(.Value)         If (Abs(n) = 1 Or Abs(n) = 0) And _           (.Column <> 7 And .Column <> 14 And .Row <> 7) Then           .Interior.Color = vbYellow         End If       End With     Next   Next   On Error GoTo 0 End Sub

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.1

B3が16でC4が17だから、塗りつぶしの対象ではないですか。 K1が27、K2が26、上より下が小さい場合は塗りつぶしの対象ですか?(対象としました) よく観察すると、ほとんどに差が0か1のところがあり、塗りつぶされます。 ' Sub Macro1() '   Dim Cell1 As Range   Dim Cell2 As Range      [A1:M6].Interior.Pattern = xlNone '   For Each Cell1 In [A1:M6] '     For Each Cell2 In Cell1.Resize(2, 2) '       If Cell1 < "01" Or Cell2 < "01" Then       ElseIf Cell1.Address <> Cell2.Address And Abs(Cell2 - Cell1) < 2 Then         Cell1.Interior.Color = vbYellow         Cell2.Interior.Color = vbYellow         Exit For       End If     Next Cell2   Next Cell1 End Sub 前回のリベンジです。 前回うまくいかなかったのは、F列にスペースなど見えない文字が入っていたのだと思います。 今回はスペースが入っていても動くようにしました。

参考URL:
https://okwave.jp/qa/q9549901/a26667546.html
moguo4649
質問者

お礼

いつも回答頂きありがとうございます。 >B3が16でC4が17だから、塗りつぶしの対象ではないですか。  ご指摘頂きありがとうございます。  目で見てるとやっぱり漏れてしまうものですね。  だからエクセルが必要なんです。

関連するQ&A