質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • VBA

    1633questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • マクロ

    206questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

複数のセルを選択する

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 642

cayribaka

score 13

ExcelにてVBAとマクロを使って、カレンダーを作成しています。
イメージ説明

目的として月の労働時間を計算するために、カレンダーを作成しています。
休んだ日のセルをダブルクリックすると色が変わり、休んだ日の時間は計算されない。というモノです。

ここで、週4日勤務の時は毎週の休みが決まっているため、いちいちダブルクリックして、設定するのが面倒であるため、フォームを作成し、休みの曜日を設定すると該当の曜日が毎週休みになるよう設定したいのですが、複数のセルを選択するコードがわかりません。

よろしくお願いいたします。

追記
フォームを作成しました。
フォーム作成

ひとまず以下のコードを書いて、4月のカレンダーで動かそうとしたのですが、エラーが吐かれてしまい、うまく動きません。

Private Sub cmd閉じる_Click()
    Unload Me
End Sub

'例)毎週月曜日休みと設定すると、4月のカレンダーの月曜日の日が色づけされる。
Private Sub cmd設定_Click()
DimAs Integer

        If opt月.Value = True Then
            Range ("C10:C15")
                .BackColor = 33
        ElseIf opt火.Value = True Then
            Range ("D10:D15")
                 .BackColor = 33
        ElseIf opt水.Value = True Then
            Range ("E10:E15")
                 .BackColor = 33
        ElseIf opt木.Value = True Then
            Range ("F10:F15")
                 .BackColor = 33
        ElseIf opt金.Value = True Then
            Range ("G10:G15")
                 .BackColor = 33
        Else
            MsgBox "曜日を選択してください"

        Exit Sub
        End If

End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

複数のセルに色を付ける方法ということですが、方法はいくつかあります。
①複数セルを範囲指定して色付けする
②対象セルを順番にひとつづつ色付けする

①について

①についてはRangeで複数セルを指定することになりますが、その中でも書き方がいくつかあります。
ひとつはyuki-saitoさんのアドバイスのように対象セルをひとつずつ指定する方法、もうひとつつはセルを範囲指定する方法です。

対象となるセルが点在しているようであればひとつづつ指定しなければなりませんが、今回の場合は同じ曜日をまとめて処理したいということなので、対象はまとまった範囲のセルになると思います。
例えばF2~F5セルに色を付けたい場合、Range("F2:F5")とかRange(Cells(2, "F"), Cells(5, "F"))のように範囲指定することができます。

②について

既に単一セルに色を付ける処理はできているようですので、これと同じ処理を繰り返し行う方法になります。
例えばF2~F5セルに色を付けたい場合、

Dim iColumn As Integer
iColumn = 6     'F列

Dim iRow As Integer
For iRow = 2 To 5
    Cells(iRow, iColumn).BackColor = vbRed
Next


いま手元に動作環境がなく机上で書いたロジックですが、このようにループ処理で1セルずつ色付けすることでも実現できます。


もし私がこの機能を実装するとしたら、曜日見出し(例えば「金」など)のセルをダブルクリックしたら、そのセルから下方向にカレンダーの範囲内を色付けするような実装にすると思います。
その際、日付の入っていないセルや既に別の色がついているセルを個別に判断したくなるかもしれないので、②で紹介した1セルずつ処理する方法で実装すると思います。

どんな実装方法を採用するかは、環境や好み、出来上がったものを使う人のニーズなどでも変わってくると思いますので、上記はあくまで私の好みということで、目的に合ったものを採用すればよいと思います。

参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/27 16:09

    回答して頂きありがとうございます、①のやり方で進めているのですが、「プロパティの使い方が不正です」というエラーが表示されます。

    キャンセル

  • 2017/10/27 16:52

    追記いただいたコードですが、`Range`と`.BackColor`を別行に記述しているように見えますが、実際のコードもこのようになっていますか?

    VB系の言語では1文を別行に記述する場合、行末を_にしなければならないとか分断する場所もどこでもできるわけではなかったり、いろいろお作法があります。

    このため提示いただいたような書き方では怒られてしまうので、
    `Range ("C10:C15").BackColor = 33`
    のように1文で書いてみてください。

    同じRange ("C10:C15")のプロパティをいくつも変える場合は
    ```
    With Range ("C10:C15")
    .ForeColor = 0
    .BackColor = 33
    End With
    ````
    のように省略できる書き方をする方法もあります。

    キャンセル

  • 2017/10/27 17:03

    `Range`と`.BackColor`を別行に記述しているように見えますが、実際のコードもこのようになっていますか?
    →改行していました。修正します。

    そもそもフォームのオプションボタンにはセルの塗りつぶし等の機能を有しているのでしょうか?ネットで調べても、オプションボタンの横の文字をセルに入力するような例しか出てこなかったので...

    キャンセル

  • 2017/10/27 18:02

    いろいろ調べていろんな情報が入り混じってくると混乱してきますよね。

    掲載いただいたコードでは、オプションボタンをクリックしたことによってセルに色を付けているわけではありません。
    その下の設定ボタンをクリックした際に、オプションボタンの状態をひとつずつ調べて、チェックがついている曜日に対応するセル範囲に色を付けています。


    >フォームのオプションボタンにはセルの塗りつぶし等の機能を有しているのでしょうか?
    という質問については、何もコードを書いていなければそのような機能は有していません。
    なので「設定ボタンを押したタイミングでセルに色を付ける機能」を実装しているのです。

    ちなみにオプションボタンにもClickイベントやChangeイベントが用意されています。
    ここで色付けするコードを記述しておけば、例えばオプションボタンのクリック時点で即座にセルに色をつけるような処理も実現可能です。

    なお、オプションボタンの場合、Clickイベントと言いながらもチェックがついたときに発生するイベントとなっているようで、クリックのたびに発生するイベントではないようです。
    Changeイベントの方は状態が変更するたびに発生します。
    例えば「月」を選択している状態から「火」をクリックすると、「月」のChangeイベントと「火」のClickイベントが発生します。

    キャンセル

  • 2017/10/27 18:57

    なるほど、丁寧にロジックまで教えて頂きありがとうございます。

    イベントについて少し学習してみようと思います。
    ありがとうございます。

    このカレンダーではダブルクリックするとセルの背景色が変わり休みということになり、月の勤務時間も自動的に引かれるようになっています。
    同様に、フォームから設定した時も、同じ機能を付けたいのですが、フォーム内に時間を引いていくコードを実装したらよいでしょうか?

    何度もすみません。

    キャンセル

  • 2017/10/30 14:18

    もちろん可能です。

    ダブルクリックしたときの処理と同様の処理をフォームからの処理でも実装してあげればよいです。
    ※今回、フォームからの色付けは範囲指定で行う方法を採用されたようですので、時間を加減算する際には対象日数を確認してその日数分の時間をまとめて増減する必要があります。

    注意点としては、ダブルクリックのイベントはおそらくワークシートのイベントで実装しているものと思います。

    ワークシートの関数として記述したコードでは、セルの参照などをする際に対象シートの指定をしていないと、暗黙的に自シートを対象として動作します。
    これに対し、ユーザーフォームに記述する関数では、対象シートの指定をしないと暗黙的にアクティブシートを対象にして動作します。

    例えばSheet1に記述した関数に`Range ("C10:C15").BackColor = 33`のような実装をしていて、Sheet2がアクティブな状態でこのマクロを実行したとしても、色がつくのはSheet1のC10:C15となります。
    しかしUserFormに同じ記述をしていて、Sheet2がアクティブな状態でマクロが実行された場合には、Sheet2のC10:C15に色がつくことになります。

    こういうことが起こりうるので、対象シートを明示した書き方にすることをオススメします。
    例:`Worksheets("Sheet1").Range ("C10:C15").BackColor = 33`

    ---
    もしフォームからの色付けをループ処理で1セルずつ行うようであれば、ダブルクリックの場合の動作とフォームからの操作を同じ関数で呼び出すこともできそうです。

    ダブルクリックしたときの処理についてはコードの提示がありませんので、現状関数化されているかわかりませんが、もしダブルクリックイベント内に「色を付ける処理」「時間を増減する処理」を直接記述しているようであれば、この二つの処理を行う関数を作成してみてください。


    ```
    Sub ChangeColor(ByVal Target As Range)
    If Target.BackColor = 33 Then
    '色を消す
    Target.BackColor = vbWhite
    '時間を加算する(対象セルの数 * 8時間)
    '時間 = 時間 + (Target.Count * 8)
    Else
    '色をつける
    Target.BackColor = 33
    '時間を減算する(対象セルの数 * 8時間)
    '時間 = 時間 - (Target.Count * 8)
    End If
    End Sub
    ```

    セルをダブルクリックした際にも、フォームで操作したときにも、この関数を呼び出すようにしてあげれば同じ動作をさせることができます。
    こうしておくことで、例えば色を緑⇒赤に変更したい、という場合にもこの関数内の色指定を変更してあげるだけで済むようになります。

    参考になれば幸いです。

    キャンセル

0

Rangeに複数設定すれば良いということではなくてですか?
Range("C13,C16,C19,C22,C25,C28,C31,C34,C37,C40,C43")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

yuki-saitoさんのようにアドレスを列挙しても可能ですが、
Rnageはunionメソッドで結合することができます。

【例】
Dim dst as Range
set dst=Union(range("C13"),range("C16"),range("C19"),...)    ' C13,C16,C19を一つのRangeに結合する。 

これだと、いったん結合したRangeに後から追加もできます
【例】
set dst=Union(dst,range("C22"),range("C23"),...)           ' dstにC22,C23... を追加する。

ちなみにyuki-saitoさん方式の場合、アドレスとして記述できる
文字列に制限(255文字以下)があるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

'4月のカレンダーにおいて、設定された曜日の色を変える。
Private Sub cmd設定_Click()

        If opt月曜日.Value = True Then
            Range("C10:C15").Interior.ColorIndex = 4
        ElseIf opt火曜日.Value = True Then
            Range("D10:D15").Interior.ColorIndex = 4
        ElseIf opt水曜日.Value = True Then
            Range("E10:E15").Interior.ColorIndex = 4
        ElseIf opt木曜日.Value = True Then
            Range("F10:F15").Interior.ColorIndex = 4
        ElseIf opt金曜日.Value = True Then
            Range("G10:G15").Interior.ColorIndex = 4
        Else
            MsgBox "曜日を選択してください"

        Exit Sub
        End If

End Sub


修正後、このコードで選択したセルの範囲の色を変えることが出来ました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    VBA cpu使用率取得

    プログラミング初心者のものです。管理者の制約で、学校でタスクマネージャを開くことができません。そこでエクセルvbaでタスクマネージャを再現しようと思い、日々精進しております。学校に

  • 解決済

    VAB 結合セルとループ

    前提・実現したいこと | 2013 | 1 | 山田 |      | 2 | 田中 |      | 3 | 佐藤 | 2014 | 1 | 山田 | 2015 | 1

  • 解決済

    VBA 文字検索 セルに入力した文字を含むセル行だけを表示したい(オートフィルタのように)

    実現したいこと セルに入力した文字を含むセルがあった場合 ①該当するセルの背景色を変えたい ②当てはまるセルがあった場合 →その検索文字を含む行だけを表示したい(オートフィ

  • 解決済

    VBA 配列

    お世話になっております。 配列について学習を進めておりますが、イマイチどのようにデーターが格納されているくな分からず、意図した処理ができない状態です。 D列に"No"が合っ

  • 解決済

    エクセル VBA 1つのセルの値を分けて、逆並びで列に配置

    教えてください。 F列2行目から例えば、 43x43x5(×は大文字のx(エックス)で代用してます。) というサイズ「縦x横x高さ」が入力されています。 これを数値ごと

  • 解決済

    【VBA】ドメインのリスト一覧から配列に含まれるドメインのみを着色したい

    下記のような感じで、大量のドメインが記載されているExcelシートから、特定のドメインのみを着色するマクロを書きたいです。 Excelシートの例   A B C

  • 解決済

    ExcelのVBAで金種計算表をDo While文とIf文のみで作成したい

    ExcelのVBAで金種計算表をDo While文とIf文のみで作成したいのですが、下記のプログラムを実行してもExcel自体が応答不能になってしまいます。 下記に金額を入力すると

  • 解決済

    【VBA】最終行に転記

     前提・実現したいこと (同一book) 【入力】シートに入力したものを【点検履歴】シートの最終行に転記したいです。 ↓入力シート(sheet9) ↓点検履歴(sheet8)

同じタグがついた質問を見る

  • VBA

    1633questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • マクロ

    206questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。