【发布时间】:2021-06-11 05:42:05
【问题描述】:
我最近更改了 Win 10 上的区域设置,这影响了我的 VBA 宏解释日期的方式,并且我的 Range.Find() 停止正常工作。
下面是用于返回日期行的简单宏示例。
Sub a()
Dim dt_start As Date
dt_start = #11/6/2021# ' 11 Jun 2021
Dim rDateColumn As Range
Set rDateColumn = ThisWorkbook.Worksheets("2").Range("A:A")
rDateColumn.NumberFormat = "dd/mm/yyyy"
w = rDateColumn.Find(What:=Format(dt_start, "dd/mm/yyyy"), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows).Row
End Sub
当我尝试运行它时它会返回
Run-time error '91':。
我也试过这段代码
lookIn:=xlValues
即使我将日期格式设置为“dd/mm/yyyy”,VBA 仍将其读取为“mm/dd/yyyy”。请看下面的截图。
我尝试将 dt_start 转换为字符串 (Format(dt_start, "dd/mm/yyyy"),然后返回日期 DateValue(str_date),但是我回来了,我得到的是 "06/11/2021"是 2021 年 11 月 6 日。
以下是我的系统区域设置:
和 Excel 日期设置。
非常感谢任何信息。谢谢!
【问题讨论】:
-
What:=Format(dt_start, "dd/mm/yyyy")搜索字符串,但如果您的日期是无效的实数日期,那么您需要搜索数值。将您的日期转换为双精度并搜索What:=CDbl(dt_start)。数字日期以双精度形式保存在单元格中。其中数字是自1900-01-01以来的天数,这样您可以使用日期计算并使用数字格式将它们格式化为您想要的任何外观。 -
使用
What:=DateSerial(2021,6,11)根据年、月、日创建搜索日期:无论您的区域设置如何,这都是明确的。另外,您确定不想搜索LookIn:=xlValues? -
这需要重复,因为它经常会导致问题:Excel 如何在内部存储单元格值和您在屏幕上看到的内容是两件不同的事情。正如@Pᴇʜ 所说,Excel 在内部将日期信息存储为一个数字:一个双精度数,其中整数部分表示日期,小数部分表示一天中的时间)。如果您想查看单元格中值的“原始”格式,请按 Ctrl-Shift-#,这将删除所有格式。
.NumberFormat设置仅更改数据的显示方式,而不是存储方式。在图片中的 A4 单元格上执行此操作,以检查您是否有“真实”的 Excel 日期。