いつもお世話になっております
下記のコードは某サイトから利用しているものです。
一つ条件をくわえたいのですが
Aさん
Bさん
Cさん
Dさん
がいまして、名前ごとに背景色の色をかえたいのですが、
おしえてくれませんでしょうか
添付ファイルは見やすいよう8/12まででくぎりました。
8/31まであります。
SELECT CASE でお願いいたします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i, j As Long
i = Target.Row
j = Target.Column
If i > 4 Then
If j = 6 Or j = 7 Then
Call schedule_update(i)
End If
End If
End Sub
標準モジュール
Dim d1 As Date, d2 As Date, hiduke As Date
Dim j As Long
Dim y As String, m As String, d As String
Dim tantou As String
'Application.ScreenUpdating = False
If Range("E" & i).Value = "" Or Range("F" & i).Value = "" Then
Exit Sub
End If
d1 = Range("E" & i).Value
d2 = Range("F" & i).Value
j = Range("H5").End(xlToRight).Column
For j = 0 To j - 7
'hidukeに格納
hiduke = Range("H5").Offset(0, j).Value
'一度、背景を白に戻す
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.ColorIndex = xlNone
End If
'予定に反映を入れる
If hiduke >= d1 And hiduke <= d2 Then
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = vbGreen
End If
End If
No.1
- 回答日時:
ちょっとした疑問ですけど。
・誰(何番目の人?)が何色になるのか?
・なぜ『SELECT CASE』を条件としているのか?(ある意味人数分だけ『Case ~』を必要とする事に意味があるのか?)
・仮定として『同じ名前の人が2回以上出てくる』事があるのか?
例えばColorの配列を作成して任意の色を指定しておく。
出てきた順にColor配列のインデックスを用いて色の塗分けをする。(Countで人数を数えるとか打ち込んだ行番号を補正し利用するなど。)
No.2
- 回答日時:
こんにちは
普通に考えると、
>Aさん 赤
>Bさん 青
>Cさん みどり
>Dさん 黄色
の表を(別シートにでも)作成しておいて、これを参照するのが簡単かと。
表を作りたくなければ、直接配列でも連想配列にでも設定しておけばよろしいでしょう。
>できれば SELECT CASE 管理しやすいと思いました。
人数が10人、20人になった場合を考えると、長々としたCASE文のコードをメンテするよりもデータだけの表をメンテするほうが安全で簡便だと思いますけれど。
どうしてもCASE文にしたい場合は、同様のことをCASE文で列挙すれば良いでしょう。
Select Case 名前
Case "Aさん"
色 = vbGreen
・・・・・・
・・・・・・
みたいな感じでしょうか…
No.3
- 回答日時:
こんにちは、横から失礼します。
条件設定 hiduke = Range("H5").Offset(0, j).Valueに問題が無いとして
条件で色分けする場合、Call schedule_update(i) で
schedule_update 側にi (行№)が渡されているので
例えば
Sub schedule_update(i)
・
Dim colr As Double
Select Case Cells(i, "D").Value 'として変数colrにカラー定数を入れます。
Case "Aさん"
colr = vbRed
Case "Bさん"
colr = vbBlue
Case "Cさん"
colr = vbGreen
Case "Dさん"
colr = vbYellow
End Select
・
・
'予定に反映を入れる
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = colr
End If
のような感じかと、ちなみに iは、Variant型になっていますのでLongにした方が良いかもです。
No.4ベストアンサー
- 回答日時:
#3です
Range("H" & i).Offset(0, j).Interior.Color = colrはループ内に入れないとダメかと
また、hidukeの設定が出来ない場合 すべての行に色が付く可能性がありますね。
下記は
hiduke の判定を手元の表組みで暫定的に設定して
Sub schedule_update(i As Long)
Dim d1 As Date, d2 As Date, hiduke As Date
Dim j As Long, colr As Double
Dim y As String, m As String, d As String
Dim tantou As String, buf
'Application.ScreenUpdating = False
If Range("E" & i).Value = "" Or Range("F" & i).Value = "" Then
Exit Sub
End If
d1 = Range("E" & i).Value
d2 = Range("F" & i).Value
j = Range("H5").End(xlToRight).Column
Select Case Cells(i, "D").Value
Case "Aさん"
colr = vbRed
Case "Bさん"
colr = vbBlue
Case "Cさん"
colr = vbGreen
Case "Dさん"
colr = vbYellow
End Select
For j = 0 To j - 7
'hidukeに格納
buf = Range("F4") & Range("G4") & Range("H5").Offset(0, j)
’注Range("F4")には 2020 Range("G4")には '08 Range("H5")~は ’02、、、、により下記のhidukeを暫定で設定しています
If Len(buf) = 8 Then
hiduke = Format(buf, "@@@@/@@/@@")
'一度、背景を白に戻す
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.ColorIndex = xlNone
End If
'予定に反映を入れる
If hiduke >= d1 And hiduke <= d2 Then
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = colr
End If
End If
End If
Next
End Sub
として検証してみましたが上手く行くようですが。。
追記
#2さんのアドバイスにあるようにメンテナンス性などを考慮する必要があるように思います。
例えば、登録者名簿などのシートを作成し A列 ID とし一意の№ + 背景色を付けたセル
B列名前とした場合、添付図のような感じの場合
シートモジュールは変更なしで
標準モジュールに
Sub schedule_update(i As Long)
Dim d1 As Date, d2 As Date, hiduke As Date
Dim j As Long, colr As Double
Dim y As String, m As String, d As String
Dim tantou As String
Dim Trg As Range
'Application.ScreenUpdating = False
If Range("E" & i).Value = "" Or Range("F" & i).Value = "" Then
Exit Sub
End If
d1 = Range("E" & i).Value
d2 = Range("F" & i).Value
j = Range("H5").End(xlToRight).Column
Set Trg = Sheets("登録者名簿").Range("B2:B100").Find(What:=Cells(i, "D").Value, LookAt:=xlPart)
colr = Trg.Offset(, -1).Interior.Color
For j = 0 To j - 7
'hidukeに格納
hiduke = Range("H5").Offset(0, j).Value
'一度、背景を白に戻す
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.ColorIndex = xlNone
End If
'予定に反映を入れる
If hiduke >= d1 And hiduke <= d2 Then
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = colr
End If
End If
End If
Next
End Sub
ご質問のhiduke = Range("H5").Offset(0, j).Valueに問題がない場合です
この書き方で処理をすると登録者名簿シートの状態をVBAに反映できるので
変更も容易です。シートは非表示にするなども良いかと、、
いつも有難うございます。
なんかいろいろと本当にありがとうございました
うまくいきました。
貴重なお時間を頂きましてありがとうございます。
No.5
- 回答日時:
添付忘れました
上手く行かなかったですか、、、
私はご質問の hiduke As Date hiduke = Range("H5").Offset(0, j).Value が
どの様にして成立しているのか?多分書式設定を行って 01 02・・と表示されているのだろうと想像していますが
hidukeの設定部分も確認してみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
エクセルで、絶対値の平均を算...
-
16進数から2進数へ
-
VBA listBoxについて
-
C#でFontStyleの列挙体に値を追...
-
フォームから値の取得(BinaryR...
-
[エクセル]連続する指定範囲か...
-
DataSetから、DataTableを取得...
-
表にフィルターをかけ、絞った...
-
Excelのオートフィルタで抽出し...
-
配列のSession格納、及び取得方...
-
VBA 配列に格納した値の平均の...
-
ショッピングカートの合計金額...
-
Excel VBA 配列の分割について
-
MFC コンボボックスを複数扱う
-
数字配列データを画像に変換す...
-
VBAでの100万行以上のデータの...
-
スプレットシートのGetTextにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
VBA listBoxについて
-
エクセルで、絶対値の平均を算...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
[VBA]改行入りのセルの値を配列...
-
VBA 配列に格納した値の平均の...
-
配列のSession格納、及び取得方...
-
【VBA】ユーザーフォーム リス...
-
エクセルでエラーを無視して一...
-
SUMPRODUCT関数を用いた最小値
-
Excel VBA 配列の分割について
-
Excelのオートフィルタで抽出し...
-
VB6.0 ファイルの一括読込み
-
Excel オートフィルタのリスト...
-
VBAで指定期間の範囲を抽出し、...
おすすめ情報
すみません。
・誰(何番目の人?)が何色になるのか?
Aさん 赤
Bさん 青
Cさん みどり
Dさん 黄色
・なぜ『SELECT CASE』を条件としているのか?(ある意味人数分だけ『Case ~』を必要とする事に意味があるのか?)
できれば SELECT CASE 管理しやすいと思いました。
・仮定として『同じ名前の人が2回以上出てくる』事があるのか?
あります
おしえてくれませんでしょうか
E-F列が日付ならIf IsDate(.Value) Then
もしもE列OFFSET(0,-1) D列が If Offset(, -1).Value = "Aさん" Then
If hiduke >= d1 And hiduke <= d2 Then
If E列 >= d1 And F列 <= d2 Then ここからわかりません
Case "E", "F"
If IsDate(.Value) Then
If Offset(, -1).Value = "Aさん" Then
If hiduke >= d1 And hiduke <= d2 Then
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = vbGreen
Sub schedule_update(i)
Dim colr As Double
Dim d1 As Date, d2 As Date, hiduke As Date
Dim j As Long
Dim y As String, m As String, d As String
Dim tantou As String
If Range("E" & i).Value = "" Or Range("F" & i).Value = "" Then
Exit Sub
End If
d1 = Range("E" & i).Value
d2 = Range("F" & i).Value
j = Range("H5").End(xlToRight).Column
For j = 0 To j - 7
hiduke = Range("H5").Offset(0, j).Value
ここまでは同じですか
Select Case Cells(i, "D").Value
Case "Aさん"
colr = vbRed
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = colr
End If
Case "Bさん"
colr = vbBlue
If Range("H" & i).Offset(0, j).Interior.ColorIndex <> 15 Then
Range("H" & i).Offset(0, j).Interior.Color = colr
End If
End Select
Next
End Sub
文字数の制限のため2回にわけました。
これでやるとすべての行に色がついてしまいました。