Почему возникает ошибка несоответствия типов у функции Cdbl?

Программирование на Visual Basic for Applications
baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение baston » 20.11.2008 (Чт) 11:35

В макросе для Word использую две переменные V1 as Double и xC2 as string.
Я присваивают этим переменным следующие выражения:
xC2 = SourceTable.Rows(cmbFood1.ListIndex + 1).Cells(2).Range.Text
V1 = Left(xC2, Len(xC2) - 2)
V1 = CDbl(V1)
Если в ячейке таблицы, откуда берутся данные, есть число, то преобразование происходит корректно.
Но если в ячейке пусто (нет никаких данных), то возвращается 0 и возникает ошибка несоответствия типов.
Почему и как исправить?
Спасибо.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение alibek » 20.11.2008 (Чт) 12:16

А почему CDbl? Не Val?
Lasciate ogni speranza, voi ch'entrate.

baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение baston » 20.11.2008 (Чт) 12:18

alibek писал(а):А почему CDbl? Не Val?

Потому что разделителем дробных чисел у меня запятая, а VAL работает только с точками.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение alibek » 20.11.2008 (Чт) 12:26

Лично я бы заменял текущий системный разделитель на точку и использовал Val.
CDbl слишком уж непредсказуемо себя ведет.
Но если хочется CDbl, то почему бы тогда не проверять преобразуемое значение?
If IsNumeric(Left(xC2, Len(xC2) - 2)) Then V1=0 Else V1=CDbl(Left(xC2, Len(xC2) - 2))
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение alibek » 20.11.2008 (Чт) 12:28

baston писал(а):V1 = Left(xC2, Len(xC2) - 2)
V1 = CDbl(V1)

Какой в этом смысл?
Убери V1=CDbl(V1).
Lasciate ogni speranza, voi ch'entrate.

baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение baston » 20.11.2008 (Чт) 12:29

Так мне нужны цифры для работы с ними, а не строка.

baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение baston » 20.11.2008 (Чт) 12:58

Вопрос решен. Убедился, что функция Cdbl просто уродец по сравнению с VAL. Лишние проверки и другие неудобства. А с ВАЛом можно сделать больше и с меньшими затратами.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение Viper » 20.11.2008 (Чт) 13:10

Весь мир матрица, а мы в нем потоки байтов!

baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение baston » 20.11.2008 (Чт) 13:33

Viper писал(а): baston, просветляйся.

Отличная статья, спасибо за ссылку. Узнал много нового для себя об этих злосчастных функциях. Тем не менее, в моем случае VAL логичнее и проще, чем Cdbl. Статью даже распечатал для себя.

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение GDK » 28.11.2008 (Пт) 10:50

Про , и . Я обычно делаю типа:
Код: Выделить всё
MyText=Replace(MyText, "," ".")
MyNumb = Cdbl(MyText)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение Viper » 28.11.2008 (Пт) 11:12

GDK писал(а):Про , и . Я обычно делаю типа:
Код: Выделить всё
MyText=Replace(MyText, "," ".")
MyNumb = Cdbl(MyText)
Это конечно замечательно, но неплохо бы для начала знать, какой разделитель дробной и целой части установлен на компьюере. Почитай статью то.
Весь мир матрица, а мы в нем потоки байтов!

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Почему возникает ошибка несоответствия типов у функции Cdbl?

Сообщение GDK » 16.12.2008 (Вт) 18:37

Просветлился. Сознаю свою вину: меру, степень, глубину. Надо сначала узнать настройку системы, затем в зависимости от этого заменить либо точку на запятую, либо наоборот, затем вызывать Val().


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList