【问题标题】:excel vba read date as dd/mm/yyyexcel vba 读取日期为 dd/mm/yyyy
【发布时间】:2018-06-08 17:07:22
【问题描述】:

我有一个 Excel VBA 代码,可以按月将外部工作簿中的数据检索到工作表中。

我想检索 11 月份,但我似乎无法将日期键入为 #30/11/2017#。日期将自动更改为 #11/30/2017#。

日期必须为 dd/mm/yyyy,因为这是外部工作簿中日期的格式。

Sub zz()
Dim arr, c, b(), n&
Application.ScreenUpdating = False
Worksheets("Sheet2").Range("A6").AutoFilter
Workbooks.Open "C:\Users\sophia.tan\Desktop\excel masterplan\External 
workbook.xlsx", 0, 1
arr = Sheets("MaximMainTable").UsedRange
ActiveWorkbook.Close 0
c = Array(0, 2, 12, 13, 6, 7, 10, 1, 8, 9, 15, 16, 18, 19, 14, 27, 24, 25, 
26, 3, 4, 36)
d = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 
20, 21, 23)
ReDim b(1 To UBound(arr), 1 To 23)
Selection.NumberFormat = "dd/mm/yyyy"
For i = 2 To UBound(arr)
If arr(i, 12) >= (#1/11/2017#) And arr(i, 12) <= Format(#11/30/2017#) Then
    n = n + 1
    For j = 1 To UBound(c)
        b(n, d(j)) = arr(i, c(j))
    Next
End If
Next

Dim startRow As Long, lastRow2 As Long
startRow = 6
lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row

For i = startRow To lastRow

If Range("A" & i) Like "MX*" Then

    If Range("J" & i) Like "*Rib*" Then
         Range("M" & i) = "Rib"

    ElseIf Range("J" & i) Like "*Spandex*Pique*" Then
         Range("M" & i) = "Spandex Pique"

    ElseIf ("J" & i) Like "*Pique*" Then
         Range("M" & i) = "Pique"

    ElseIf ("J" & i) Like "*Spandex*Jersey*" Then
         Range("M" & i) = "Spandex Jersey"

    ElseIf Range("J" & i) Like "*Jersey*" Then
         Range("M" & i) = "Jersey"

    ElseIf ("J" & i) Like "*Interlock*" Then
         Range("M" & i) = "Interlock"

    ElseIf ("J" & i) Like "*French*Terry*" Then
         Range("M" & i) = "Fleece"

    ElseIf ("J" & i) Like "*Fleece*" Then
         Range("M" & i) = "Fleece"

    Else


     Range("M" & i) = "Collar & Cuff"


    End If
    End If

 Next
 With Worksheets("Sheet2")
 .Range("A6:T" & Rows.Count).CurrentRegion.AutoFilter field:=1, Criteria1:="
 <>OFM"
 .Range("A6:T" & 
 Rows.Count).CurrentRegion.SpecialCells(xlCellTypeVisible).AutoFilter 
 field:=13, Criteria1:="<>Collar & Cuff"
 .Range("A6:T" & Rows.Count).CurrentRegion.Offset(1, 
 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
 .Range("A6").Resize(n, 23) = b
 .Range("A5").CurrentRegion.Sort key1:=Range("G5"), order1:=xlAscending, 
  Header:=xlYes


 End With



 Application.ScreenUpdating = 1

 End Sub

【问题讨论】:

  • 当您在 VBA 中使用“#MDY#”条目尝试它时发生了什么?如果您的外部工作簿是 Excel,并且日期是“真实”日期,而不是字符串表示形式,则该值存储为十进制值,表示自 1900 年 1 月 1 日以来的天数和天数。工作表上的格式和在 VBA 中输入日期的方法应该没有什么不同。
  • 当我使用#MDY#时,12月ae的记录也被复制过来了
  • 这段代码If arr(i, 12) &gt;= (#1/11/2017#) And arr(i, 12) &lt;= Format(#11/30/2017#) Thenarr(i,12) 的内容与Date 数据类型和String 数据类型进行比较。毫不奇怪,它可能会返回意想不到的结果。你为什么这样做?比较运算符两侧的比较通常应具有相同的数据类型。
  • 另外,在您的比较行中,请注意您的日期文字指的是11-Jan-2017
  • (i,12) 指的是日期列,这就是我使用它的原因。指出日期列的正确数据类型是什么?

标签: vba excel date


【解决方案1】:

当您直接使用#date# 表示法时,VBA 期望它采用mm/DD/yyyy 格式。

【讨论】:

  • @ili_sophia 不。它是日期文字,不能更改。
  • 所以唯一的方法是将我的外部工作簿日期更改为 mm/dd/yyyy?
  • @ili_sophia 您不必使用日期文字。相反,使用Date 变量:Dim dt As Date: dt = DateSerial(Year:=2018, Month:=1, Day:=2)
【解决方案2】:

测试工作表上的日期是否在 2017 年 11 月:

If arr(i, 12) >= #11/1/2017# And arr(i, 12) <= #11/30/2017# Then
   'do whatever
End If

只要 Excel 中的日期是“真实日期”,工作表单元格中日期的格式就无关紧要。

如果 Excel 中的日期是文本,则需要在进行比较之前将它们转换为实际日期。无论您是在工作表中还是在代码中执行此操作,都无关紧要。

对于代码中的日期文字,您可以替换解析为 VBA 日期数据类型的其他变量。请注意,如果您转换字符串,则字符串必须采用明确的格式(只能以一种方式解释)。

DateSerial(2017, 11, 1)
CDate("2017-11-01")
CDate("1 Nov 2017")

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2023-02-22
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多