• ベストアンサー

VBN セルの結合と、色分け

VBN教えてください。 画像の左→右のようにしたいのですが、 まず、1列目の上下同じセルを結合します。 2列目、3列目は、1列目の結合範囲内で、上下同じセルを結合します。 さらに、結合された1列目を基準に、交互に色をつけたいのです。 詳しい方、教えていただけませんでしょうか。 よろしくお願い致します。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (719/1488)
回答No.3

上げたサンプルでは、 B列が変わったらC列を分割するのか B列が変わってもC列を分割しないのか 両方のパターンがあり、どっちか判りません。 今回は、B列が変わったらC列を分割するパターンです。 Option Explicit Option Base 1 ' Sub Macro1()   Dim Row As Long   Dim MergeFlg As Boolean   Dim Col As Integer   Dim STartArr(3) As Long   Dim Start As Variant   Dim ColorFlg As Boolean '   Application.DisplayAlerts = False '   For Row = 2 To [A1].End(xlDown).Row     MergeFlg = False '     If Cells(Row, "A") <> Cells(Row + 1, "A") Then       Start = STartArr(1) + 2       ColorFlg = Not ColorFlg '       If ColorFlg Then         Cells(Start, "A").Resize(Row - Start + 1, 3) _           .Interior.Color = &HDAE9FC       End If     End If '     For Col = 1 To 3 '       If Cells(Row, Col) <> Cells(Row + 1, Col) Or MergeFlg Then         Start = STartArr(Col) + 2         Cells(Start, Col).Resize(Row - Start + 1).Merge         STartArr(Col) = Row - 1         MergeFlg = True       End If     Next Col   Next Row   Range("A1:C" & Row).Borders(xlInsideHorizontal).LineStyle = xlContinuous   Application.DisplayAlerts = True End Sub

kometoshi555
質問者

お礼

細かいところまで配慮いただき、ありがとうございます。 説明至らなく、申し訳ありませんでした。 少し、アレンジもでき、実施したいこと、解決できました。 私も自分で作れたらと思うのですが、基礎がないのでなかなか。。。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

すでに2回答が出ているが、当方でもやってみたので、参考に。 例データ 質問例を使う Sheet2 A1:C21に、元データをコピーしてテストがよい。 1列目 2列目 3列目 a 1 5 a 1 5 b 1 6 b 1 6 b 1 6 b 1 7 b 1 7 b 1 7 b 1 7 c 2 7 c 2 7 c 2 7 c 2 7 c 2 7 d 2 6 d 2 6 d 2 6 d 2 6 d 3 6 d 3 6 ーー 大切な前提 A列を第Iソートキー B列を第2ソートキー でソートしてあるものとする。 ーーー 標準モジュールに Sub test02() Application.DisplayAlerts = False Dim flg As Boolean flg = True Set sh1 = Worksheets("Sheet2") '-- lr = sh1.Range("a10000").End(xlUp).Row ´MsgBox lr '--初期設定 mk = sh1.Cells(2, "A") & "-" & sh1.Cells(2, "B") 'A列+B列キー s = 2 'スタートデータ行 r = 1 '結合範囲の行数 '---´各行で上行から繰り返し処理 For i = 3 To lr k = sh1.Cells(i, "A") & "-" & sh1.Cells(i, "B") If k = mk Then 'A列とB列文字列組み合わせで、変わったかどうから r = r + 1 Else '---変わった sh1.Range("A" & s & ":A" & s + r - 1).MergeCells = True sh1.Range("B" & s & ":B" & s + r - 1).MergeCells = True sh1.Range("A" & s & ":C" & s + r - 1).Borders(xlBottom).LineStyle = xlSingle '---塗りつぶしの色 If flg = True Then sh1.Range("A" & s & ":C" & s + r - 1).Interior.Color = rgbYellow Else sh1.Range("A" & s & ":C" & s + r - 1).Interior.Color = rgbPink End If flg = Not flg '反転 '-- s = i r = 1 End If mk = sh1.Cells(i, "A") & "-" & sh1.Cells(i, "B") Next i '--データが終わった最後の後じまい sh1.Range("A" & s & ":A" & s + r - 1).MergeCells = True sh1.Range("A" & s & ":A" & s + r - 1).MergeCells = True sh1.Range("B" & s & ":B" & s + r - 1).MergeCells = True sh1.Range("A" & s & ":C" & s + r - 1).Borders(xlBottom).LineStyle = xlSingle '--- If flg = True Then sh1.Range("A" & s & ":C" & s + r - 1).Interior.Color = rgbYellow Else sh1.Range("A" & s & ":C" & s + r - 1).Interior.Color = rgbPink End If '---- Application.DisplayAlerts = True End Sub ーーー 塗りつぶしの色は黄色とピンクのような、薄い色にしている。 その他の色にするなら、WEBで「VBA 塗りつぶし色 RGB」で調べてください。 テストを繰り返す場合は、例えば下記を使ってクリアするとよい。 Sub test03() Set sh1 = Worksheets("Sheet2") '--テスト時用 sh1.Cells.Clear sh1.Range("a1:C10000").MergeCells = False sh1.Range("a1:C21").Interior.Color = xlNone End Sub ーー 実行結果 下記は回答記事では、列が崩れるかも(もちろん色は出ていない)しれないので、自分の実行結果の方を見てください。 1列目 2列目 3列目 a 1 5 5 b 1 6 6 6 7 7 7 7 c 2 7 7 7 7 7 d 2 6 6 6 6 d 3 6 6

kometoshi555
質問者

お礼

解説もつけていただいてありがとうございます。 わかりやすかったです。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1625/2467)
回答No.2

C列の6は分割しなくていいと思いますので以下のような感じでいかがですか。 色は同じ色がわからなので適当です。CellColorSetのところで変更してください。 Sub Test() Dim c As Range, d As Range Dim FRow As Long, MFRow As Long, MLRow As Long, i As Long Dim flg As Boolean: flg = False Application.ScreenUpdating = False Application.DisplayAlerts = False FRow = 2 Call DrawLine(1, 3, 1) For Each c In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) If c.Value <> c.Offset(1, 0).Value Then Range(Cells(FRow, 1), Cells(c.Row, 1)).Merge Call DrawLine(1, 3, c.Row) If flg = False Then Call CellColorSet(1, FRow, 3, c.Row) flg = True Else flg = False End If FRow = c.Offset(1, 0).Row End If Next For i = 2 To 3 MFRow = 2 For Each c In Range(Cells(2, i), Cells(Rows.Count, i).End(xlUp)) With Cells(c.Row, 1).MergeArea MLRow = .Item(.Count).Row End With If MFRow = MLRow Then Range(Cells(MFRow, i), Cells(MLRow, i)).Merge Call DrawLine(i, i, c.Row) MFRow = c.Offset(1, 0).Row ElseIf MLRow <> c.Offset(2, 0).Row Then If c.Value <> c.Offset(1, 0).Value Or c.Row = MLRow Then Range(Cells(MFRow, i), Cells(c.Row, i)).Merge Call DrawLine(i, i, c.Row) MFRow = c.Offset(1, 0).Row End If End If Next Next Columns("A:C").HorizontalAlignment = xlCenter Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub Function DrawLine(ByVal FCol As Long, ByVal Ecol As Long, ByVal mRow As Long) With Range(Cells(mRow, FCol), Cells(mRow, Ecol)).Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .Weight = xlThin End With End Function Function CellColorSet(ByVal FCol As Long, ByVal FRow As Long, ByVal LCol As Long, ByVal CRow As Long) With Range(Cells(FRow, FCol), Cells(CRow, LCol)).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent4 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Function

kometoshi555
質問者

お礼

できました! ありがとうございます。 みなさん、すごいですね。

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (719/1488)
回答No.1

VBN が何だかわからないので、VBA で作りました。 C10 は隣のB10 が変化してますが、分割しなくていいのですか。 Option Explicit Option Base 1 ' Sub Macro1()   Dim Row As Long   Dim MergeFlg As Boolean   Dim Col As Integer   Dim STartArr(3) As Long   Dim Start As Variant   Dim ColorFlg As Boolean '   Application.DisplayAlerts = False '   For Row = 2 To [A1].End(xlDown).Row     MergeFlg = False '     If Cells(Row, "A") <> Cells(Row + 1, "A") Then       Start = STartArr(1) + 2       MergeFlg = True       ColorFlg = Not ColorFlg '       If ColorFlg Then         Cells(Start, "A").Resize(Row - Start + 1, 3) _           .Interior.Color = &HDAE9FC       End If     End If '     For Col = 1 To 3 '       If Cells(Row, Col) <> Cells(Row + 1, Col) Or MergeFlg Then         Start = STartArr(Col) + 2         Cells(Start, Col).Resize(Row - Start + 1).Merge         STartArr(Col) = Row - 1       End If     Next Col   Next Row   Range("A1:C" & Row).Borders(xlInsideHorizontal).LineStyle = xlContinuous   Application.DisplayAlerts = True End Sub

kometoshi555
質問者

お礼

早速ありがとうございます。 VBAでした、失礼しました。 そのまま使わせていただいて、できました。 なにが書いてあるか、理解できていないのですが、解読して、応用できるようにしたいです。 大変助かりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 変わった方法でセルの結合をしたい

    画像の左のような表で、横4つのセルの結合をしたいのですが、結合した後にいずれかの数字を残すのではなく、右の表のように数字を左からくっつけたものが欲しいです。 結合して元の表が無くなってもかまいませんし、新しく列を作ってそこに出力しても良いです。 どなたか、方法をご教授願えませんでしょうか。

  • エクセルのセル結合の後

    エクセルの「セルを結合して中央揃え」した文字列を、左詰めにする方法を教えてください。 宜しくお願い致します

  • MSFlexGridでのセル結合について

    お世話になります。 MergeCellsにてセルを結合したのですが、結合したセルの文字位置が左詰になってしまいます。 中央揃えにしたいのですが、どなたか解るかたご教授願います。 宜しくお願い致します。

  • 結合されたセルの一覧出力 VBA

    お世話になります。 結合されたファイルの一覧を出力したいと思っています。 (できれば、変数に出力したいです) 表があり、ばらばらな範囲で結合されています。 結合した部分には、日付が入っています。 日付が入っている列は、B列とH列で、 その中で「AA」「BB」と入力されている結合セル以外の 結合セル範囲?行?を取得したいと思っております。 B列とH列の結合セル行が同じではありません。 B列は、B5:B13、B18:B25、B30:37 (それ以外のセルは結合してあっても、「AA,BB]と書いてある H列は、H6:H13,H18:H25、H30::H35,H36:H40(上と同じ) ということになっております。 できれば、 1.セル結合範囲を検索(行数取得?) 2.セルの内容が日付かどうか確認 3.日付なら、セル行数を取得 ということがしたいです。 日付の形式は、3/1などのように入っています。 このフォームが結構変わるため、 結合しているセルの中身が日付かどうかを確認し、 日付なら行数取得→色んなプログラムでその行数を使用 したいと思っています。 分かりにくい部分が多いかと思いますが、 回答お願い致します。

  • エクセル95か97でセルを結合できない

    人のPCで一瞬しかさわってないのでエクセル95か97のどちらかわかりませんでした セルを結合しようとして、横に連続した3つのセルを選択して右クリック、セルの書式設定、配置と進みましたが、「セルを結合する」の部分が灰色になっていて結合できないようになっていました ツールバーの「セルを結合して中央に揃える」のボタンも同じく灰色で押せない状態になっていました どうしてそうなったのか分かりません 何か設定をしたのでしょうか

  • エクセルのセル結合

    エクセルのセル結合について教えて下さい。 静岡県  静岡市あああ町5-32 あああビル111号 と言う風に、みっつの列にデータが入っています。 この列を一つに結合して  静岡県静岡市あああ町5-32あああビル111号 としたいのですが、できません。結合しようとすると、一番左の列意外はデータが消えてしまいますと言われてしまいます。

  • エクセルのセル~結合セルへのコピーの仕方を教えて

    フォーマットのセルがありますが 結合セルで出来ています マクロの設定も含まれているようです Aの一列の中で上下2つのセルで一つになっています それが五行あります 左にはエクセルのもともとの枠の番号が1から10まであって Aの縦のセルの数は五行です そのAの縦に名簿のセルを例えば5名分貼り付けますと もともとの結合前のセルに戻って5行貼り付けられてしまいます 左にあるエクセルのもともとの枠の番号ですと1から5までに 貼り付けられるのです わたしはもともとの結合セルの5つのセルにはめ込みたいのですが いっぺんには出来ません 一つづつですとできます なぜなのでしょう 結合セルにまとめてコピーできる方法を教えてください マクロの設定はくずれてもあらかじめ消してもかまいません 私がしたいのは コピーして改めて作ったものの印刷だけです よろしくお願いします

  • 結合セルの足し算

    添付画像は、4月~3月までの時間数を合計しているものなのですが、 足し算の対象になっている各セルは1行2列でできていた2つのセルを結合したものになっています。 そのためなのか、2重に加算され、合計値が2倍になってしまっています。 このような箇所がところどころにできてしまいまして・・・ でも普段範囲していて数式で合計値を計算しているときは、こんなことはならなかったのです。 セルのプロパティとかをいじればいいんでしょうか・・・ 解決方法をご存じでしたら教えてください。

  • エクセル2007 結合セル

    エクセル2007 結合セル 下の画像のようなエクセルシートを 練習用に2枚作成しました。 上段が月の入力フォームで、 下段が各個人の営業成績表です。 ここで、下段の成績表の1行目が B列からI列まで、セル結合されており その中に表題の( 月分)が表示されています。 ここの月の前の空白部分に上段の入力フォームの黄色で 入力した月の数字をを自動的に表示させることはできるのでしょうか。 結合させなければ、簡単にできたと思いますが、 結合している前提で、教えていただけるとありがたいです。 よろしくお願いします。

  • エクセルの結合したセル

    こんにちわ。 上下に結合したセルがAの列に並んでいます。A1、2で一つ、A2、3で一つというふうに。 そこに日付が入っています。 Bの列も同様にあり、そこには文字列が入っています。 それらを一つのセルにまとめたものを別のシートに作ろうと思いました。 文字列と日付なので&とTEXTを使い、うまくいったのですが、一番上を合わせて、下へスライドコピーしたらデータが飛び飛びになってしまいました。 結合した場合番地が上のセルの番地になります。A1,2なら番地はA1。 なのでA2には何も数値がないので、空白扱いとなってしまいました。 データ量が多いので、できればスライドさせて一気にやりたいのですが、なにかいい方法はありませんでしょうか? 難解な文章で申し訳ありません。。

専門家に質問してみよう