Страницы: 1 2 След.
RSS
VBA, как проще всего определить, число или текст?
 
Здравствуйте!  
Вопрос, по сути в заголовке.    
Имеем значения, к примеру: "345" и "3куц" как в коде проще всего определить что можно использовать как число?    
Чет я простых методов не нашел... :(
 
Может я что-то не правильно понял?  
Debug.Print IsNumeric(Cells(1, 1).Value)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Понял ошибку. Я пробовал  Is Numeric.  
Спасибо!
 
Не за что  
Также:  
Debug.Print IIf(Application.IsText(Cells(1, 1).Value), "Text", "Numeric")
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
{quote}{login=LightZ}{date=09.07.2012 07:29}{thema=}{post}Debug.Print IIf(Application.IsText(Cells(1, 1).Value), "Text", "Numeric"){/post}{/quote}С этим нужно осторожнее: при пустом значении и дате, получим неверные ответы :-)
 
Ну мне для решения конкретной задачи больше всего походит первый вариант в виде:  
If IsNumeric(Arr(i)) Then a = a + Arr(i)
 
Добрый вечер, Михаил!  
На всякий случай для коллекции, это тоже будет = True:  
Debug.Print IsNumeric("1d3"), IsNumeric("1e2")
 
Здравствуйте все. В дополнение, и это тоже:  
Debug.Print Application.IsText("1d3"), Application.IsText("1e2")  
:-)
Я сам - дурнее всякого примера! ...
 
Забыл еще:  
Debug.Print Application.IsText("13"), Application.IsText("12")
Я сам - дурнее всякого примера! ...
 
Так я думаю вряд ли кто-то будет использовать  
с перемененными и константами всё Ок  
 
Const x As Long = "111": Const z As String = "abc"  
Debug.Print Application.IsText(x), Application.IsText(z)  
 
False True
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Богдан, вот это - неправильно:  
Const x As Long = "111"  
Правильно:  
Const x As Long = 111  
Экс, да, произведет неявное преобразование, что не есть хорошо. Из-за того, что результат в разных случаях непредсказуем и может привести к ошибкам выполнения:-)  
Попробуй по шагам:  
Const x As Long = "1d3"  
Stop  
И посмотри, чему равен х.
Я сам - дурнее всякого примера! ...
 
Серёж, а в чём разница то?  
 
Const x As Long = "111"  
Const x As Long = 111
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
"111" - строка  
111 - число
 
{quote}{login=ZVI}{date=09.07.2012 09:56}{thema=}{post}Добрый вечер, Михаил!  
На всякий случай для коллекции, это тоже будет = True:  
Debug.Print IsNumeric("1d3"), IsNumeric("1e2"){/post}{/quote}  
А почему к "d" и "e" такое "избранное" отношение?  
Проверил другие буквы - везде False
 
{quote}{login=Юрий М}{date=09.07.2012 11:37}{thema=}{post}"111" - строка  
111 - число{/post}{/quote} Ну это если не объявлять числовую переменную, тогда так
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Богдан, а тогда зачем объявлять заведомо неверно? Об этом Серж и говорит... Если "111", ту нужно и писать: As String. Если хотим числовую переменную - кавычки не нужны. Вот о чём разговор.
 
> А почему к "d" и "e" такое "избранное" отношение?  
 
Михаил, это экспоненциальная запись числа. 1d3=1000, 1e2=100.  
В Фортране использование символа E означает тип Single, а D - Double. То есть там 1 - единица целого типа, 1E0 - единица типа Single, 1D0 - единица типа Double.  
VBA воспринимает обе буквы как указание типа Double.  
Попробуйте также в окне Immediate  
 
?isnumeric("ff"),isnumeric("&hff"),isnumeric("&o75"),isnumeric("&o79")
 
Я попробовал так: хоть 234е765б + 1 хоть 123d765 + 1 =11 (+25 = 35)  
и вообще, т.е если внутри цифр, сколько бы из не было, стоит одна е или d, то как число это равно 10. но цифры должны быть с обеих сторон.
 
IsNumeric("ЧислоИлиЦифра" & Chr(160) & "ЧислоИлиЦифра")=True  
Chr(160) - пробел.
 
Если данные будут считываться только из ячеек рабочего_листа:  
 
Function ValueIsNumber(X) As Boolean  
   Select Case VarType(X)  
   Case vbDouble, vbDate, vbBoolean  
   Case Else  
       Exit Function  
   End Select  
   ValueIsNumber = True  
End Function  
 
Если даты или логические не считать числами - удалить vbDate или vbBoolean
 
{quote}{login=Юрий М}{date=10.07.2012 10:40}{thema=}{post}Богдан, а тогда зачем объявлять заведомо неверно? Об этом Серж и говорит... Если "111", ту нужно и писать: As String. Если хотим числовую переменную - кавычки не нужны. Вот о чём разговор.{/post}{/quote}Юрий, я понял.  
По идее в варианте Михаила, данные будут заливаться с листа, т.е. проблем с IsNumeric или же IsText возникнуть не должно, у меня всегда отрабатывали на ура. :)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Если других данных не будет, то всё нормально. Весь сыр-бор разгорелся из-за того, что с проверкой типа есть подводные камни, и их желательно учитывать.
 
Загвоздочка может произойти только с пробелом или пустой ячейкой, т.к. vba считает, что пустая ячейка это число, а вот с датой проблем нет (false)  
 
Dim x As Range  
   For Each x In ActiveSheet.UsedRange  
       If Not Application.Trim(x.Value) = Empty Then Debug.Print IsNumeric(x.Value), x.Value, x.Address  
   Next
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Что-то я не улавливаю.  
Если x.Value = Empty, то зачем Application.Trim ?  
Если x.Value <> Empty, то Application.Trim(x.Value) все равно не будет Empty
 
{quote}{login=LightZ}{date=10.07.2012 10:01}{thema=}{post}Загвоздочка может произойти только с пробелом или пустой ячейкой, т.к. vba считает, что пустая ячейка это число, а вот с датой проблем нет {/post}{/quote}Ну как же нет?  
Вот Ваше предложение:  
Debug.Print IIf(Application.IsText(Cells(1, 1).Value), "Text", "Numeric")  
Введите в ячейку дату и проверьте.
 
E - это экспоненциальная форма записи числа  
D - это тоже какая-то архаичная форма числа.  
И то и другое выдаст число As Double, возможно поэтому и D  
 
В окне Immediate:  
?2d3 или ?2e3 покадут результат 2000, т.е 2*10^3  
?VarType(2e3)=vbDouble выдаст True  
 
Если вписать в VBA-модуле, например, такую строку:  
a = 2d3 или a = 2e3  
то после смещения курсора на другую строку эта преобразуется в    
a = 2000#  
где # в конце означает преобразование числа в Double
 
2 Михаил С  
Цитата
А почему к "d" и "e" такое "избранное" отношение
Точка и знаки "d" и "e" могут быть частью записи числа, не поэтому ли?
 
RAN, воспроизведите макрос:  
Sub tt()  
   With Cells(1, 1)  
       .Value = "   "  
       Debug.Print .Value = Empty, Application.Trim(.Value) = Empty  
         
       .Value = Empty  
       Debug.Print .Value = Empty  
   End With  
End Sub  
 
Т.е. с помощью Application.Trim(x.Value) убиваю сразу двух зайцев: пустоту и пробел  
 
Юрий, я описал про IsNumeric, а с текстом придется учитывать и дату  
 
   With Cells(1, 1)  
       If Not IsDate(.Value) Then Debug.Print Application.IsText(.Value)  
   End With
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
{quote}{login=LightZ}{date=10.07.2012 10:29}{thema=}{post}Юрий, я описал про IsNumeric, а с текстом придется учитывать и дату{/post}{/quote}Я реагировал на это:  
Debug.Print IIf(Application.IsText(Cells(1, 1).Value), "Text", "Numeric")  
Посмотрите - моё сообщение сразу после Вашего :-) Разобрались :-)
 
Такой, казалось бы, простой вопрос, а столько подводных камней! :)  
Для моей задачи подошел самый первый ответ - IsNumeric(a).  
По сути у меня массив примерно 150 столбцов, с столбцы и числовые и тестовые. Нужно строки, удовлетворяющие определенным условиям, сложить, пропуская тест.  
такой кусок кодаЖ  
For ii =  1 To Ubound(Arr, 2)  
if IsNumeric(Arr(i, ii)) Then MiArr(si, ii) = MiArr(si, ii)+Arr(i, ii)  
Next  
Дат у меня нет, но проверил ради интереса - обрабатывает корректно, т.е. пропускает
Страницы: 1 2 След.
Читают тему
Наверх