Excal VBA - Format («7A», «00») выводит «00», а Format («7B», «00») приводит к желаемому результату «7A». Почему они разные? - PullRequest
4 голосов
/ 12 июля 2020

Я пытаюсь перечислить шестнадцатеричные значения от 7F до 00 для каждой строки Excel. Я добился этого, выполнив следующий код:

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» и т.д. c. результат на «00». Дальнейшая проверка промежуточного окна подтверждает, что функция Format () это делает.

? Format("7B","00") 'desired output
7B
? Format("7A","00") 'not expected output
00

Это ошибка или я что-то упустил? Почему они поступают иначе? ( Примечание: в центре внимания моего вопроса «странное» поведение Format (), а не весь мой код. )

1 Ответ

4 голосов
/ 12 июля 2020

Format() - это сложная функция, которая форматирует всевозможные вещи, включая даты и числа.

Когда вы передаете ей строку (которая "7A" и "7B" are), он пытается увидеть, можно ли их преобразовать в число (IsNumeric() возвращает True) или дату (IsDate() возвращает True). Если они могут, он преобразует их и только потом применяет форматирование.

IsDate() возвращает True для "7A", потому что «7A» является допустимым текстовым представлением значения времени «7 утра» ( 7 утра). Это, в свою очередь, связано с тем, что короткая версия токена форматирования 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 часов утра). Числовое c представление этого значения - 0.29166667, которое при форматировании в соответствии с форматом «00» округляется до «00».

«7B», с другой стороны, не является IsDate(), поэтому Format выводит его без изменений, как это происходит со строками, не имеющими другого значения.

На самом деле , хотя вам вообще не нужна функция Format(), все, что вам нужно, это

= Right$("00" & Hex$(i), 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...