VBscript - Excel 无法找到来自变量的值
VBscript - Excel cannot find the value if it comes from a variable
我的 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
日期很棘手。
- Excel 没有日期数据类型,但 VBA 有
- Excel 将日期存储为数字,并使用格式显示日期。
- 您在第三个示例中手动输入日期的原因是引擎以某种方式将您的字符串转换为等效日期。
- 如果您比较的是单元格的
.Text
属性 而不是 .Value
属性(并且该行的大小足够大),那么您的第一个示例会起作用显示它。
- 在处理日期时,一种更可靠的方法是使用
Range.Value2
property,因为它不会被格式化。
例如:
ndate = CDbl(#10/28/2010#) 'or any other method of generating the date and converting it to Double, or Long
For Column = 2 To totalcolumns
If ActiveSheet.Cells(2, Column).Value2 = 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
如果涉及到日期,则需要处理日期。在您的代码中,您将字符串与日期进行比较:
newdate = DateAdd("d",7,Now())
ndate = Day(newdate) & "." & Month(newdate) & "." & Year(newdate)
现在 newdate
将保存日期,包括时间部分。然而,ndate
包含一个看起来像日期的字符串(对于世界的某些地区)。
您在代码中所做的是比较一个字符串和一个日期(实际上,当您将单元格格式化为 General
时,您可以看到一个数字)。当谈到这样的事情时,编程世界是分裂的:虽然大多数编程语言不允许这样做(在编译或运行时抛出错误),但有些人试图做一些有意义的事情。那将意味着需要转换两个值之一,要么将字符串转换为日期,要么将日期转换为字符串。
转换 可能 正常工作,但也可能会失败(因为日期的所有不同写法)。在编码时,您应该避免那些隐式转换,而是使用正确的数据类型。首先要声明具有正确类型的变量。
在你的情况下,只需使用
Dim ndate
ndate = Dateadd("d", 7, Date())
Date()
等同于 Now()
,但只是带有 date-part(没有时间)
我的 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
日期很棘手。
- Excel 没有日期数据类型,但 VBA 有
- Excel 将日期存储为数字,并使用格式显示日期。
- 您在第三个示例中手动输入日期的原因是引擎以某种方式将您的字符串转换为等效日期。
- 如果您比较的是单元格的
.Text
属性 而不是.Value
属性(并且该行的大小足够大),那么您的第一个示例会起作用显示它。 - 在处理日期时,一种更可靠的方法是使用
Range.Value2
property,因为它不会被格式化。
例如:
ndate = CDbl(#10/28/2010#) 'or any other method of generating the date and converting it to Double, or Long
For Column = 2 To totalcolumns
If ActiveSheet.Cells(2, Column).Value2 = 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
如果涉及到日期,则需要处理日期。在您的代码中,您将字符串与日期进行比较:
newdate = DateAdd("d",7,Now())
ndate = Day(newdate) & "." & Month(newdate) & "." & Year(newdate)
现在 newdate
将保存日期,包括时间部分。然而,ndate
包含一个看起来像日期的字符串(对于世界的某些地区)。
您在代码中所做的是比较一个字符串和一个日期(实际上,当您将单元格格式化为 General
时,您可以看到一个数字)。当谈到这样的事情时,编程世界是分裂的:虽然大多数编程语言不允许这样做(在编译或运行时抛出错误),但有些人试图做一些有意义的事情。那将意味着需要转换两个值之一,要么将字符串转换为日期,要么将日期转换为字符串。
转换 可能 正常工作,但也可能会失败(因为日期的所有不同写法)。在编码时,您应该避免那些隐式转换,而是使用正确的数据类型。首先要声明具有正确类型的变量。
在你的情况下,只需使用
Dim ndate
ndate = Dateadd("d", 7, Date())
Date()
等同于 Now()
,但只是带有 date-part(没有时间)