Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Split по vbCrLf - или проверка на пустые данные


Автор: Ciber SLasH 22.5.2013, 17:56
Приветствую всех!
Стоит задача проверить ячейку Excel на пустые данные (пробелы, переводы строк).
Пробовал так:
Код

Public Function IsEmptyStr(str As String) As Boolean
Dim arr() As String
    arr = Split(str, vbCrLf)
    Debug.Print UBound(arr)
    IsEmptyStr = False
End Function

Sub Test_Click()
Dim res As Boolean
    res = IsEmptyStr(Range("A1"))
End Sub

В лог выводится 0.
Что делаю не так?

Автор: Ciber SLasH 22.5.2013, 18:15
Понял ошибку.
Так работает:
Код

Public Function IsEmptyStr(str As String) As Boolean
Dim arr() As String
Dim st As String
    st = Replace(str, Chr(13), Chr(10))
    st = Replace(str, Chr(10) & Chr(10), Chr(10))
    arr = Split(str, Chr(10))
    Debug.Print UBound(arr)
    IsEmptyStr = False
End Function

Автор: Akina 22.5.2013, 18:20
Во-первых, не то передаёте. Укажите конкретное свойство.
Во-вторых, есть такая фигня как трассировка кода, она помогает понять, что не так.

Автор: Ciber SLasH 22.5.2013, 18:28
Новый вариант:
Код

Public Function IsEmptyStr(str As String) As Boolean
IsEmptyStr = True
Dim arr() As String
Dim st As String
Dim i
    st = Replace(str, Chr(13), Chr(10))
    st = Replace(str, Chr(10) & Chr(10), Chr(10))
    arr = Split(str, Chr(10))
    For i = LBound(arr) To UBound(arr)
        If Len(Trim(arr(i))) <> 0 Then
            IsEmptyStr = False
            Exit For
        End If
    Next i
End Function

Sub Test2_Click()
    MsgBox IsEmptyStr(Range("A1").value)
End Sub

Автор: Dumm 22.5.2013, 18:33
Попробуй в качестве разделителя вместо vbCrLf использовать Chr(10).
Ага, долго писал...

Автор: Akina 22.5.2013, 20:07
Цитата(Ciber SLasH @  22.5.2013,  19:28 Найти цитируемый пост)
Новый вариант:

Чем тримать каждую строку в цикле, просто добавьте замену пробелов на пустую строку перед шинковкой.
Ещё проще, чем сплитовать, просто посчитать 
Код

len(str)-len(replace(str,chr(10),''))

Автор: Ciber SLasH 11.6.2013, 15:45
Новый вариант:
Код

Public Function IsEmptyStr(str As String) As Boolean
IsEmptyStr = True
Dim st As String
    st = Replace(str, Chr(13), Chr(10))
    st = Replace(str, Chr(10), "")
    If Len(Trim(st)) <> 0 Then
        IsEmptyStr = False
    End If
End Function

Автор: SAS888 16.6.2013, 08:10
Если я правильно понял задачу, то можно проще:
Код

Public Function IsEmptyStr(str As String) As Boolean
    IsEmptyStr = IIf(Len(Application.Clean(str)) = 0, True, False)
End Function

Автор: Ciber SLasH 22.6.2013, 11:47
SAS888, не объсните, что означет функция Application.Clean?
Что-то не могу нагуглить её...

Автор: SAS888 25.6.2013, 03:00
Функция Application.Clean(arg)  очистит переменную arg от всех непечатных символов. Таких, как Chr(10), Chr(13) и т. п.

Автор: Akina 25.6.2013, 08:04
Цитата(Ciber SLasH @  22.6.2013,  12:47 Найти цитируемый пост)
что означет функция Application.Clean?
Что-то не могу нагуглить её... 

А запустить Эксель, Открыть редактор VBA, вызвать Object Explorer, ввести в поле поиска Clean и нажать поиск - это, конечно, не наш метод...
Цитата

Function Clean(Arg1 As String) As String
Member of Excel.WorksheetFunction

Цитата

Using the WorksheetFunction Object

Use the WorksheetFunction property to return the WorksheetFunction object. 

Цитата


Example
This example displays the result of applying the Min worksheet function to the range A1:A10.

Код

Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = Application.WorksheetFunction.Min(myRange)
MsgBox answer


Добавлено через 2 минуты и 57 секунд
Я уже не говорю о том, что можно ввести Clean в строку поиска редактора VBA. И выяснится, что это не более чем стандартная функция ПЕЧСИМВ()

Автор: Ciber SLasH 25.6.2013, 11:52
Всем спасибо, про Clean понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)