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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

マクロ

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

Q&A

解決済

4回答

1763閲覧

複数のセルを選択する

cayribaka

総合スコア19

VBA

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

マクロ

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

0グッド

1クリップ

投稿2017/10/26 09:03

編集2017/10/27 07:06

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

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

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

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

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

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

VBA

1Private Sub cmd閉じる_Click() 2 Unload Me 3End Sub 4 5'例)毎週月曜日休みと設定すると、4月のカレンダーの月曜日の日が色づけされる。 6Private Sub cmd設定_Click() 7Dim 色 As Integer 8 9 If opt月.Value = True Then 10 Range ("C10:C15") 11 .BackColor = 33 12 ElseIf opt火.Value = True Then 13 Range ("D10:D15") 14 .BackColor = 33 15 ElseIf opt水.Value = True Then 16 Range ("E10:E15") 17 .BackColor = 33 18 ElseIf opt木.Value = True Then 19 Range ("F10:F15") 20 .BackColor = 33 21 ElseIf opt金.Value = True Then 22 Range ("G10:G15") 23 .BackColor = 33 24 Else 25 MsgBox "曜日を選択してください" 26 27 Exit Sub 28 End If 29 30End Sub 31

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

VBA

1'4月のカレンダーにおいて、設定された曜日の色を変える。 2Private Sub cmd設定_Click() 3 4 If opt月曜日.Value = True Then 5 Range("C10:C15").Interior.ColorIndex = 4 6 ElseIf opt火曜日.Value = True Then 7 Range("D10:D15").Interior.ColorIndex = 4 8 ElseIf opt水曜日.Value = True Then 9 Range("E10:E15").Interior.ColorIndex = 4 10 ElseIf opt木曜日.Value = True Then 11 Range("F10:F15").Interior.ColorIndex = 4 12 ElseIf opt金曜日.Value = True Then 13 Range("G10:G15").Interior.ColorIndex = 4 14 Else 15 MsgBox "曜日を選択してください" 16 17 Exit Sub 18 End If 19 20End Sub

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

投稿2017/10/27 09:49

cayribaka

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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文字以下)があるようです。

投稿2017/10/27 04:47

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 02:53

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cayribaka

2017/10/27 07:09

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

2017/10/27 07:52

追記いただいたコードですが、`Range`と`.BackColor`を別行に記述しているように見えますが、実際のコードもこのようになっていますか? VB系の言語では1文を別行に記述する場合、行末を_にしなければならないとか分断する場所もどこでもできるわけではなかったり、いろいろお作法があります。 このため提示いただいたような書き方では怒られてしまうので、 `Range ("C10:C15").BackColor = 33` のように1文で書いてみてください。 同じRange ("C10:C15")のプロパティをいくつも変える場合は ``` With Range ("C10:C15") .ForeColor = 0 .BackColor = 33 End With ```` のように省略できる書き方をする方法もあります。
cayribaka

2017/10/27 08:03

`Range`と`.BackColor`を別行に記述しているように見えますが、実際のコードもこのようになっていますか? →改行していました。修正します。 そもそもフォームのオプションボタンにはセルの塗りつぶし等の機能を有しているのでしょうか?ネットで調べても、オプションボタンの横の文字をセルに入力するような例しか出てこなかったので...
jawa

2017/10/27 09:02

いろいろ調べていろんな情報が入り混じってくると混乱してきますよね。 掲載いただいたコードでは、オプションボタンをクリックしたことによってセルに色を付けているわけではありません。 その下の設定ボタンをクリックした際に、オプションボタンの状態をひとつずつ調べて、チェックがついている曜日に対応するセル範囲に色を付けています。 >フォームのオプションボタンにはセルの塗りつぶし等の機能を有しているのでしょうか? という質問については、何もコードを書いていなければそのような機能は有していません。 なので「設定ボタンを押したタイミングでセルに色を付ける機能」を実装しているのです。 ちなみにオプションボタンにもClickイベントやChangeイベントが用意されています。 ここで色付けするコードを記述しておけば、例えばオプションボタンのクリック時点で即座にセルに色をつけるような処理も実現可能です。 なお、オプションボタンの場合、Clickイベントと言いながらもチェックがついたときに発生するイベントとなっているようで、クリックのたびに発生するイベントではないようです。 Changeイベントの方は状態が変更するたびに発生します。 例えば「月」を選択している状態から「火」をクリックすると、「月」のChangeイベントと「火」のClickイベントが発生します。
cayribaka

2017/10/27 09:57

なるほど、丁寧にロジックまで教えて頂きありがとうございます。 イベントについて少し学習してみようと思います。 ありがとうございます。 このカレンダーではダブルクリックするとセルの背景色が変わり休みということになり、月の勤務時間も自動的に引かれるようになっています。 同様に、フォームから設定した時も、同じ機能を付けたいのですが、フォーム内に時間を引いていくコードを実装したらよいでしょうか? 何度もすみません。
jawa

2017/10/30 05: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 ``` セルをダブルクリックした際にも、フォームで操作したときにも、この関数を呼び出すようにしてあげれば同じ動作をさせることができます。 こうしておくことで、例えば色を緑⇒赤に変更したい、という場合にもこの関数内の色指定を変更してあげるだけで済むようになります。 参考になれば幸いです。
guest

0

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

投稿2017/10/26 11:36

yuki-saito

総合スコア928

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問