• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:3×3マスの数字を横一列に並べて同じ数字を塗潰す)

3×3マスの数字を横一列に並べる方法と同じ数字を塗潰す方法

このQ&Aのポイント
  • 3×3マスの数字を横一列に並べて同じ数字を塗潰す方法を教えてください。
  • 質問者は、A1~K11の中にある4つの3×3マスにそれぞれ異なる数字がある状態で、これらの数字を左から昇順にN2~V5に出力したいと考えています。
  • また、質問者は「左上赤枠」と「右上赤枠」、「左下赤枠」と「右下赤枠」の数字を比べて、同じ数字があれば黄色に塗り潰す方法も知りたいとしています。

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

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.1

VBAを使えば、以下の各機能を積み上げていくだけで作成できます。 ・比較する値があるセル範囲を取得。 ・そのセル範囲から値を取得。 ・取得した値をソート。 ・ソートした配列を出力。 ・ソートした配列の各値を比較、同じならば相当するセルを着色する。 以下は、参考用に軽く組んでみたものです。 [GetInputRange]プロシージャの内容を変更する事で、何組でも比較できるようになります。また、3*3以外のセル範囲にも対応しています。 Option Explicit Private Type Dat  Input As range '値が入ったセル範囲。  Ary() As Double '値を格納した配列。 End Type Sub PairCheck()  '値が入っているセル範囲を設定。  Dim PairData() As Dat  PairData = GetInputRange  'セル範囲から値を取得してソート。  Dim i As Long  Dim cntMin As Long, cntMax As Long  cntMin = LBound(PairData)  cntMax = UBound(PairData)  For i = cntMin To cntMax   Call SetSortValue(PairData(i))  Next i  'ソートした値を比較、指定範囲に出力。  For i = cntMin To cntMax Step 2   Call OutputPair(Cells(i + 1, 14), PairData(i), PairData(i + 1))  Next i End Sub Private Function GetInputRange() As Dat()  '値が入っているセル範囲を設定。  '必ず偶数にする事。  Dim D() As Dat  ReDim D(1 To 4)  Set D(1).Input = Cells(2, 2).Resize(3, 3)  Set D(2).Input = Cells(2, 8).Resize(3, 3)  Set D(3).Input = Cells(8, 2).Resize(3, 3)  Set D(4).Input = Cells(8, 8).Resize(3, 3)  GetInputRange = D End Function Private Sub SetSortValue(D As Dat)  Dim i As Long, cnt As Long  cnt = D.Input.Count  'セル範囲から値を取得。  ReDim D.Ary(1 To cnt)  For i = 1 To cnt   D.Ary(i) = D.Input(i)  Next i  '取得した値をソート。  D.Ary = BubbleSort(D.Ary) End Sub Private Function BubbleSort(argAry() As Double) As Double()  'バブルソート  Dim vSwap As Variant  Dim i As Long  Dim j As Long  For i = UBound(argAry) To LBound(argAry) Step -1   For j = LBound(argAry) To i - 1    If argAry(j) > argAry(j + 1) Then     vSwap = argAry(j)     argAry(j) = argAry(j + 1)     argAry(j + 1) = vSwap    End If   Next j  Next i  BubbleSort = argAry End Function Private Sub OutputPair(baseCell As range, Dat1 As Dat, Dat2 As Dat)  'エラーチェック  If Dat1.Input.Count <> Dat2.Input.Count Then   MsgBox "比較する2つのセル範囲の大きさが異なります。"   End  End If  '値を出力。  Dim cnt As Long  cnt = Dat1.Input.Count  baseCell.Offset(0, 0).Resize(1, cnt) = Dat1.Ary  baseCell.Offset(1, 0).Resize(1, cnt) = Dat2.Ary  '値を比較して着色。  Dim i As Long, j As Long  For i = 1 To cnt   For j = 1 To cnt    If Dat1.Ary(i) = Dat2.Ary(j) Then     baseCell.Offset(0, i - 1).Interior.Color = RGB(255, 255, 153)     baseCell.Offset(1, j - 1).Interior.Color = RGB(255, 255, 153)    End If   Next j  Next i End Sub

sazanami0422
質問者

お礼

早速回答頂きありがとうございます。 また、ロジックの考え方と処理中のコメントをつけて頂き勉強になりました。 やりたいことができました。 ありがとうございました。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

添付画像のセル位置で決め打ち的に Sub Test() Dim i As Long, j As Long, k As Long, m As Long, n As Long Dim mRange As Variant Dim mRow As Long: mRow = 2 Dim c As Range, FRange As Range Range("N2:V5").Interior.ColorIndex = xlNone For i = Range("B2").Row To Range("H8").Row Step (Range("H8").Row - Range("B2").Row) For j = Range("B2").Column To Range("H2").Column Step (Range("H2").Column - Range("B2").Column) Set mRange = Range(Cells(i, j), Cells(i, j).Offset(3, 3)) n = 0 For k = 1 To 3 For m = 1 To 3 Cells(mRow, Cells(mRow, "N").Column + n).Value = mRange(k, m).Value n = n + 1 Next Next Range(Cells(mRow, "N"), Cells(mRow, "V")).Sort _ Key1:=Cells(mRow, "N"), Order1:=xlAscending, _ Header:=xlNo, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlSortRows, _ SortMethod:=xlPinYin mRow = mRow + 1 Next Next For i = 2 To 4 Step 2 For Each c In Range(Cells(i, "N"), Cells(i, "V")) Set FRange = Range(Cells(i + 1, "N"), Cells(i + 1, "V")).Find(c.Value, LookIn:=xlValues, LookAt:=xlWhole) If Not FRange Is Nothing Then c.Interior.Color = vbYellow FRange.Interior.Color = vbYellow End If Set FRange = Nothing Next Next End Sub

sazanami0422
質問者

お礼

いつもお世話になっております。 マス固定だとこのようなVBAになるのですね。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

VBAと「エクセルの条件付き書式設定の操作」の組み合わせでやってみた。 (1)マスの範囲をマウスで選択。 (2)下記説明のボタンをクリック (3)H-P列にセルに、各マスのデータがよこ1列に並べられる。 (4)条件を満たしたセルに色が着く (5)これをマスごとに繰り返す。 ーーー データのあるシートをSheet1とする。 そのシートにコマンドボタンを1つ貼り付け そのボタンのクリックイベントように、標準モジュールに Sub test01() j = 8 'H列から r = Range("H100000").End(xlUp).Row + 1 For Each cl In Selection Cells(r, j) = cl j = j + 1 Next End Sub ーー Sheet1のシートモジュールに Private Sub CommandButton1_Click() test01 End Sub Sheet1のH1:Pxを範囲指定して(xは適当な行数字を示す) ホームー条件付き書式ー新しいルールー数式を使用して・・ 数式は =COUNTIF($H1:$P1,H1)>=2 $の付いてないところは、そのまま付けないようにするように注意。 書式は、塗りつぶしの黄色(お好みで)。

sazanami0422
質問者

お礼

いつもお世話になっております。 別回答をいただきありがとうございます。 全てVBAでなくてもできるのですね。 今の私にはちょっと難しいです。 ありがとうございました。

関連するQ&A