Wil*_*ils 4 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("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() 的“奇怪”行为,而不是我的整个代码。)
Format()是一个复杂的函数,可以格式化各种内容,包括日期和数字。
当您向它传递一个字符串(which"7A"和"7B"are)时,它会尝试查看它们是否可以转换为数字(IsNumeric()返回 True)或日期(IsDate()返回 True)。如果可以,它会对其进行转换,然后才应用格式。
IsDate()返回 True "7A",这是因为“7A”是时间值“早上 7 点”(7am) 的有效文本表示。
反过来,这是因为AM/PM格式化标记的简短版本, A/P, 将“am/pm”指示符返回为“a/p”:
? Format$(#07:00:00#, "hA/P")  ' => 7A
? Format$(#17:00:00#, "hA/P")  ' => 5P
因此,字符串“7A”首先被转换为一个Date值#12/30/1899 07:00:00#(零日期,早上 7 点)。该值的数字表示形式为0.29166667,当根据“00”格式进行格式化时,四舍五入为“00”。
另一方面,“7B”不是IsDate(),因此 Format 将其输出而不进行任何更改,就像对没有其他含义的字符串所做的那样。
但实际上,您根本不需要该Format()功能,您所需要的只是
= Right$("00" & Hex$(i), 2)