取值不自动转换
Take the value without automatically converting it
所以我有一个单元格需要读取,它的值是 375:00:00。查看公式时,我可以看到值为 14.01.1900 15:00:00。当试图读取单元格的值时,我只得到日期而不是 375。
我的方法是这样的,但我不确定如何继续转换单元格值?
Sub Workbook_Open()
Dim TimeWB As Workbook
Set TimeWB = Workbooks.Open(Filename:="J:\XXX\XXX\XXX22\XXX.xlsx", Password:="XXX")
Dim TimeUS As String
TimeUS = TimeWB.Sheets("Übersicht").Range("E3").Value
'Convert? The given Value (15,625) to back to 375:00:00 ?
'MsgBox Displays 15,625
MsgBox (TimeUS)
End Sub
是否有某种内置函数可以处理这个问题? CDate 在这里不太好用..但我想这甚至不应该在这里工作。
要么使用
TimeUS = TimeWB.Sheets("Übersicht").Range("E3").Text
获取与单元格数字格式相同的格式。
或使用数字 .Value
并将其格式化为您喜欢的格式:
TimeUS = Format$(TimeWB.Sheets("Übersicht").Range("E3").Value, "[h]:mm:ss")
// 编辑
正如 Rory 指出的那样,[h]
仅在 .NumberFormat
中有效,但在 Format()
中无效。因此,您可以使用解决方法:
Public Function FormatTimeInHoursOnly(ByVal TimeVal As Date) As String
FormatTimeInHoursOnly = CLng(Int(TimeVal * 24)) & Right$(Format$(TimeVal, "hh:mm:ss"), 6)
End Function
并像
一样使用它
TimeUS = FormatTimeInHoursOnly(TimeWB.Sheets("Übersicht").Range("E3").Value)
这里有一个非常有趣的案例。显然,15.625
是由 Excel 产生的,将其解释为 [h]:mm:ss。 375 / 24 = 15.625
。因此,要返回 375:00:00
,您只需执行 15.625 * 24 & ":00:00"。当您将其分配给单元格时,Excel 会将其解释为一个值,而不是 string(但请参阅下文...)。然而,这里有一些非常奇怪的事情。你说:
When looking at the formula I can see that the value is 14.01.1900 15:00:00.
这很奇怪。显然,它应该解析为 15.01.1900 等。我认为您可能打错了字,但显然不是。我已经 运行 进行了一些测试:
Sub test()
For Each cell In Range("A1:A4")
'Range("A1") = 375:00:00 custom formatting automatically applied: "[h]:mm:ss"
'Range("A2") = 375:00:00 custom formatting manually adjusted: "mm/dd/yyyy h:mm:ss AM/PM"
'Range("A3") = "=VALUE(""375:00:00"")", defaults to general formatting: 15.625
'Range("A4") = "=VALUE(""10000:00:00"")" from 10000 this produces #VALUE! errors (or "Error 2015")
Debug.Print cell.Value
Debug.Print cell.Value2
Debug.Print cell.Text
Debug.Print "---"
Next cell
'''Immediate Window output
' 15.625
' 15.625
' 375:00:00
' ---
' 1/14/1900 3:00:00 PM
' 15.625
' 01/15/1900 3:00:00 PM
' ---
' 15.625
' 15.625
' 15.625
' ---
' Error 2015
' Error 2015
' #VALUE!
' ---
'''
End Sub
所以,这里有两件非常奇怪的事情:
Range("A2")
的 cell.Value
给出为 1/14/1900 3:00:00 PM
(重现上述问题中的怪癖),即使 .Text
会正确生成 01/15/1900 3:00:00 PM
.
- Excel 不再理解
10000:00:00
处的“逻辑”。比较一下:
Sub insert_convert()
Range("A6") = 10000 / 24 * 24 & ":00:00" 'expected 416.6666667, but now a String: "10000:00:00"
Range("A7") = 9999 / 24 * 24 & ":00:00" '416.625 (and "2/19/1901 3:00:00 PM" in formula bar)
End Sub
我不明白为什么会出现这些奇怪的现象。对我来说就像错误。
编辑:我想问题 2 可能与以下事实有关:在 =VALUE("10000:00:00")
的计算期间,Excel 试图将字符串解释为 Date
,然后出错, 因为:
[Date h]olds IEEE 64-bit (8-byte) values that represent dates ranging from January 1 of the year 0001 through December 31 of the year 9999...
所以我有一个单元格需要读取,它的值是 375:00:00。查看公式时,我可以看到值为 14.01.1900 15:00:00。当试图读取单元格的值时,我只得到日期而不是 375。
我的方法是这样的,但我不确定如何继续转换单元格值?
Sub Workbook_Open()
Dim TimeWB As Workbook
Set TimeWB = Workbooks.Open(Filename:="J:\XXX\XXX\XXX22\XXX.xlsx", Password:="XXX")
Dim TimeUS As String
TimeUS = TimeWB.Sheets("Übersicht").Range("E3").Value
'Convert? The given Value (15,625) to back to 375:00:00 ?
'MsgBox Displays 15,625
MsgBox (TimeUS)
End Sub
是否有某种内置函数可以处理这个问题? CDate 在这里不太好用..但我想这甚至不应该在这里工作。
要么使用
TimeUS = TimeWB.Sheets("Übersicht").Range("E3").Text
获取与单元格数字格式相同的格式。
或使用数字 .Value
并将其格式化为您喜欢的格式:
TimeUS = Format$(TimeWB.Sheets("Übersicht").Range("E3").Value, "[h]:mm:ss")
// 编辑
正如 Rory 指出的那样,[h]
仅在 .NumberFormat
中有效,但在 Format()
中无效。因此,您可以使用解决方法:
Public Function FormatTimeInHoursOnly(ByVal TimeVal As Date) As String
FormatTimeInHoursOnly = CLng(Int(TimeVal * 24)) & Right$(Format$(TimeVal, "hh:mm:ss"), 6)
End Function
并像
一样使用它 TimeUS = FormatTimeInHoursOnly(TimeWB.Sheets("Übersicht").Range("E3").Value)
这里有一个非常有趣的案例。显然,15.625
是由 Excel 产生的,将其解释为 [h]:mm:ss。 375 / 24 = 15.625
。因此,要返回 375:00:00
,您只需执行 15.625 * 24 & ":00:00"。当您将其分配给单元格时,Excel 会将其解释为一个值,而不是 string(但请参阅下文...)。然而,这里有一些非常奇怪的事情。你说:
When looking at the formula I can see that the value is 14.01.1900 15:00:00.
这很奇怪。显然,它应该解析为 15.01.1900 等。我认为您可能打错了字,但显然不是。我已经 运行 进行了一些测试:
Sub test()
For Each cell In Range("A1:A4")
'Range("A1") = 375:00:00 custom formatting automatically applied: "[h]:mm:ss"
'Range("A2") = 375:00:00 custom formatting manually adjusted: "mm/dd/yyyy h:mm:ss AM/PM"
'Range("A3") = "=VALUE(""375:00:00"")", defaults to general formatting: 15.625
'Range("A4") = "=VALUE(""10000:00:00"")" from 10000 this produces #VALUE! errors (or "Error 2015")
Debug.Print cell.Value
Debug.Print cell.Value2
Debug.Print cell.Text
Debug.Print "---"
Next cell
'''Immediate Window output
' 15.625
' 15.625
' 375:00:00
' ---
' 1/14/1900 3:00:00 PM
' 15.625
' 01/15/1900 3:00:00 PM
' ---
' 15.625
' 15.625
' 15.625
' ---
' Error 2015
' Error 2015
' #VALUE!
' ---
'''
End Sub
所以,这里有两件非常奇怪的事情:
cell.Value
给出为1/14/1900 3:00:00 PM
(重现上述问题中的怪癖),即使.Text
会正确生成01/15/1900 3:00:00 PM
.- Excel 不再理解
10000:00:00
处的“逻辑”。比较一下:
Range("A2")
的 Sub insert_convert()
Range("A6") = 10000 / 24 * 24 & ":00:00" 'expected 416.6666667, but now a String: "10000:00:00"
Range("A7") = 9999 / 24 * 24 & ":00:00" '416.625 (and "2/19/1901 3:00:00 PM" in formula bar)
End Sub
我不明白为什么会出现这些奇怪的现象。对我来说就像错误。
编辑:我想问题 2 可能与以下事实有关:在 =VALUE("10000:00:00")
的计算期间,Excel 试图将字符串解释为 Date
,然后出错, 因为:
[Date h]olds IEEE 64-bit (8-byte) values that represent dates ranging from January 1 of the year 0001 through December 31 of the year 9999...