#excel #vba #excel-formula #dataform
#excel #vba #excel-формула #форма данных
Вопрос:
В настоящее время я пытаюсь создать запись данных, подобную форме, в Excel 2016 с кодом VBA и некоторыми формулами, которые позволяют пользователю выбирать продукт из выпадающего списка для автоматического расчета количества и количества заказов, необходимых для каждого сырья, из которого состоит продукт.
Моя рабочая тетрадь состоит из 4 листов под названием
«iform» — форма, которая позволяет пользователю выбрать продукт из выпадающего списка, ввести дату и ввести количество. Затем форма автоматически извлекает описание продукта. Затем в таблице ниже перечислены все необходимые детали для изготовления этого продукта с указанием кол-во в наличии, кол-во по заказу, выделено, кол-во, необходимое для каждого 1 продукта и сколько требуется
«ordermaster» — пустой список, который обновляется запрошенными частями и суммами всякий раз, когда пользователь отправляет форму из «iform»,
«bomitemqty» — список, содержащий все конечные продукты и их части. Другая информация, включенная в этот список: текущее количество в наличии, выделенное количество и количество, необходимое для 1 конечного продукта
«fgmaster» — список, содержащий все конечные продукты
Кажется, все работает до сих пор, кроме того факта, что когда я отправляю форму из «iform», я, похоже, не могу заставить ее отправлять только строки, где «необходимое количество»> 0, в список в «ordermaster». Скриншоты и код приведены ниже. Строки, выделенные желтым цветом ниже, — это те, которые я не хочу переходить к списку в «masterorder»
Скриншот:
изображение iform
Ячейки, содержащие все части и кол-во, заполняются с использованием приведенной ниже формулы (эти данные извлекаются из «bomitemqty» с использованием fg num, обведенного красным сверху, для фильтрации требуемых строк:
=IFERROR(INDEX(bomitem[PartNum]:bomitem[qtyperunit], SMALL(IF(COUNTIF($G$6,bomitem), MATCH(ROW(bomitem), ROW(bomitem)), ""), ROWS(E$13:$E14)), COLUMNS(bomitemqty!$B$2:B3)),"--")
Необходимое количество вычисляется с использованием приведенной ниже формулы:
=IFERROR((($L$8*J13) I13)-(G13 H13),"")
Когда пользователь нажимает кнопку сохранения, выполняется следующий модуль, и данные из «iform» перемещаются в список на скриншоте и коде листа «masterorder» ниже (строки, выделенные желтым цветом на скриншоте ниже, и те, которые я не хочу перемещать)
Скриншот:
лист «ordermaster» с представленными образцами данных
Код VBA:
Sub Save()
Set frm = ThisWorkbook.Sheets("iform")
Set Source = ThisWorkbook
Dim Var1 As Integer
Dim Var2 As Integer
Dim Var3 As Integer
Set Wks = Source.Worksheets("iform")
Var1 = Application.WorksheetFunction.CountIf(Wks.Range("E13:E29"), "--")
Var2 = 17 - Var1
Var3 = 30 - Var2 - 1
Dim lr As Long, ws As Worksheet
Dim arr As Variant, i As Long
With Worksheets("iform")
lr = .Cells(30, "E").End(xlUp).Row - Var3
ReDim arr(1 To lr, 1 To 9)
For i = LBound(arr, 1) To UBound(arr, 1)
arr(i, 1) = ""
arr(i, 2) = ""
arr(i, 3) = .Cells(i 12, "E").Value
arr(i, 4) = ""
arr(i, 5) = ""
arr(i, 6) = .Cells(i 12, "L").Value
arr(i, 7) = .Cells(6, "L").Value
arr(i, 8) = ""
arr(i, 9) = [Text(Now(), "DD-MM-YYYY HH:MM:SS")]
Next i
End With
With Worksheets("ordermaster")
lr = .Range("C" amp; .Rows.count).End(xlUp).Row 1
.Cells(lr, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End With
End Sub
Option Explicit
Private Sub cmdSave_Click()
Call Save
End Sub
Private Sub Worksheet_SelectionChange (по умолчанию используется как диапазон)
End Sub
Комментарии:
1. Сразу после
For i = ...
добавления строкиIf .Cells(i 12, "L").Value > 0 Then
и передNext i
добавлением строкиEnd If
. Затем замените только последнее вхождение otUBound(arr, 1)
наi
.2. привет, спасибо за ваш ответ. Попробую ваше предложение, как только я на своем компьютере. Я пробовал что-то подобное, но просто понятия не имел, куда поместить if и end if, и я довольно новичок в этом, так что еще раз спасибо. Ваш последний комментарий повторяет «UBound(arr, 1) с i» Вы имеете в виду изменение: С помощью Worksheets(«ordermaster») lr = .Range(«C» amp; .Rows.count).End(xlUp). Строка 1 .Ячейки (lr, «A»).Изменение размера (UBound(arr, 1), UBound(arr, 2)) = arr заканчивается на:
3. С Worksheets(«ordermaster») lr = .Range(«C» amp; .Rows.count).End(xlUp). Строка 1 .Ячейки (lr, «A»).i, UBound(arr, 2)) = arr заканчиваются
4. Привет! Я попробовал ваш ответ, и он сработал! Спасибо 🙂 Я сделал только сразу после для i = … добавьте строку If .Cells(i 12, «L»).Значение> 0 Затем и до следующего я добавляю конец строки If. Изменение UBound(arr, 1) с помощью i на самом деле ничего не делал, кроме как выделял строку N / A….
Ответ №1:
VBasic2008 опубликовал ответ в комментариях выше, который решил мою проблему :)…
Сразу после i = ...
добавления строки If .Cells(i 12, "L").Value > 0
, а затем и до следующего я добавляю строку End If