用于比较具有包含日期​​的单元格的列并将特定文本粘贴到另一列的 Vba 代码

Posted

技术标签:

【中文标题】用于比较具有包含日期​​的单元格的列并将特定文本粘贴到另一列的 Vba 代码【英文标题】:Vba code to compare columns that have cells containing dates and paste specific text to another column 【发布时间】:2017-08-11 09:36:03 【问题描述】:

我有点迷茫.. 我正在尝试创建一个宏,将 AH 列的单元格与 AH 列的单元格进行比较(两个列都包含日期),并根据结果,它将文本打印到AI 列的单元格。代码在下面..每次我运行它时,它都会显示错误 13 类型不匹配,并突出显示“FirstDate = Cells(RowNumber, 33)”这一行。你能帮我解决这个问题吗..

 Sub Dates()

    Sheets("1").Select
    Dim Result As Long, RowNumber As Long
    Dim FirstDate As Date, SecondDate As Date

    RowNumber = 2

    Do Until Cells(RowNumber, 2) = ""

    FirstDate = Cells(RowNumber, 33)
    SecondDate = Cells(RowNumber, 34)
    Result = DateDiff("n", FirstDate, SecondDate)

    If Result <= 30 Then
    Cells(RowNumber, 35) = "On Time"
    ElseIf Result > 30 Then
    Cells(RowNumber, 35) = "Late"
    End If

    RowNumber = RowNumber + 1

    Loop

    End Sub

【问题讨论】:

【参考方案1】:

可能的原因是 Cells(RowNumber, 33) 中的值不是日期。 Excel 存储日期和数字。将数字格式更改为“常规”。如果您在单元格中看到一个数字,则它是一个日期。如果你看到文字,那就是文字。如果文本看起来像日期,Excel 可能会强制将其转换为正确的日期(即数字)。试试FirstDate = Cdate(Cells(RowNumber, 33).Value)

如果您将单元格的 Numberformat 设置为Date,您将能够输入一个短日期(在您的区域设置中定义),Excel 会将其记录为真实日期(即数字)。将日期记录为“真实”日期总是比您可以读取的日期更好。

反直觉?那是Excel。 :-)

【讨论】:

也谢谢你的回答 :) 确实是文本格式...我去将类型更改为数据,我输入了正确的形式,但是当我再次运行它时,它说类型不匹配对于 FirstDate = Cdate(Cells(RowNumber, 33).Value)。也!我还可以做些什么?还有其他想法吗? CDate() 函数需要一个字符串。如果您的单元格现在有一个真实日期,您应该能够将其分配给 Date 类型的变量而无需转换。 问题是,即使我将单元格的格式更改为最新,在我关闭宏后它也会变回来。有没有办法在vba中添加一行代码以每次在宏内运行并更改格式?宏使用 vlookup 来获取我比较的日期,并且我想确保无论源格式是什么,宏都能正常工作:) 如何输入日期?首先,查看您的区域设置。找出输入“短日期”的格式。将空白单元格格式化为日期,格式为“dd mmmm, yyyy”。接下来,以设置的“短日期”格式在该单元格中输入日期,例如 15/8/17。单元格应显示“2017 年 8 月 15 日”。现在该单元格包含一个“真实”日期,它不应该变回其他任何内容。您可以将显示格式更改为其他任何格式,例如“dddd”,它将显示“星期二”,但单元格的值仍然是相同的日期值,一个数字,您可以在计算中使用。 现在剩下的唯一问题是能够比较两个日期并以小时和分钟为单位打印它们的差异......您对此有任何线索吗?【参考方案2】:
Sub Dates()
    Dim Result As Long, RowNumber As Long
    Dim FirstDate As Variant, SecondDate As Variant

    Sheets("1").Select

    RowNumber = 2

    Do Until Cells(RowNumber, 2) = ""

        FirstDate = Cells(RowNumber, 33).Value
        SecondDate = Cells(RowNumber, 34).Value

        If IsDate(FirstDate) Then
            Result = DateDiff("n", FirstDate, SecondDate)

            If Result <= 30 Then
                Cells(RowNumber, 35) = "On Time"
            ElseIf Result > 30 Then
                Cells(RowNumber, 35) = "Late"
            End If
        Else
            Cells(RowNumber, 35) = "Not A Valid Date"
        End If

        RowNumber = RowNumber + 1
    Loop

End Sub

【讨论】:

非常感谢您的回答!不幸的是,它现在说 Result = DateDiff("n", FirstDate, SecondDate) 类型不匹配......知道我应该做什么吗?? 您修复了 SecondDate 吗?您的代码只询问 FirstDate。为什么不是第二个? If IsDate(FirstDate) And IsDate(SecondDate) Then 会检查两者。并不是说它可以纠正错误。插入MsgBox Format(FirstDate, "dd/mm/yy hh:mm") 并为 SecondDate 插入相同的内容,只是为了查看您为 DateDiff 函数提供的内容。类型不匹配表示您拥有的“日期”不是真实日期。 问题是即使我将单元格的格式更改为最新,在我关闭宏后它也会变回来。有没有办法在vba中添加一行代码以每次在宏内运行并更改格式?宏使用 vlookup 来获取我比较的日期,并且我想确保无论源格式是什么,宏都能正常工作:)

以上是关于用于比较具有包含日期​​的单元格的列并将特定文本粘贴到另一列的 Vba 代码的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中的 MKMapView 和编辑

更改 Pandas 中特定单元格的日期格式

Excel:从1个单元格复制文本并将其添加到旁边单元格的顶部

根据数据类型,具有不同类型单元格的 Jtable

与相邻单元格的特定元素对齐

当单元格具有特定单词时,突出显示 excel mac 2011 中的行