Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2020, 16:13   #1
НеВа6464
Пользователь
 
Регистрация: 16.05.2009
Сообщений: 64
По умолчанию Определение типа данных в ячейке с помощью VBA

Здравствуйте!
Постоянно испытываю трудности с типами данных в своих таблицах.
И вот опять.
Есть таблица, где в столбце встречаются числа записанные как текст и как число.
Пытался узнать тип с помощью функции IsNumeric.
Есть ячейка с "1 700,000" (текстом) и ячейка с 1700 (число).
Записываю значение ячейки в переменную с помощью функции Cells
Проверяю эту переменную функцией IsNumeric.
В обоих случаях True.
Как так то?
Забиваю в ячейку "абвгд", проверяю - всё норм - IsNumeric выдаёт False.
Свою проблему решил путём умножения переменной на единицу.
Но осадочек остался.
Вопрос.
Как же надёжно определить с помощью VBA число или текст, если в ячейке только цифры?
У меня Excel 2003.
Форум покурил немного, не нашёл подобной темы. Извините, если баяню.
НеВа6464 вне форума Ответить с цитированием
Старый 05.12.2020, 16:28   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от НеВа6464 Посмотреть сообщение
Форум покурил немного, не нашёл подобной темы.
гугла курили?
https://www.google.com/search?client...+get+cell+type

Вот как вариант попробуйте может на вашем мамонте сработает
Код:
Function CellType(pRange As Range)
'Updateby20140625
Application.Volatile
Set pRange = pRange.Range("A1")
Select Case True
    Case VBA.IsEmpty(pRange): CellType = "Blank"
    Case Application.IsText(pRange): CellType = "Text"
    Case Application.IsLogical(pRange): CellType = "Logical"
    Case Application.IsErr(pRange): CellType = "Error"
    Case VBA.IsDate(pRange): CellType = "Date"
    Case VBA.InStr(1, pRange.Text, ":") <> 0: CellType = "Time"
    Case VBA.IsNumeric(pRange): CellType = "Value"
End Select
End Function
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 05.12.2020, 19:37   #3
НеВа6464
Пользователь
 
Регистрация: 16.05.2009
Сообщений: 64
По умолчанию

Спасибо.
Я надеялся, что есть функция, которая сразу выдаст тип данных в ячейке.
Этот алгоритм понятен, только вот у меня, как я выше написал, странно работает IsNumeric. Она выдаёт True, когда в ячейке "1 700,000". А это текст на самом деле.

ПС. По одной из ссылок вашего запроса в гугле нашёл функцию TypeName.
Похоже, это то что надо.

ППС. Проверил. Работает. Правда умножение на единицу гораздо проще, чем выяснение типа, а затем телодвижения по изъятию пробелов и превращению в число.
Но зато на душе стало спокойнее. ))

Последний раз редактировалось НеВа6464; 05.12.2020 в 19:53.
НеВа6464 вне форума Ответить с цитированием
Старый 05.12.2020, 19:45   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от НеВа6464 Посмотреть сообщение
А это текст на самом деле.
Это вы, а не ексель, для себя, по каким-то своим критериям, решили что "1 700,00" текст, а не формат #,##0.00 отображения числа
Изображения
Тип файла: jpg att.jpg (79.3 Кб, 30 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 05.12.2020 в 19:49.
Aleksandr H. вне форума Ответить с цитированием
Старый 06.12.2020, 10:02   #5
НеВа6464
Пользователь
 
Регистрация: 16.05.2009
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Это вы, а не ексель, для себя, по каким-то своим критериям, решили что "1 700,00" текст, а не формат #,##0.00 отображения числа
Жёстко вы троллите. )))
Отличить текст от числа, на самом деле, сможет даже начинающий, с изумлением увидев, что результат вычисления с ячейкой приводит к ошибке. Или по выравниванию. Число, по умолчанию, прижимается к правому краю ячейки, как у вас в примере, а текст к левому краю, что сразу же бросается в глаза.
Стал бы я вообще париться с типами, если бы эти мои "1 700,000" были числом.
Но функция IsNumeric действительно ведёт себя странно.
НеВа6464 вне форума Ответить с цитированием
Старый 06.12.2020, 14:42   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от НеВа6464 Посмотреть сообщение
Спасибо.
Правда умножение на единицу гораздо проще, чем выяснение типа, а затем телодвижения по изъятию пробелов и превращению в число.
Но зато на душе стало спокойнее. ))
В вас задача перевести все данные из столбца в числа? Старый метод иногда здорово помогает-выделить исходный столбец;выбрать формат ячеек "числовой"; выбрать "текст по столбцам"; ничего не меняя, нажать ок.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 09.12.2020, 07:50   #7
alex777555
Пользователь
 
Регистрация: 30.07.2018
Сообщений: 19
По умолчанию

Цитата:
Сообщение от НеВа6464 Посмотреть сообщение
Есть ячейка с "1 700,000" (текстом)
а точно ли там текст?
А не формат ячейки? У меня, например, формат числа 1700
Изображения
Тип файла: jpg число-текст.jpg (9.0 Кб, 24 просмотров)
alex777555 вне форума Ответить с цитированием
Старый 09.12.2020, 09:09   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

alex777555 вы не знаете как фактически оно отображается в ТС, он указал что он(ТС, не ексель) визуально число от текста различает таким способом,

Цитата:
Число, по умолчанию, прижимается к правому краю ячейки, как у вас в примере, а текст к левому краю, что сразу же бросается в глаза.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 11.12.2020, 10:55   #9
alex777555
Пользователь
 
Регистрация: 30.07.2018
Сообщений: 19
По умолчанию

Цитата:
Есть ячейка с "1 700,000" (текстом)
Формат ячейки текстовой?
По тому, что при вставке или вводе 1 700,000 в ячейку с общим форматом ексел сам переводит формат в числовой. Вставить как текст можно только в ячейку с текстовым форматом
но тогда можно определять по формату ячейки NumberFormat
alex777555 вне форума Ответить с цитированием
Старый 11.12.2020, 23:10   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

alex777555
откройте файла, посмотрите на А1, А2
чем NumberFormat поможет вам определить что там числа 7 и 12? чем???
Вложения
Тип файла: xlsx Книга1.xlsx (9.1 Кб, 4 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как увязать тип данных в ячейке Эксел с типом данных в переменной VBA? НеВа6464 Microsoft Office Excel 16 25.11.2019 09:30
Запись данных с помощью макроса VBA в Excel Марина11 Microsoft Office Excel 2 04.10.2017 22:24
Просмотр данных с помощью VBA Lyubov1990 Microsoft Office Excel 0 10.06.2009 16:13
ПРОБЛЕМА с заменой символов в ячейке с помощью кода VBA Maxx Microsoft Office Excel 5 11.11.2008 16:42
Сверка данных с помощью VBA mal001 Microsoft Office Excel 2 06.08.2008 14:39