Структурирование формы 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 не имеет этой проблемы.

Другие вопросы по тегам