こんにちは、ham_kamoです。補足拝見しました。
抽出条件において、まだ確認しておきたいことがあるので、補足をお願いできますか?
――――追加の4列――――
始期 200601 始期 200702
終期 200701 終期 200703 ――――――表――――――――
点数 日付け 点数 日付け 名前…点数 日付け 名前 日付け
20 200701 A … 20 200602 20 200701
10 200601 20 200702 B … 10 200601 20 200702
30 200602 10 200703 C … 30 200602 10 200702
: : : : :
(1)上記の場合、それぞれの始期~終期の範囲が重なることはあるのでしょうか。あった場合、正規表の日付が両方の範囲に含まれる可能性があります。その場合はどう抽出したらよいでしょうか。
(2)補足によると、
-----------------------
名前「A」の抽出はどうなっているかと言いますと範囲内で新しい日付けの方だけを表示しています。
この場合ですと20 200602 20 200701の両方が左の検索範囲に含まれていますが直近の20 200701の方を表示させたいです。
-----------------------
とのことですが、両方が右の検索範囲に含まれている場合、それも直近のデータを表示させたい、ということでしょうか。その場合はAB列でなくCD列に表示させるのでしょうか。
(3)右側のデータだけが抽出された場合、AB列は空きでCD列にデータを抽出すればよいでしょうか。
とりあえず、
(1)→抽出範囲が重なることはない
(2)→両方が右の検索範囲に含まれている場合は、直近のデータをC,D列に表示
(3)→右の検索条件だけに該当する場合は、C,D列に抽出
というようにマクロを組んでみました。ちょっとややこしくなったので、ユーザ定義関数を使ってます。
Alt+F11でVBAの画面を開き、「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。
Public ScoreCol(2) As String, DateCol(2) As String
Public SDate(2) As Long, EDate(2) As Long
Public PickOutCol(2) As String
Public WorkRow As Integer
Function IsInclude(N1 As Integer, N2 As Integer) As Boolean
'N1 表の中の日付番号(左=1、右=2)
'N2 抽出条件の番号(左=1、右=2)
If Cells(WorkRow, DateCol(N1)).Value >= SDate(N2) And _
Cells(WorkRow, DateCol(N1)).Value <= EDate(N2) Then
IsInclude = True
Else
IsInclude = False
End If
End Function
Function DateMaxN() As Integer
If Cells(WorkRow, DateCol(1)).Value > Cells(WorkRow, DateCol(2)).Value Then
DateMaxN = 1
Else
DateMaxN = 2
End If
End Function
Sub DataCopy(FromN As Integer, ToN As Integer)
Cells(WorkRow, PickOutCol(ToN)).Value = Cells(WorkRow, ScoreCol(FromN))
Cells(WorkRow, PickOutCol(ToN)).Offset(0, 1).Value = Cells(WorkRow, DateCol(FromN))
End Sub
そして、ボタンの動作を記録しているマクロ(VBAの画面で左のシート名をダブルクリックで出てきます)の既存のマクロを、以下の内容と差し替えてください。
Private Sub CommandButton1_Click()
Dim i As Integer
Const DataStartCol As String = "E" 'データが始まる列
ScoreCol(1) = "AY" '左側の点数の列
DateCol(1) = "AZ" '左側の年月の列
ScoreCol(2) = "BA '右側の点数の列
DateCol(2) = "BB" '右側の年月の列
SDate(1) = Range("B1").Value '始期(左)の値
EDate(1) = Range("B2").Value '終期(左)の値
SDate(2) = Range("D1").Value '始期(右)の値
EDate(2) = Range("D2").Value '終期(右)の値
PickOutCol(1) = "A" '抽出する左側の列
PickOutCol(2) = "C" '抽出する左側の先頭セル
Application.ScreenUpdating = False
'抽出先をクリア
Range("A4", Cells(Rows.Count, "D")).ClearContents
'抽出
For WorkRow = 4 To Cells(Rows.Count, DataStartCol).End(xlUp).Row
If IsInclude(1, 1) Then
If IsInclude(2, 1) Then
DataCopy DateMaxN(), 1
Else
DataCopy 1, 1
End If
End If
If IsInclude(2, 2) Then
If IsInclude(1, 2) Then
DataCopy DateMaxN(), 2
Else
DataCopy 2, 2
End If
End If
Next
Application.ScreenUpdating = True
End Sub
まだ希望の動作と異なる場合は、補足をお願いします。
補足
>始期(左)→C5 終期(左)→C6 >始期(右)→E5 終期(右)→E6 >ですよね。 そうです間違えていました。 ありがとうございます。 今回は表示する列が多いので検証に時間がかかりそうです。 どうもありがとうございます。