Как мне написать свою пользовательскую форму, чтобы вставить указанное количество строк под выбранную ячейку? - PullRequest
1 голос
/ 25 июня 2019

У меня есть созданная пользовательская форма, которая сначала спрашивает, сколько строк я хотел бы вставить.Следующая часть пользовательской формы спрашивает, какие значения я хотел бы видеть в столбцах 1 и 32 каждой вновь созданной строки (я настроил ее так, чтобы одновременно можно было создать максимум 6 новых строк).Мои данные содержат 45 столбцов, и единственные данные, которые я хочу изменить во вновь созданных строках, - это данные в двух столбцах, которые я сказал ранее (1 и 32).Я хочу, чтобы данные из всех других столбцов из исходной строки были скопированы в каждую новую строку.Моя проблема в том, что я не могу понять, как написать код, который будет делать это так, как я хочу.Например, если я отвечу пользовательской форме, что хочу добавить 3 строки ниже активной в данный момент ячейки, он спросит меня, какие значения я хочу ввести для столбцов 1 и 32 для каждой из этих новых строк.Поэтому я хотел бы ввести что-то вроде этого:

Первая новая строка
Столбец 1: 8/17/2019
Столбец 32: 400

Вторая новая строка
Столбец 1: 8/10/2019
Столбец 32: 500

Третья новая строка
Столбец 1: 03.08.2009
Колонка 32: 600

Я пробовал много разных кодов, но я действительно только понял, как написать его так, чтобы он вставлял одну строку ниже активной ячейки, а она была абсолютно пустой, я нене знает, как его запрограммировать, чтобы он вводил значения, выбранные мной для столбцов 1 и 32, и копировал все остальные данные из исходной строки.Я уже выяснил код кнопки сброса и отмены на своей пользовательской форме, теперь меня интересует только написание этого кода для кнопки «ОК».

Private Sub CancelButton_Click()

    Unload Me

End Sub

Private Sub ClearButton_Click()

    Call UserForm_Initialize

End Sub

Private Sub OKButton_Click()

    Dim lRow As Long
    Dim lRsp As Long

    On Error Resume Next

    lRow = Selection.Row()
    lRsp = MsgBox("Insert New row above " & lRow & "?", _
            vbQuestion + vbYesNo)
    If lRsp <> vbYes Then Exit Sub

    Rows(lRow).Select
    Selection.Copy
    Rows(lRow + 1).Select
    Selection.Insert Shift:=xlDown

    Application.CutCopyMode = False

    Rows(lRow).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone

End Sub

Private Sub UserForm_Initialize()

    AddRowsTextBox.Value = ""

    Date1TextBox.Value = ""
    Date2TextBox.Value = ""
    Date3TextBox.Value = ""
    Date4TextBox.Value = ""
    Date5TextBox.Value = ""
    Date6TextBox.Value = ""

    Qty1TextBox.Value = ""
    Qty2TextBox.Value = ""
    Qty3TextBox.Value = ""
    Qty4TextBox.Value = ""
    Qty5TextBox.Value = ""
    Qty6TextBox.Value = ""


End Sub

1 Ответ

0 голосов
/ 26 июня 2019

что я понимаю из вашего требования, я бы добавил еще одну кнопку прокрутки в форму, чтобы сделать ее удобной для пользователя. Это может выглядеть так.

enter image description here

Форма пользователя Код может быть изменен в соответствии с именами элементов управления в вашей форме

Option Explicit
Public Bal As Double, XQnty As Double, LargeOrder As Double, Sm As Double
Private Sub CommandButton1_Click()
Dim lRow As Long
Dim lRsp As Long

lRow = ActiveCell.Row()
lRsp = MsgBox("Insert New row Below " & lRow & "?", vbQuestion + vbYesNo)


If lRsp <> vbYes Then Exit Sub
Dim Ws As Worksheet
Dim R As Long, i As Integer, RowtoAdd As Integer
Set Ws = ThisWorkbook.ActiveSheet
RowtoAdd = Me.SpinButton1.Value
R = ActiveCell.Row
  With Ws
        .Cells(R, 32).Value = LargeOrder
        For i = 1 To RowtoAdd
        .Cells(R + 1, 1).EntireRow.Insert Shift:=xlDown
        .Cells(R, 1).EntireRow.Copy Destination:=.Cells(R + 1, 1)
        .Cells(R + 1, 1).Value = Me.Controls("TextBox" & i).Value
        .Cells(R + 1, 32).Value = Me.Controls("TextBox" & 7 + i).Value
        R = R + 1
        Next i
  End With
Unload Me
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub SpinButton1_Change()
Dim x As Integer, i As Integer, Y As Double
Me.TextBox7.Value = Me.SpinButton1.Value
x = Me.SpinButton1.Value
Sm = 0
    For i = 1 To 6
    Me.Controls("TextBox" & i).BackColor = IIf(i <= x, RGB(255, 100, 100), RGB(255, 2550, 255))
    Me.Controls("TextBox" & i + 7).Value = IIf(i <= x, Int(Bal / x), 0)
    Sm = Sm + IIf(i <= x, Int(Bal / x), 0)
    Next

    If Sm <> Bal Then
    Me.TextBox8.Value = Int(Bal / x) + Bal - Sm
    End If
ManualBal
End Sub
Private Sub TB_LO_Change()
LargeOrder = Val(Me.TB_LO.Value)
Bal = XQnty - LargeOrder
ManualBal
End Sub
Private Sub UserForm_Initialize()
Dim i As Integer, dx As Variant
Me.SpinButton1.Value = 1
Me.TextBox7.Value = 1
Me.TextBox1.BackColor = RGB(255, 100, 100)
dx = ThisWorkbook.ActiveSheet.Cells(ActiveCell.Row, 1).Value
XQnty = ThisWorkbook.ActiveSheet.Cells(ActiveCell.Row, 32).Value
LargeOrder = 575
Bal = XQnty - LargeOrder
Sm = 0
If IsDate(dx) = False Then dx = Now()
    For i = 1 To 6
    Me.Controls("TextBox" & i).Value = Format(dx - i * 7, "mm-dd-yyyy")
    Sm = Sm + Int(Bal / 6)
    Me.Controls("TextBox" & i + 7).Value = Int(Bal / 6)
    Next
    If Sm <> Bal Then
    Me.TextBox8.Value = Int(Bal / 6) + Bal - Sm
    End If
Me.TB_LO = LargeOrder
Me.TB_Bal = 0
End Sub
Private Sub ManualBal()
Dim x As Integer, i As Integer
x = Me.SpinButton1.Value
Bal = XQnty - LargeOrder
Sm = 0
    For i = 1 To 6  ' Or may use 6 insted of X
    Sm = Sm + Val(Me.Controls("TextBox" & i + 7).Value)
    Next
    Me.TB_Bal.Value = Bal - Sm
End Sub
Private Sub TextBox8_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub
Private Sub TextBox9_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub
Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub
Private Sub TextBox11_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub
Private Sub TextBox12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub
Private Sub TextBox13_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ManualBal
End Sub

Здесь текстовое поле от 1 до 6 для дат, 7 для значений кнопок прокрутки и текстовое поле от 8 до 13 для количества. Можно изменить код в соответствии с именами элементов управления или изменить имена элементов управления в соответствии с кодом.

Редактировать: добавлены два новых текстовых поля с именем TB_BAL для отображения при вводе значений вручную в текстовых полях Количество (баланс рассчитывается только при событии выхода из текстовых полей) и TB_LO для изменения LargeOrder во время выполнения.

...