北の窓から(芦田っち)

PC関連と私的雑感のブログ。
2015年7月10日、カッコ内に名前を加えました。昔の友だちに気付いてほしくて・・・

おやぢチップス (118) : Excel VBA - ダブルクリックされたセルの色を別のセルにセット

2018-10-09 09:00:00 | おやぢチップス
ダブルクリックされたセルの色を別のセルにセットする・・・

  そんな必要が生じたので VBA でコーディングしてみました。

  # 色付け関連の VBA はすでに経験済みなので難しくなかったのですが、
    印刷処理で手間取りました。

    今回はA3サイズでの印刷することを前提にしていましたが。
    宅内にはA4対応のプリンターしかありません。
    印刷テストを現地で行ったところ、うまくいきませんでした・・・

    横1ページ・縦2ページに合わせて印刷するのですが、
    思った位置に改ページを挿入できませんでした。

    行の高さと列の幅を大きくして、思いどおりになりました・・・ (^-^;

閑話休題・・・

今回は久しぶりに Excel VBA のチップス・・・
Excel での色の取得とセットです。

まずは実例をご覧ください。

  これが元のシート・・・
  右側にある色の付いたセル(表示は 1~10)をダブルクリックすると
  そのセルの色を1行おきの色にします。
  (実際は 2行 1セットなので、1セットおきの色にします)
  

  うまく説明できないので、アニメーション GIF で実際の動きをご覧ください。
  右側の縦に並んだ色付きのセルをダブルクリックすると
  左側の行にその色をセットしています・・・
  
   (百聞は一見に如かず、ですよね)

ここでのポイントは3つ。

  1.セルのダブルクリック・イベントを捕捉する
  2.ダブルクリックされたセルの背景色を取得する
  3.2行1セットで、1セットおきに色を付ける

順に説明していきます・・・

1.セルのダブルクリック・イベントを捕捉する

  Worksheet_BeforedoubleClick を使います。
  コードは次のとおりです・・・(実際のコードなので、サンプルとしては分かりにくいかも・・・)

  ▼▼ ここからがコード -----------------------------------------------------------------
  ' ---セル・ダブルクリック時: 色選択エリア: 1セットおきの色を変える
   Private Sub Worksheet_BeforedoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim colorNo As Integer
    If (ActiveCell.Row >= 12 And ActiveCell.Row <= 31) And _
      (ActiveCell.Column = 27) Then
      colorNo = (ActiveCell.Row / 2) - 5
      Call Module_Coloring.prc_Alternate_Color(colorNo)
    End If
  End Sub
  ▲▲ ここまでがコード -----------------------------------------------------------------

  「色選択エリア」(行は 12 ~ 31、列は 27。 2行分をセル結合している)上でダブルクリックされたら
  標準モジュール Module_Coloring のサブルーチン prc_Alternate_Color を呼び出しています。
  サブルーチンの引数は、ダブルクリックされたセルの色番号(1 ~ 10)です。  

2.ダブルクリックされたセルの背景色を取得する

  標準モジュール Module_Coloring 内に2つのサブルーチンを作っています。

  1つ目は prc_Alternate_Color。
    引数は colorNo(整数、選択された色番号)。

    シート中のコードから呼び出されるため、Public にしています。

  2つ目は関数 fnc_Get_RGB です。
    引数は colorNo(整数、選択された色番号)、
    戻り値(リターンコード)は文字列(色を 16進数であらわしたもの)です。

  ▼▼ ここからがコード -----------------------------------------------------------------
  ' --- 1行おきの色を変える
  Public Sub prc_Alternate_Color(ByVal colorNo As Integer)
    ' --- 選択された色の RGB 値を取得
    Dim myRGB As String
    myRGB = fnc_Get_RGB(colorNo)
    Range("選択された色").Interior.Color = myRGB
    ' ---
    Dim myRow As Integer
    ' --- 月の前半
    For myRow = 12 To 56
      If ((myRow Mod 4) = 0) Then
        Range(Cells(myRow, 10), Cells(myRow, 25)) _
            .Interior.Color = myRGB
         Range(Cells(myRow + 1, 10), Cells(myRow + 1, 25)) _
            .Interior.Color = myRGB
      End If
    Next
    ' --- 月の後半
    For myRow = 72 To 116
      If ((myRow Mod 4) = 0) Then
        Range(Cells(myRow, 10), Cells(myRow, 26)) _
            .Interior.Color = myRGB
        Range(Cells(myRow + 1, 10), Cells(myRow + 1, 26)) _
            .Interior.Color = myRGB
      End If
    Next
  End Sub
  ▲▲ ここまでがコード -----------------------------------------------------------------

  シートでは横方向に1か月間の日付(1日~31日など)が広がっています。
  最終的には紙に印刷します。
  用紙サイズの関係で、
  月の前半(1日~15日、行では 12~56)と
  月の後半(16日~月末日、、行では 72~116))の2段に分けています。

  肝心なのは [特定の範囲].Interior.Color = myRGB です。

  myRGB(文字列型の変数)には 16進数の色が入ります。
  その値を取得するのが、下の関数 fnc_Get_RGB です。

  ▼▼ ここからがコード -----------------------------------------------------------------
  ' --- 指定されたセルのRGB色を取得
  Private Function fnc_Get_RGB(ByVal colorNo As Integer) As String
    Dim myRGB As String
    ' --- Excel VBA では、R-G-Bではなく B-G-R
    Select Case colorNo
      Case Is = 1
        myRGB = "&hBCE4D8"
      Case Is = 2
        myRGB = "&hB4D5FC"
      Case Is = 3
        myRGB = "&hF1D9C5"
      Case Is = 4
        myRGB = "&hB7B8E6"
      Case Is = 5
        myRGB = "&hD9D9D9"
      Case Is = 6
        myRGB = "&hE8DEB7"
      Case Is = 7
        myRGB = "&hDAC0CC"
      Case Is = 8
        myRGB = "&hFFFFCC"
      Case Is = 9
        myRGB = "&h99FFFF"
      Case Is = 10
        myRGB = "&h99FFCC"
    End Select
    ' ---
    fnc_Get_RGB = myRGB
  End Function
  ▲▲ ここまでがコード -----------------------------------------------------------------

  上の関数 fnc_Get_RGB でのポイントは2つ。

    ① ColorIndex では使える色が 56種類に限定されます。
      今回はそれ以外の色を扱いたいので RGB 値を使います。

    ② Office の VBA では、色は(他の言語と違い)R-G-B(赤-緑-青)の順ではなく
      B-G-R (青-緑-赤)の順で指定します。

      この B-G-R 値を得るために、フリーウェア Color Picker(カラーピッカー) の力を借りています。
      Color Picker を使うと、マウスポインターの指している場所の色(RGB の値)を簡単に取得できるからです。
      Color Picker は Vector よりダウンロードできます。

      ※ Color Picker の使い方は簡単ですが、説明すると長くなるので今回は割愛・・・
        使い方は別記事で紹介する予定です。

      関数 fnc_Get_RGB は、与えられた ColorNo に応じて
      16進数の RGB(実際には BGR)の値(文字列)を返します。
      myRGB = "&hBCE4D8" のような記述がそれです。      

3.2行1セットで、1セットおきに色を付ける

  上でご紹介している、サブルーチン prc_Alternate_Color 内の記述をご覧ください。

    ' --- 月の前半
    For myRow = 12 To 56
      If ((myRow Mod 4) = 0) Then
        Range(Cells(myRow, 10), Cells(myRow, 25)) _
          .Interior.Color = myRGB
        Range(Cells(myRow + 1, 10), Cells(myRow + 1, 25)) _
          .Interior.Color = myRGB
      End If
    Next

    ここでは、月の前半(行 12~56)を1行ずつループして
    1行おきに(実際は2行が1セットなので、1セットおきに)色を付けます。
    
    1セットおきにするために、行番号が4で割り切れるかどうかを判断しています。
    割り切れる場合は、その行とt次の1行に色を付けています。

    ※ ごめんなさい、サンプルとしては分かりにくいものになっています。
      この記事のために別途シートを設計して VBA を書く余裕がないので
      手抜きしています・・・ 

---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・

  # ご質問にはできる限りお答えしています。
    ただし、お名前(本名の姓 and/or 名)を書いていただいた場合に
    限らせていただきます。


ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 各社 SSD 関連ツールのバージ... | トップ | 明日は何の日? Patch Tuesda... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

おやぢチップス」カテゴリの最新記事