プロが教える店舗&オフィスのセキュリティ対策術

開始日と終了日を入力したら、カレンダー上のセル範囲を選択できるマクロの記述を教えてください。
C列に開始日、D列終了日を入力したら自動で同一行の日付範囲を選択できるようにしたいのですができません?どのような記述をすれば良いかお知恵をお借りできませんでしょうか。
よろしくお願いいたします。

「指定した条件で範囲選択したい」の質問画像

A 回答 (2件)

すみません


添付画像は選択時のイメージで文章があっているように思いました。
>C列に開始日、D列終了日を入力したら自動で同一行の日付範囲を選択できるようにしたい
>お知恵をお借りできませんでしょうか。
との事で考え方ややり方を提案できれば良いのですが、文書べたなので
例を2通り、
セルの変更で実行するのですから、対象シートのシートイベントを使用します。


日付行(E列より1行目)になっている行のセルを順次比較して
範囲を増やしていくロジック

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim rng As Range
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D:D")) Is Nothing Or Target.Offset(, -1) = "" Then Exit Sub
Application.EnableEvents = False
For i = 5 To Cells(1, Columns.Count).End(xlToLeft).Column
If Cells(1, i) >= Cells(Target.Row, 3) And Cells(1, i) <= Cells(Target.Row, 4) Then
If rng Is Nothing Then
Set rng = Cells(Target.Row, i)
Else
Set rng = Union(rng, Cells(Target.Row, i))
End If
End If
Next i
If Not rng Is Nothing Then rng.Select
Application.EnableEvents = True
End Sub


日付の行を対象にFindで検索してOffsetで範囲移動するロジック

Private Sub Worksheet_Change(ByVal Target As Range)
Dim fdRng As Range
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D:D")) Is Nothing _
Or Target.Offset(, -1) = "" Then Exit Sub
Application.EnableEvents = False
Set fdRng = Range("E1", Cells(1, Columns.Count).End(xlToLeft))
Range(fdRng.Find(Cells(Target.Row, 3)), _
fdRng.Find(Cells(Target.Row, 4))).Offset(Target.Row - 1).Select
Application.EnableEvents = True
End Sub

実行条件
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D:D")) Is Nothing _
Or Target.Offset(, -1) = "" Then Exit Sub

D列の単セルが変更された時、その行のC列セルが空白でなければ実行されます。条件以外は Exit Sub この条件を変える事でC列変更時も実行させられます。

②は該当日付セルがない場合エラーが返りますので
On Error Resume next などで対策してください。

書き方は他にもあると思いますが、基本的には、該当セルを開始日、終了日共に探してカラム№を取得するかレンジオブジェクトを取得するなどして
変更セル行に移動または、該当行で範囲設定しセレクトすれば出来ると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
①がイメージしていたものになります。助かりました!

お礼日時:2021/05/18 05:39

こんばんは、


添付画像の様に実行する場合は、ボタンなどからの実行が必要になると思います。
つまり、C列に開始日、D列終了日を入力したら自動でと言う事であれば
入力した行のみにしておいた方が良いように思います。

トリガーをWorksheet_Changeイベントにするかボタンにするかで
変わってきますが、取り敢えず中途半端ではありますが
C2セルD2セルを入力後、実行すると選択されるコードを書きますね。

まだ、なさりたい事を実現する為には手を加える必要があると思いますので
いじくってみてください。

ちなみに日付データの参照なので該当セルはシリアル値で入力されているものとします。

一例です
Sub a()
Dim stD As Date, endD As Date
Dim i As Integer
Dim rng As Range
Dim myRow As Long
myRow = Selection.Row
stD = Cells(myRow, 3)
endD = Cells(myRow, 4)
For i = 5 To Cells(1, Columns.Count).End(xlToLeft).Column
If Cells(1, i) >= stD And Cells(1, i) <= endD Then
If rng Is Nothing Then
Set rng = Cells(myRow, i)
Else
Set rng = Union(rng, Cells(myRow, i))
End If
End If
Next i
rng.Select
End Sub

変数名は適当です。
先ずは、実行トリガーの検討をしてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!