Форма Excel VBA, как отправить несколько строк, ТОЛЬКО если значение в определенной ячейке в каждой строке больше> 0

#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 . Затем замените только последнее вхождение ot UBound(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