Заявление о прецеденте Excel VBA с подобными условиями не работает должным образом

Доброе утро,

У меня аналогичная проблема: Case Like не работает в VBA

По сути, когда мы используем оператор LIKE, мы получаем разные результаты, которые, по нашему мнению, должны быть. Ее, кажется, просто прыгают до конца без каких-либо результатов, но мой использует первый случай, и только первый случай, игнорируя остальные, даже если они не совпадают.

Мой желаемый эффект: я хотел бы выбрать диапазон ячеек и для каждой ячейки в диапазоне зациклить экспорт значения в текстовый файл с другим префиксом в зависимости от столбца ячейки:

    Sub test()
    Dim r As Excel.Range, cell As Excel.Range
    On Error Resume Next
    Set r = Application.InputBox("Select Range", "Select Range", Type:=8)
    On Error GoTo 0
    If r Is Nothing Then Exit Sub

    Open "C:\Users\User_Name\Documents\Macro Results\text.txt" For Output As #1
    For Each cell In r
        Select Case CellVal
            Case cell.Address Like "$A$#"
                Print #1, "Last Name: " + cell.Value + " " + cell.Address
            Case cell.Address Like "$B$#"
                Print #1, "First Name: " + cell.Value + " " + cell.Address
    Case cell.Address Like "$C$#"
                'Do Nothing Print #1, "First Name: " + cell.Value + " " + cell.Address
    Case cell.Address Like "$F$#"
                Print #1, "Email: " + cell.Value + " " + cell.Address
    Case cell.Address Like "$G$#"
                Print #1, "Phone#: " + cell.Value + " " + cell.Address
    Case cell.Address Like "$H$#"
                'Do Nothing 
    Case cell.Address Like "$I$#"
                'Do Nothing 
    Case cell.Address Like "$J$#"
                'Do Nothing 
    Case cell.Address Like "$K$#"
                'Do Nothing 
    Case cell.Address Like "$L$#"
                'Do Nothing 
    Case cell.Address Like "$M$#"
                'Do Nothing 
    Case cell.Address Like "$N$#"
                Print #1, "Token Type: " + cell.Value + " " + cell.Address
    Case cell.Address Like "$O$#"
                Print #1, "Token#:" + cell.Value + " " + cell.Address
            Case Else
        End Select
    Next
    Close
End Sub

Я хотел бы, чтобы вывод выглядел так:

Last Name: 
First Name: 
Email: 
Phone#: 
Token Type: 
Token#: 

Я не хотел добавлять каждый отдельный столбец ячейки для подобных операторов, но в тестовом макросе я смог успешно различать столбцы A и B с помощью этой техники. Это не работает в окончательной таблице.

Любая помощь или руководство будут оценены. Спасибо!


person Beer_en_thu_si_asT    schedule 08.07.2014    source источник
comment
Вы ничего не присвоили переменной CellVal, поэтому сразу же у вас возникает логическая ошибка: CellVal всегда будет пустой/нулевой строкой, если вы не присвоите ей значение.   -  person David Zemens    schedule 08.07.2014
comment
Спасибо, я не получаю ошибку, что может означать, что она определяется автоматически, но с тех пор я это сделал.   -  person Beer_en_thu_si_asT    schedule 08.07.2014


Ответы (1)


Почему бы просто не взять за основу Case .Column ячейки? Нет необходимости использовать нечеткие операторы Like/и т.д.

Sub test()
    Dim r As Excel.Range, cell As Excel.Range
    On Error Resume Next
    Set r = Application.InputBox("Select Range", "Select Range", Type:=8)
    On Error GoTo 0
    If r Is Nothing Then Exit Sub

    Open "C:\Users\User_Name\Documents\Macro Results\text.txt" For Output As #1
    For Each cell In r
        Select Case cell.Column
            Case 1
                Print #1, "Last Name: " + cell.Value + " " + cell.Address
            Case 2
                Print #1, "First Name: " + cell.Value + " " + cell.Address
            Case 6
                Print #1, "Email: " + cell.Value + " " + cell.Address
            Case 7
                Print #1, "Phone#: " + cell.Value + " " + cell.Address
            Case 14
                Print #1, "Token Type: " + cell.Value + " " + cell.Address
            Case 15
                Print #1, "Token#:" + cell.Value + " " + cell.Address
            Case Else
        End Select
    Next
    Close
End Sub

Обновление из комментариев относительно несоответствия типов

Несоответствие типов возникает из-за того, что вы используете + в качестве конкатентора строк. В VBA вы можете использовать либо +, либо &. Причуда заключается в том, что если вы попытаетесь использовать + при работе со смешанными типами данных (целые/длинные, строковые и т. д.), то он может попытаться использовать его как математический оператор (знак сложения). Избегайте этого несколькими способами:

Я предпочитаю всегда использовать & в качестве конкатенатора строк:

 Print #1, "Token#:" & cell.Value & " " + cell.Address

В качестве альтернативы приведите значение к строковой переменной (которую вы выяснили).

 Dim v as String
 v = cell.value
 Print #1, "Token#:" + v + " " + cell.Address

Еще один вариант прямого преобразования в строку:

 Print #1, "Token#:" + CStr(cell.Value) + " " + cell.Address
person David Zemens    schedule 08.07.2014
comment
Я все еще получаю сообщение об ошибке несоответствия типа для столбца 15, но это работает для всех остальных. Столбец «O» обычно представляет собой 9-значное целое число, по какой причине возникает эта ошибка? Обновление: NM, я просто поместил строку и установил ее в значение ячейки: Dim v As String v = cell.Value Print #1, Token#: + v + + cell.Address - person Beer_en_thu_si_asT; 08.07.2014
comment
Ваше здоровье. Я сделал обновление, чтобы объяснить, почему вы получили эту ошибку. Вы нашли один способ решить эту проблему, но я покажу вам два других способа исправить это :) - person David Zemens; 08.07.2014
comment
Спасибо! Я не знал, что '&' - это конкатенатор строк. Думаю, я бы тоже пошел по этому пути. Теперь все это работает очень хорошо и действительно экономит наше время. В очередной раз благодарим за помощь! - person Beer_en_thu_si_asT; 09.07.2014