ここから本文です

エクセルVBAについて質問です。

kkw********さん

2019/7/3114:47:04

エクセルVBAについて質問です。

初心者なので、教えて下さい<(_ _)>

下図のような検索条件で検索し、
検索条件に一致した行を黄色に塗りつぶしたいですが、
どのようなコードを記載したらよいのでしょうか?

<補足>
対象開始日時:TextBox1 & " " & ComboBox1 & ":" & ComboBox2
対象終了日時:TextBox2 & " " & ComboBox3 & ":" & ComboBox4
ライン:OptionButtonを3個配置、クリアボタンで選択解除可。
※選択なしの場合は、検索対象外としたい。
サイズ:OptionButtonを3個配置、クリアボタンで選択解除可。
※選択なしの場合は、検索対象外としたい。

OptionButton,D&amp;quot,TextBox1.Value,ComboBox2,ComboBox1,ComboBox4,ComboBox3

閲覧数:
75
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hot********さん

2019/8/107:24:48

開始日時が
[TextBox1] [ComboBox1]:[ComboBox2]
終了日時が
[TextBox2] [ComboBox3]:[ComboBox4]
ラインが
[OptionButton1] [OptionButton2] [OptionButton3] [CommandButton1]
サイズが
[OptionButton4] [OptionButton5] [OptionButton6] [CommandButton2]
検索が
[CommandButton3]
の場合です。
ラインが選択されてない時はすべてのラインになります。
サイズが選択されてない時はすべてのサイズになります。

'初期設定
Private Sub UserForm_Initialize()
Dim i As Integer
TextBox1.Value = Date '開始日初期値
TextBox2.Value = Date '終了日初期値
TextBox1.Locked = True '開始日付の手動での変更を禁止
TextBox2.Locked = True '終了日付の手動での変更を禁止
For i = 0 To 23
ComboBox1.AddItem Format(i, "00") '開始時のコンボのリストの値
ComboBox3.AddItem Format(i, "00") '終了時のコンボのリストの値
Next
For i = 0 To 59
ComboBox2.AddItem Format(i, "00") '開始分のコンボのリストの値
ComboBox4.AddItem Format(i, "00") '終了分のコンボのリストの値
Next
ComboBox1.Value = ComboBox1.List(0) '開始時のコンボのリストの最初の値(00)を設定
ComboBox2.Value = ComboBox2.List(0) '開始分のコンボのリストの最初の値(00)を設定
ComboBox3.Value = ComboBox3.List(0) '終了時のコンボのリストの最初の値(00)を設定
ComboBox4.Value = ComboBox4.List(0) '終了分のコンボのリストの最初の値(00)を設定
ComboBox1.Style = fmStyleDropDownList '開始時のコンボのリスト外入力の禁止
ComboBox2.Style = fmStyleDropDownList '開始分のコンボのリスト外入力の禁止
ComboBox3.Style = fmStyleDropDownList '終了時のコンボのリスト外入力の禁止
ComboBox4.Style = fmStyleDropDownList '終了分のコンボのリスト外入力の禁止
End Sub

'開始日+1
Private Sub SpinButton1_SpinUp()
TextBox1.Value = DateAdd("d", 1, TextBox1.Value) '開始日+1
End Sub

'開始日-1
Private Sub SpinButton1_SpinDown()
TextBox1.Value = DateAdd("d", -1, TextBox1.Value) '開始日-1
End Sub

'終了日+1
Private Sub SpinButton2_SpinUp()
TextBox2.Value = DateAdd("d", 1, TextBox2.Value) '終了日+1
End Sub

'終了日-1
Private Sub SpinButton2_SpinDown()
TextBox2.Value = DateAdd("d", -1, TextBox2.Value) '終了日-1
End Sub

'ラインクリア
Private Sub CommandButton1_Click()
OptionButton1.Value = False '1
OptionButton2.Value = False '2
OptionButton3.Value = False '3
End Sub

'サイズクリア
Private Sub CommandButton2_Click()
OptionButton4.Value = False '大
OptionButton5.Value = False '中
OptionButton6.Value = False '小
End Sub

Private Sub CommandButton3_Click()
Dim ws As Worksheet
Dim lastRow As Long
Dim s As String
Set ws = ActiveSheet '対象シート
Application.ScreenUpdating = False '画面更新禁止
ws.AutoFilterMode = False 'オートフィルタ解除
lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row 'A列最終行
Range("A12:D" & lastRow).Interior.ColorIndex = xlNone '背景色無し
If lastRow <= 11 Then Exit Sub '最終行が12より小さければ(データがなければ)終了
ws.Range("A11:D" & lastRow).AutoFilter Field:=1, Criteria1:=">=" & TextBox1.Value & " " & ComboBox1.Value & ":" & ComboBox2.Value '開始日時以上
ws.Range("A11:D" & lastRow).AutoFilter Field:=2, Criteria1:="<=" & TextBox2.Value & " " & ComboBox3.Value & ":" & ComboBox4.Value '終了日時以下
s = IIf(OptionButton1.Value, OptionButton1.Caption, "") & IIf(OptionButton2.Value, OptionButton2.Caption, "") & IIf(OptionButton3.Value, OptionButton3.Caption, "") '選択されているOptionButton1-3のCaption
If s <> "" Then ws.Range("A11:D" & lastRow).AutoFilter Field:=3, Criteria1:=s 'オプション1-3が選択されていたらその値でオートフィルタ
s = IIf(OptionButton4.Value, OptionButton4.Caption, "") & IIf(OptionButton5.Value, OptionButton5.Caption, "") & IIf(OptionButton6.Value, OptionButton6.Caption, "") '選択されているOptionButton4-6のCaption
If s <> "" Then ws.Range("A11:D" & lastRow).AutoFilter Field:=4, Criteria1:=s 'オプション4-6が選択されていたらその値でオートフィルタ
If Range("A11:A" & lastRow).SpecialCells(xlCellTypeVisible).Count > 1 Then '選択結果があれば
Range("A12:D" & lastRow).Interior.ColorIndex = 6 '選択範囲の背景色を黄色に
End If
ws.AutoFilterMode = False 'オートフィルタ解除
Application.ScreenUpdating = True '画面更新許可
End Sub





ちなみに以前の質問
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q142111326...

>コードを解説していただけないでしょうか?
とありましたが、同時に閉じてしまっていたので回答できませんでした。
という訳でわかりにくいかのしれませんが簡単に解説です。

Private Sub CommandButton1_Click()
Dim i As Integer
Dim ans As Long
For i = 1 To 7 'チェックするトグルボタンを1から7に(最上位から最下位へ)1000000のビット位置から1へ
ans = ans * 10 '(前回までの)答えを10倍(左にシフト)11->110
If Controls("ToggleButton" & i).Value = True Then ans = ans + 1 'トグルボタンがオンなら答え+1
Next
TextBox1.Value = Format(ans, "#") '答えを表示(0なら空白)
End Sub

'実際には
'
'1番目(1000000の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが10の桁)
'2番目(100000の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが100の桁、2番目の答えが10の桁)
'3番目(10000の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが1000の桁、2番目の答えが100の桁、3番目の答えが10の桁)
'4番目(1000の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが10000の桁、2番目の答えが1000の桁、・・・、4番目の答えが10の桁)
'5番目(100の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが100000の桁、2番目の答えが10000の桁、・・・、5番目の答えが10の桁)
'6番目(10の桁)のトグルボタンがオンなら答え+1
'答えを10倍(最初の答えが1000000の桁、2番目の答えが100000の桁、・・・、6番目の答えが10の桁)
'7番目(1の桁)のトグルボタンがオンなら答え+1
'
'となります。
'最後は10倍しないのでプログラムでは
'
'n番目のトグルボタンがオンなら答え+1
'答えを10倍
'
'のループではなく
'
'答えを10倍
'n番目のトグルボタンがオンなら答え+1
'
'のループになってるため最初の10倍は空シフトになっている

開始日時が
[TextBox1] [ComboBox1]:[ComboBox2]
終了日時が...

質問した人からのコメント

2019/8/1 09:28:35

hot********さま

いつも丁寧ない回答をありがとうございます。
本当に感謝しています。
非常にわかりやすく、初心者の私でも理解できました。

また質問させていただきますので、
今後ともよろしくお願いいたします。

ベストアンサー以外の回答

1〜1件/1件中

tok********さん

2019/7/3118:52:17

参考までに聞きますけど(期待Nothingでよろしく)、

開始列、終了列はシリアル値か否か
UserFormのマクロはどこまでできているのか(Initiarizeは出来てるとかそういう)
画像のフォームに入力された内容とエクセルで黄色く塗られた行との関係がよく判らないんだけど、フォームの開始日時をA、シートの開始列をB、フォームの終了日時をC、シートの終了列をDとして、検索したい条件はA<B<D<C?それともB<A<C<D?どちらでもない?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる