Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
1

Странно себя ведет функция Format

30.04.2013, 09:32. Показов 4114. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.
Не могу понять, это только у меня так?

Если в ячейку (1,1) записать число, а в формате ячейки поставить "Общий" а потом выполнить код:

Visual Basic
1
2
3
With Cells(1, 1)
  MsgBox Format(.Value, .DisplayFormat.NumberFormat)
End With
Выводит: Ge0eral

Если формат ячейки поменять на любой другой кроме "Общий", тогда отрабатывает корректно.
Или в ячейку (1,1) записать не число и поставить "Общий", тоже отрабатывает корректно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2013, 09:32
Ответы с готовыми решениями:

Пользовательская функция в условном форматировании странно себя ведёт
Созданная функция при вставке её в условное форматирование всё время пересчитывается, как будто...

Странно ведёт себя функция fgets
(в файле лежит предложение на английском) int main() { FILE *f; char str; if...

Функция для работы с сетью ведёт себя странно
Нужно преобразовать строку с ipv4 адресом в целое беззнаковое число. Решил использовать inet_aton,...

МП странно себя ведет
господа нужна ваша помощь купил материнку AsRock g31m-s шла вместе с селероном е1400 с ним...

7
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
30.04.2013, 10:05 2
У всех так. Маски формата для VBA функции Format и для ячейки - различные.
Используйте Cells(1, 1).Text .
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
30.04.2013, 10:29 3
Здравствуйте, oleggy,
Попробуйте почитать справку. Установите курсор на слово Format и вызовите справку (F1).

Мы видим следующее:

nhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\; \; \; \; \; \;Display the minute as a number without leading zeros (0 - 59).

Т.е. если в ячейку вами введено число, то Excel пытается сконвертировать его в дату/время, а затем изучает количество минут в получившейся дате. Если число не имеет дробной части, то количество минут = 0, и вместо n выводится 0.

Если вы хотели получить информацию о формате ячейки, тогда функция Format вообще не нужна:

Visual Basic
1
MsgBox Cells(1).NumberFormat
Если вы хотели оформить число с использованием именованых форматов, то выбирать можно только из следующего списка:

General Number
Display number with no thousand separator.
Currency
Display number with thousand separator, if appropriate; display two digits to the right of the decimal separator. Output is based on system locale settings.
Fixed
Display at least one digit to the left and two digits to the right of the decimal separator.
Standard
Display number with thousand separator, at least one digit to the left and two digits to the right of the decimal separator.
Percent
Display number multiplied by 100 with a percent sign (%) appended to the right; always display two digits to the right of the decimal separator.
Scientific
Use standard scientific notation.
Yes/No
Display No if number is 0; otherwise, display Yes.
True/False
Display False if number is 0; otherwise, display True.
On/Off
Display Off if number is 0; otherwise, display On.

Обратите внимание, что формата General среди них нет.

С уважением,
Aksima
3
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
30.04.2013, 11:14  [ТС] 4
Я и использовал такой код:
Visual Basic
1
Format(.Value, .DisplayFormat.NumberFormat)
Для перевода значение хранящееся в ячейке в строковый вид согласно формату отображения данной ячейки.
Грубо говоря как отображается ячейка в Excel так она и должна сохранится в строковой переменной.

Добавлено через 5 минут
Цитата Сообщение от Aksima Посмотреть сообщение
Если вы хотели получить информацию о формате ячейки, тогда функция Format вообще не нужна:
Visual Basic
1
MsgBox Cells(1).NumberFormat
Aksima, не понял, а чем отличается:
Visual Basic
1
.DisplayFormat.NumberFormat
от
Visual Basic
1
.NumberFormat
По идее NumberFormat является членом DisplayFormat или я ошибаюсь?

Добавлено через 7 минут
Цитата Сообщение от Казанский Посмотреть сообщение
У всех так. Маски формата для VBA функции Format и для ячейки - различные.
Используйте Cells(1, 1).Text .
Казанский, использовал..
Visual Basic
1
Format(.Text, .NumberFormat)
Так же обрабатывается некорректно, для числа с форматом Общий.
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
30.04.2013, 11:18 5
Цитата Сообщение от oleggy Посмотреть сообщение
Не понял, а чем отличается:
.DisplayFormat.NumberFormat
от
.NumberFormat
Ничем не отличается, но запись
Visual Basic
1
.NumberFormat
короче, поэтому предпочитаю такую запись.


Цитата Сообщение от oleggy Посмотреть сообщение
По идее NumberFormat является членом DisplayFormat или я ошибаюсь?
Нет, не ошибаетесь. Свойство NumberFormat является членом как класса Range, так и класса DisplayFormat.

С уважением,
Aksima
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
30.04.2013, 11:33  [ТС] 6
Aksima, выходит не существует короткого кода VBA что бы сохранить в String значения ячейки в том виде в котором она отображается в Excel ?

Добавлено через 2 минуты
И еще просвятите:
Cells(1, 1).Value
Cells(1, 1).Text
отличаются чем?
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
30.04.2013, 18:24 7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от oleggy Посмотреть сообщение
выходит не существует короткого кода VBA что бы сохранить в String значения ячейки в том виде в котором она отображается в Excel ?
Это как раз свойство .Text.
Например, в ячейке формула =1/7 , формат ч:мм:сс
Visual Basic
1
2
3
Dim v
v = Cells(1, 1).Value   '0,142857142857143  Variant/Double
v = Cells(1, 1).Text    '"3:25:43"          Variant/String
Добавлено через 9 минут
Однако, если уменьшить ширину столбца так, что текст не будет умещаться и будет отображаться ####, то свойство .Text вернет #### - буквально то, что отображается на экране. На этот случай можно использовать функцию листа ТЕКСТ - аналог VBA функции Format. Получается почти то, с чего Вы начали:
Visual Basic
1
2
3
With Cells(1, 1)
  MsgBox Application.Text(.Value, .NumberFormat)
End With
3
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
06.05.2013, 08:22  [ТС] 8
Казанский, выходит в данном случае праильно обрабатывать такую ситуацию так:

Visual Basic
1
2
3
4
5
6
If .NumberFormat = "General" Then ' если формат ячейки "Общий", то
  ' работаем с .Value
Else ' если формат текущей ячейки любой другой, то
  val = Format(.Value, .NumberFormat)
  ' работаем с val
End If
0
06.05.2013, 08:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 08:22
Помогаю со студенческими работами здесь

Странно ведет себя
Здравствуйте,помогите пожалуйста,первый раз в жизни делаю верстку,через два дня сдавать,проблема...

Компьютер странно себя ведет
Помогите пожалуйста. При входе в учетную запись выдается два сообщения на запуск програм и когда...

Яша ведет себя странно...
Сайт www.bis-n.ru активно раскручивается с декабря 2005 года, в нете с 1998. В Рамблере на 1-й...

Ноут странно себя ведет
Доброго времени суток!пожалуйста помогите мне советом,у меня глючит ноутбук и писчит когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru