首页 > 解决方案 > VBscript - 如果值来自变量,Excel 无法找到

问题描述

我的 vbs 脚本是搜索 excel 列以查找从今天起 7 天的日期。然后它在行中搜索值并执行一些操作。

下面是应该工作的脚本的主要部分:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = true
Set objWorkbook = objExcel.Workbooks.Open(FILEPATH)
Set ActiveSheet = objWorkbook.sheets(1)

Dim row, column, totalrows, totalcolumns
totalrows = ActiveSheet.UsedRange.Rows.Count
totalcolumns = 53

newdate = DateAdd("d",7,Now())
ndate = Day(newdate) & "." & Month(newdate) & "." & Year(newdate)


For column = 2 To totalcolumns
    If ActiveSheet.Cells(2, column).Value = ndate then
        For row = 4 to totalrows
            If not ActiveSheet.Cells(row, column).Value = "" then
                
                'Do something
                'Do something

            End If
        next
    End If
next

但问题是 ndate 变量的值。

如果我执行这个脚本,它在 Excel 中找不到日期,我知道它正在寻找正确的日期。

所以我更进一步,即使我自己设定了日期。脚本不起作用:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = true
Set objWorkbook = objExcel.Workbooks.Open(FILEPATH)
Set ActiveSheet = objWorkbook.sheets(1)

Dim row, column, totalrows, totalcolumns
totalrows = ActiveSheet.UsedRange.Rows.Count
totalcolumns = 53


ndate = "28.10.2020"


For column = 2 To totalcolumns
    If ActiveSheet.Cells(2, column).Value = ndate then
        For row = 4 to totalrows
            If not ActiveSheet.Cells(row, column).Value = "" then
                
                'Do something
                'Do something

            End If
        next
    End If
next

但是如果我像下面那样直接设置日期,脚本可以工作并在 excel 中找到日期:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = true
Set objWorkbook = objExcel.Workbooks.Open(FILEPATH)
Set ActiveSheet = objWorkbook.sheets(1)

Dim row, column, totalrows, totalcolumns
totalrows = ActiveSheet.UsedRange.Rows.Count
totalcolumns = 53


For column = 2 To totalcolumns
    If ActiveSheet.Cells(2, column).Value = "28.10.2020" then
        For row = 4 to totalrows
            If not ActiveSheet.Cells(row, column).Value = "" then
                
                'Do something
                'Do something

            End If
        next
    End If
next

标签: excelvbscript

解决方案


如果涉及日期,则需要处理日期。在您的代码中,您将字符串与日期进行比较:

newdate = DateAdd("d",7,Now()) 
ndate = Day(newdate) & "." & Month(newdate) & "." & Year(newdate)

现在newdate将保存一个日期,包括一个时间部分。ndate但是,它包含一个看起来像日期的字符串(对于世界的某些地方)。

您在代码中所做的是将字符串与日期进行比较(实际上,当您将单元格格式化为 时,您可以看到一个数字General)。当涉及到这样的事情时,编程世界是分裂的:虽然大多数编程语言不允许这样做(在编译或运行时抛出错误),但有些人试图做一些有意义的事情。这意味着需要转换两个值之一,要么将字符串转换为日期,要么将日期转换为字符串。

转换可能正常工作,但也可能失败(因为写入日期的所有不同方式)。编码时,您应该避免那些隐式转换,而是使用正确的数据类型。首先要声明具有正确类型的变量。

在你的情况下,只需使用

Dim ndate
ndate = Dateadd("d", 7, Date())

Date()等效于Now(),但仅带有日期部分(没有时间)


推荐阅读