Структурирование формы VBA для перемещения строк Excel.
Заранее извиняюсь, у меня нет конкретного примера кода для работы, это больше вопрос о возможных вариантах выполнения задачи с помощью формы VBA.
У меня есть набор данных, который мне нужно пройти через процедуру проверки ошибок. Частью этой процедуры является перемещение некоторых строк данных из исходной таблицы в одну из двух других таблиц. Я могу найти эти строки по столбцу номера счета (один из 12-ти столбцов в данных). Форма, над которой я работаю, имеет настройку, в которой пользователь вводит счет # в текстовое поле и нажимает кнопку, чтобы добавить его в список. Проблема заключается в том, что делать дальше с кнопкой "закончить / продолжить".
Я могу добавить номера счетов списка в массив просто отлично, но я не уверен, как действовать дальше. Парень из моей работы предложил записать массив в таблицу, а затем использовать MATCH рядом с ним, чтобы получить ссылку на ячейку и потенциально извлечь из нее строку, но я не могу заставить это работать должным образом; запись массива в таблицу уклоняется от меня, а затем получение значений ячеек в другой массив просто не похоже, что это будет работать хорошо, потому что даже тогда вы должны прочитать строку, а затем каким-то образом выбрать строку лежащего в основе таблицы, а затем вырезать строку таблицы... и т. д. и т. д.
Хотя, возможно, запуск фильтра в столбце фактуры данных с использованием массива будет работать, но я не знаю, как это написать. Это может облегчить выбор диапазона (просто.databodyrange? Может не работать только на отфильтрованной области...).
В любом случае, у вас есть какие-либо идеи или вы знаете пример для чего-то подобного?
Спасибо:3
1 ответ
Поэтому для поиска значений вы можете использовать Range.Find
, .VLookUp
а также .Match
разница - возвращаемое значение Я не знаю, почему он предложил записать его в массив, но вы можете просто использовать значение текстового поля. Вы не можете искать несколько значений одновременно. И прежде чем продолжить, я бы проверил, существует ли совпадение.
Чтобы дать вам пример для всех методов:
Private Sub txtInvoice_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim txt As String: txt = txtInvoice.Text
Dim sht As Worksheet
Dim Result As Variant, ResultRng As Range, MReturn As Variant
Set sht = Worksheets("Sheet1")
'.Match
If IsNumeric(txt) Then
Result = Application.Match(CLng(txt), sht.Range("A:A"), 0)
Else
Result = Application.Match(txt, sht.Range("A:A"), 0)
End If
If Not IsError(Result) Then
MReturn = sht.Cells(Result, 3).Value
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
'OR
'.VLookUp
If IsNumeric(txt) Then
Result = Application.VLookup(CLng(txt), sht.Range("A:C"), 3, False)
Else
Result = Application.VLookup(txt, sht.Range("A:C"), 3, False)
End If
If Not IsError(Result) Then
MReturn = Result
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
'OR
'.Find
Set ResultRng = sht.Range("A:A").Find(txt, LookAt:=xlWhole)
If Not ResultRng Is Nothing Then
MReturn = sht.Cells(ResultRng.Row, 3).Value
MsgBox MReturn
Else
MsgBox ("Not Found!")
txtInvoice.SetFocus
Cancel = True
End If
End Sub
Таким образом, чтобы попробовать это самостоятельно, вам понадобится Textbox
называется txtInvoice
и другой объект (например, кнопку, вы можете установить фокус на). Рабочий лист для сопоставления Sheet1
, Значение ищется в пол A
и возвращаемое значение в Col C
, Если вы переместитесь / переключите фокус на другой объект, щелкнув по нему, саб активируется и попытается соответствовать. Если он не может, он выдаст сообщение и перефокусирует Textbox
,
Я бы порекомендовал использовать .Find
, имеет наибольшее количество опций и прост в использовании. VLookUp
а также Match
могут быть проблемы с числами, поэтому я конвертирую их в реальные числа, .Find
не имеет этой проблемы.