Точное совпадение значения ячейки в VB.Net без зацикливания

Итак, я несколько дней топтался, пытаясь найти способ использовать функцию .Find в моем приложении, которой просто нужно найти значение, введенное в текстовое поле, и либо вернуть значение и строку точного совпадения, либо отобразить это значение просто отсутствует в электронной таблице. Хотя у меня есть рабочая реализация без циклов, все, что я помещаю в текстовое поле, ищется как Substring. Это не то, чего я хочу.

Я не разбираюсь в VBA, и все, что я вижу, это способы VBA для выполнения этого с помощью For Loops, и мне не повезло найти значение в ячейке. Я сейчас делаю это:

Dim xlApp = New Excel.Application  ' this starts new Excel Application
Dim xlWB = xlApp.Workbooks.Open("C:\Users\Me\Desktop\ExcelValues.xls")
Dim xlWS = xlWB.Worksheets("Sheet1")

Dim Value2Find_1 As String = txtValue1.Text

Dim Range2Use_1 = xlWS.Range("A1:A4000")        'Range to span the A Column.

Dim xlCell_A = Range2Use_1.Find(txtValue1.Text) 'Looks up the searched serial value in A Column.

Dim LastRow = xlWS.Range("A4000").End(Excel.XlDirection.xlUp).Row + 1                      

If Value2Find_1 <> Nothing Then
        Range2Use_1.Find(What:=Value2Find_1, MatchCase:=True)
        MessageBox.Show("Value of " & Value2Find_1 & " found in cell " & xlCell_A.Row)


    Else
        MsgBox("no match...")
End If

Я могу добиться успеха с этим и даже найти, где находится значение в строке на листе, но даже если я использую строку для Value2Find_1, например MICHAEL, если я наберу MIC в текстовое поле, он вернет подстроку в пределах MICHAEL в заданный ряд. Поскольку пользователи будут искать строки переменной длины, я не могу установить ограничение на строковое значение. Есть ли надежный пример выполнения этого БЕЗ примера VBA с использованием структуры цикла. Я вижу, что функция поиска Excel не очень надежна, поскольку я не могу установить параметр ExactMatch. Я просмотрел другие примеры, и они кажутся чрезвычайно абстрактными и плохо объясняют, что происходит с получением значений с использованием структуры цикла и преобразованием их из Integer в String из ячейки, в которой находится найденный элемент.

Примечание. Да, я использую Excel Interop... Imports Excel = Microsoft.Office.Interop.Excel


person DesignerMind    schedule 05.01.2017    source источник


Ответы (1)


Используйте параметр LookAt в функции Find. Что-то вроде ниже

Range2Use_1.Find(What:=Value2Find_1, MatchCase:=True, LookAt:=xlWhole)
person Mukul Varshney    schedule 13.01.2017
comment
Похоже, это не работает. По-прежнему возвращает substring. Странно, почему-то я борюсь с этим. Я написал следующее: For i = 1 To LastRow If (Value2Find_1 = xlCell_A.Cells().Value) Then MessageBox.Show("Found the value...") ElseIf (Value2Find_1 <> xlCell_A.Cells().Value) Then MessageBox.Show("No val.") Exit Sub И почему-то выдает ошибку именно на If (Value2Find_1 = xlCell_A.Cells().Value) Then как Object variable or With block variable not set.. - person DesignerMind; 16.01.2017
comment
Если у меня есть CLOUD777 в электронной таблице, и я ищу его, он находит его. Но если я наберу CLOUDD777 вместо CLOUD777, он как бы отказывается запускать код для обработки несоответствия и вместо этого выдает ошибки. Почему это происходит? Что мне нужно сделать, чтобы правильно обрабатывать почти совпадение как истинное несоответствие. Я не могу объяснить, что значение не было найдено, если только я не наберу что-то совершенно другое. - person DesignerMind; 16.01.2017
comment
внутри цикла for добавьте проверку, если Not xlCell_A Is Nothing. Если это не так, вы можете безопасно использовать xlCell_A.Cells().Value - person Mukul Varshney; 16.01.2017