【问题标题】:Excel VBA Set Variable to Equal Values between DatesExcel VBA将变量设置为日期之间的相等值
【发布时间】:2014-01-03 03:31:50
【问题描述】:

在使用 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

但这显然不是答案。帮忙?

【问题讨论】:

    标签: variables excel vba


    【解决方案1】:

    这会在 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 太棒了!我不知道有人可以以这种方式迭代日期。很好的解决方案!
    【解决方案2】:

    以下子例程调用一个字典,该字典将存储两个给定端点之间的所有日期。然后它使用一个简单的存在比较来检查列表中的日期是否在字典的项目中。如果不是,它会将它们打印为不在列表中。

    根据您的需要进行相应修改。 ;)

    代码:

    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
    

    如果这有帮助,请告诉我们。 :)

    【讨论】:

      【解决方案3】:

      我用向量解决了。

      希望对你有帮助

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多