Function PRDX_IsEmpty(vl) As Long ' 1 = пустое; 0 = не пустое; -1 = псевдопустое (строка нулевой длины)
If vl <> Empty Then
MsgBox "Значение «" & vl & "» НЕ ПУСТОЕ!", vbExclamation, "PRDX_IsEmpty"
ElseIf IsEmpty(vl) Then
PRDX_IsEmpty = 1
MsgBox "Найдено ПУСТОЕ значение!", vbExclamation, "PRDX_IsEmpty"
Else
PRDX_IsEmpty = -1
MsgBox "Найдена строка нулевой длины (псевдопустая)!", vbExclamation, "PRDX_IsEmpty"
End If
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Пустая но не очень :-) Алексей, 1. Long??? Че не Double ??? 2. Чисто лексически IsEmpty - имеет только два ответа , но не три 3. По аналоги с Sheets ( Visible, Hide, VeryHide ) ответы Не пусто, Пусто , Очень пусто :-) 4. Что ж вы так MSGBOX то любите?
если ты про Integer, то он либо медленнее, либо такой же по скорости, как Long (сюрприз)
Цитата
БМВ: Чисто лексически IsEmpty - имеет только два ответа , но не три
взял название известной функции и добавил отрицательное возвращаемое значения для контроля ошибок. Мне отлично. Сейчас выложу версию, включающую ещё один отрицательный вывод - для псевдополных (только пробелы, неразрывные пробелы и переносы)
у меня это диалоги, выводимые опционально. То есть, при проверке строки я могу сразу вывести итог проверки без дополнительного кодинга, т.к. варианты сообщений вшиты в функцию
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Коротко: если в вариативную переменную x передать значение ячейки Cell.Value, и при этом x=Empty And Not IsEmpty(x) — это означает, что в ячейке была строка нулевой длины, которую можно получить формулой «=""» или вставленным значением её
Версия 2 + аналог Trim
Код
'====================================================================================================
Function PRDX_IsEmpty(vl, Optional MsgEmpty As Boolean, Optional MsgFull As Boolean, Optional MsgFakeEmpty As Boolean, Optional MsgFakeFull As Boolean) As Long ' 1 = пустое; 0 = не пустое; -1 = псевдопустое (строка нулевой длины); -2 = псевдополное (только обычные и неразрывные пробелы + переносы)
Dim x
If vl <> Empty Then
x = vl
If PRDX_Trim(x) Then
If x = Empty Then
If MsgFakeFull Then MsgBox "Значение «" & vl & "» — ПСЕВДОПОЛНОЕ!", vbExclamation, "PRDX_IsEmpty"
PRDX_IsEmpty = -2: Exit Function
End If
End If
If MsgFull Then MsgBox "Значение «" & vl & "» НЕ ПУСТОЕ!", vbExclamation, "PRDX_IsEmpty"
ElseIf IsEmpty(vl) Then
PRDX_IsEmpty = 1
If MsgEmpty Then MsgBox "Найдено ПУСТОЕ значение!", vbExclamation, "PRDX_IsEmpty"
Else
PRDX_IsEmpty = -1
If MsgFakeEmpty Then MsgBox "Найдена строка нулевой длины (псевдопустая)!", vbExclamation, "PRDX_IsEmpty"
End If
End Function
'====================================================================================================
Function PRDX_Trim(vl) As Boolean ' заменяет неразрывные пробелы на обычные и удаляет лишние. Возвращает True/False, в зависимости от того, произведены ли изменения
Dim orig, x
Static REsp As RegExp, REcr As RegExp
If REsp Is Nothing Then
Set REsp = New RegExp: REsp.Global = True: REsp.Pattern = " {2,}"
Set REcr = New RegExp: REcr.Global = True: REcr.Pattern = "[ \s]"
End If
orig = vl
If InStr(vl, " ") Then vl = Replace(vl, " ", " ") ' заменяем неразрывные пробелы
vl = Trim(vl): If InStr(vl, " ") Then vl = REsp.Replace(vl, " ") ' сжимаем обычные пробелы
If REcr.test(vl) Then
x = REcr.Replace(vl, "")
If Len(x) = 0 Then vl = Empty: PRDX_Trim = True: Exit Function ' если строка состоит только из переносов и пробелов, то заменяем на пустоту и выходим
End If
If vl <> orig Then PRDX_Trim = True
End Function
'====================================================================================================
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
хватит ко мне "на вы" уже обращаться)) Андрей VG, если пустую ячейку передать в строковую переменную, то штатная IsEmpty() выдаст False как будто это строка нулевой длины. Мне это не нужно. Мне нужно различать пустые ячейки и ячейки, в которых стоит «=""» формулой или значением. Так что название верное и функция работает
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: У меня vl=vbNullString выдаёт True и на реально пустые ячейки
да. Я думал догадаешься, что проверять надо ПОСЛЕ проверки на IsEmpty...
Код
Function PRDX_IsEmpty(vl)
If IsEmpty(vl) Then
PRDX_IsEmpty = "Найдено ПУСТОЕ значение!"
Else
If vl = vbNullString Then
PRDX_IsEmpty = "Найдена строка нулевой длины (псевдопустая)!"
Else
PRDX_IsEmpty = "Значение «" & vl & "» НЕ ПУСТОЕ!"
End If
End If
End Function
Мне лично так нагляднее, чем ElseIf непонятно с чем. Но это дело вкуса.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Function PRDX_IsEmpty(vl) As String
If vl <> Empty Then "Значение «" & vl & "» НЕ ПУСТОЕ!": Exit Function
If IsEmpty(vl) Then PRDX_IsEmpty = "Найдено ПУСТОЕ значение!": Exit Function
PRDX_IsEmpty = "Найдена строка нулевой длины (псевдопустая)!"
End Function
1. у меня просто Empty вместо vbNullString 2. я сначала проверяю на Empty, потому что проверка на равенство с константой должно быть шустрее даже такой лайтовой функции, как IsEmpty()
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Обязательный expression аргумент expression — это переменная Variant
Цитата
IsEmpty возвращает значение True, если переменная не инициализована, или для нее явно указано значение Empty
А чего вы собственно от неё ещё хотели? Если работаете с данными ячейки, то сначала определяется тип того, что там и если это строка - тогда уже проверка строкового значения. Медведь же уже написал, но ваши ответы на его подколки - всё мимо
Цитата
Jack Famous написал: хватит ко мне "на вы" уже обращаться))
Андрей VG: так принято на форуме - зачем нарушать?
неправда)) тут с незнакомыми так принято и мы с Мишей обижаемся, когда ты отчуждаешься
По остальному я так и не понял, в чём проблема-то: 1. я определяю пустая ли ячейка на самом деле или в ней есть строка нулевой длины. Иногда это имеет значение и не одно и то же 2. да - я определяю строку, но передать должен вариативную переменную. Всё правильно 3. Обвес для определения псевдозаполненных - это просто для универсальности. Удалить легко
Функция не работает или работает как-то неправильно? Или что-то другое?)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄