Функция VBA назначает пустую строку вместо значения диапазона - PullRequest
0 голосов
/ 24 марта 2020

Я использую следующую функцию, чтобы просмотреть столбец 1 таблицы (rngSearch) и вернуть соответствующее значение в столбце 2, в основном отражая функциональность VLOOKUP. Обычно это работает как задумано, за исключением случаев, когда это не так. Иногда он возвращает vbNullString вместо желаемого строкового значения.

Function get_short_string(rngSearch As Range, strSearch As String) As String

    get_short_string = vbNullString

    For i = 1 To rngSearch.Rows.Count
        If LCase(rngSearch(1)(i)) = LCase(strSearch) Then
            get_short_string = rngSearch(2)(i)
            Exit Function
        End If
    Next i

End Function

Я прошел функцию и сузил ее до этой строки:

get_short_string = rngSearch(2)(i)

Когда я вхожу ? rngSearch(2)(i) в ближайшем окне в тот момент я получаю желаемую строку вывода. Когда я выполняю строку, get_short_string получает vbNullString. По крайней мере, это то, о чем я думаю, когда я наводю указатель мыши на get_short_string после выполнения строки, всплывающая подсказка показывает get_short_string = без пустой строки "". Я также пробовал rngSearch(2)(i).Value и rngSearch(2)(i).Value2 с тем же результатом.

РЕДАКТИРОВАТЬ: Спасибо за ответы. Кажется, проблема не в коде, а в обрабатываемых строках. Я заменим эту пользовательскую функцию на VlookUp и продолжу ее изучение.

EDIT2: здесь запрошен образец таблицы в ее первоначальной немецкой форме:

+----------------------------------------------------------+------------------+
|                Internes Projekt nach CRM                 |     Kurzname     |
+----------------------------------------------------------+------------------+
| Urlaub | geplante Abwesenheit 2020                       | URLAUB           |
| Interne Projekte 2020                                    | INTERNE PROJEKTE |
| Akquise 2020                                             | AKQUISE          |
| Unterstützung (nicht fakturierbar) anderer Projekte 2020 | andere           |
| Verwaltung | Arbeitsorganisation 2020                    | VERWALTUNG       |
| Interne Projekte 2019                                    | INTERNE PROJEKTE |
| Unterstützung Team (intern)                              | andere           |
+----------------------------------------------------------+------------------+

При поиске точной строки в строка 2 Urlaub | geplante Abwesenheit 2020, код идентифицирует строку 2 правильно. Когда я использую непосредственное окно ? rngSearch(2)(i), оно выводит URLAUB, но функция возвращает пустую переменную.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Я не могу точно определить, где именно ваш код работает неправильно, но нижеприведенная функция более понятна по синтаксису и более надежна в исполнении. Я не думаю, что это даст вам такую ​​же ошибку.

Function GetShortString(rngSearch As Range, _
                        strSearch As String) As String

    Dim R As Long

    With rngSearch
        For R = 1 To .Rows.Count
            If StrComp(.Cells(R, 1).Value, strSearch, vbTextCompare) = 0 Then
                GetShortString = .Cells(R, 2).Value
                Exit Function
            End If
        Next R
    End With
End Function

Однако, циклический просмотр диапазона требует времени. Если вам интересна скорость, используйте нижеприведенную функцию.

Function ShortString(rngSearch As Range, _
                     strSearch As String) As String
    ShortString = Application.VLookup(strSearch, rngSearch, 2, False)
End Function
1 голос
/ 24 марта 2020

Вы можете использовать option compare text для сравнения без учета регистра, попробуйте этот код:

Option Compare Text  
Function get_short_string(rngSearch As Range, strSearch As String) As String   
        For i = 1 To rngSearch.Rows.Count
            If rngSearch.Cells(i, 1) = strSearch Then
                get_short_string = rngSearch.Cells(i, 2): Exit Function
                Exit Function
            End If
        Next i
    get_short_string = "not found"
    End Function

или:

Function get_short_string(rngSearch As Range, strSearch As String) As String
    Dim index As Variant: index = Application.Match(strSearch, rngSearch.Columns(1), 0)
    get_short_string = IIf(IsError(index), "not found", rngSearch.Cells(index, 2))
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...