Excel Excal VBA-格式(“7A”和“00”)输出;00“;而格式(“7B”和“00”)的结果是;7A";。为什么它们不同?
我试图列出每个Excel行从7F到00的十六进制值。我通过执行以下代码实现了它:Excel Excal VBA-格式(“7A”和“00”)输出;00“;而格式(“7B”和“00”)的结果是;7A";。为什么它们不同?,excel,vba,excel-formula,Excel,Vba,Excel Formula,我试图列出每个Excel行从7F到00的十六进制值。我通过执行以下代码实现了它: Sub ListDownHex() Dim StartValue, i As Integer Dim nRow As Long Dim sh As Worksheet Set sh = ActiveSheet StartValue = 127 'memory location of 8051 RAM nRow = 4 For i = StartValue To 0 Step -1 sh.Range(&q
Sub ListDownHex()
Dim StartValue, i As Integer
Dim nRow As Long
Dim sh As Worksheet
Set sh = ActiveSheet
StartValue = 127 'memory location of 8051 RAM
nRow = 4
For i = StartValue To 0 Step -1
sh.Range("A" & nRow) = Format(Right$("00" & Hex(i), 2), "00")
nRow = nRow + 1
Next i
End Sub
除具有“A”的十六进制值外,如“7A”、“6A”、“5A”等。结果为“00”。
对中间窗口的进一步检查确认Format()函数会执行此操作
? Format("7B","00") 'desired output
7B
? Format("7A","00") 'not expected output
00
这是一个错误还是我遗漏了什么?为什么他们的行为有所不同?
(注意:我的问题的重点是Format()的“奇怪”行为,而不是我的整个代码。)是一个复杂的函数,它可以格式化各种内容,包括日期和数字
当您向其传递字符串时(其中“7A”
和“7B”
是),它会尝试查看它们是否可以转换为数字(返回True)或日期(返回True)。如果可以,它将转换它们,然后应用格式
IsDate()
为“7A”
返回True,这是因为“7A”是时间值“早上7点”(7am)的有效文本表示形式。这又是因为,
A/P
的短版本将“am/pm”指示符返回为“A/P”:
?格式$(#07:00:00#,“hA/P”)'=>7A
? 格式$(#17:00:00,#,“hA/P”)'=>5P
因此字符串“7A”首先被转换成一个值#12/30/1899 07:00:00#
(零日期,早上7点)。该值的数字表示形式为0.29166667
,当按照“00”格式进行格式化时,会舍入为“00”
另一方面,“7B”不是一个
IsDate()
,因此格式输出它时不做任何更改,就像输出没有其他含义的字符串一样
尽管您根本不需要
Format()
函数,但只需要
=右$(“00”和十六进制$(i),2)
“7B”
是一个字符串,所以Format按原样输出它<代码>“7A”也是一个字符串,但在格式化之前,Format会将其转换为0.29166667
,我不知道为什么。在任何情况下,如果你想格式化一个数字,那么就传递一个数字,而不是一个字符串。出于某种原因,它假设7A
是7am
,即0.291667
,因此它返回00
格式。啊,是的,“7A”是。对于“P”
/“PM”
也一样。如果将单元格格式化为文本,则使用应用程序。文本而不是格式,则不会发生错误。@ScottCraner既不需要格式也不需要应用程序。首先需要文本<代码>右$(“00”和十六进制(i),2)
就足够了。