在使用VBA的Excel中,我需要将变量设置为等于开始日期和结束日期之间所有日期的列表(类似于等于包含多个值的范围)。捕获只是开始和结束日期在一个范围内,而不是两者之间的值。
在SQL Server中,我使用了Sys.Columns表来生成实际上并未存储在该表中的两个日期之间的日期列表。有没有办法在这里做一些类似的事情,而不是在开始和结束日期之间写出某个日期?我用谷歌搜索了几个小时,没有找到任何关于如何做到这一点。
我试图做的是有一个变量我可以做For Each循环。因此,对于每个日期,我将检查它是否存在于另一个工作表中,如果它不会发生任何事情,如果不存在则会添加。
我试过了:
Dim DatesInSettings As Date
DatesInSettings = StartDate To EndDate
For Each Date In DatesInSettings
'Insert commands here
Next DatesInSetting
但这显然不是答案。帮助
答案 0 :(得分:4)
这会在Sheet2
中搜索Sheet1
中的开始日期和结束日期之间的日期 - 在单元格A1和B1中:
Sub RunDates()
Dim StartDate As Date
Dim EndDate As Date
Dim i As Date
StartDate = Sheet1.Range("A1")
EndDate = Sheet1.Range("B1")
For i = StartDate To EndDate
If WorksheetFunction.CountIf(Sheet2.Range("A1:A5"), i) > 0 Then
Debug.Print i; "- date found"
Else
Debug.Print i; "- date not found"
End If
Next i
End Sub
答案 1 :(得分:1)
以下子例程调用一个字典,该字典将存储两个给定端点之间的所有日期。然后它使用简单的存在比较来检查列表中的日期是否在字典的项目内。如果不是,它将打印出来,而不是在列表中。
根据您的需要进行相应修改。 ;)
<强> CODE:强>
Sub GetListOfDates()
Dim StartDate As Date, EndDate As Date
Dim DictOfDates As Object, DateToCheck As Variant, ListOfDates As Variant
Dim Iter As Long
Set DictOfDates = CreateObject("Scripting.Dictionary")
StartDate = "12/31/2013"
EndDate = "01/15/2014"
For Iter = StartDate + 1 To EndDate - 1
With DictOfDates
If Not .Exists(Iter) Then
.Add Iter, Empty
End If
End With
Next Iter
'--Print them somewhere.
'Range("A1").Resize(DictOfDates.Count, 1).Value = Application.Transpose(DictOfDates.Keys)
ListOfDates = Range("B1:B15").Value
For Each DateToCheck In ListOfDates
If Not DictOfDates.Exists(DateToCheck) Then
Debug.Print Str(DateToCheck) + " is not in the list!" '--Or whatever action you want.
End If
Next DateToCheck
Set DictOfDates = Nothing
End Sub
如果有帮助,请告诉我们。 :)
答案 2 :(得分:0)
我用矢量解决了它。
我希望它有所帮助
Sub Dates_Vector()
Public Dates() As Date
ReDim Dates(End_Dat - Start_Date)
For x = 0 To End_Dat - Start_Date
Dates(x) = Dat_Ini + x
Next x
For Each Date In Dates
'Insert commands here
Next Date
End Sub