Пользовательская форма открывается при выборе кнопки. Как сделать так, чтобы ввод данных в текстовые поля формы вставлялся в строку на отдельном листе? - PullRequest
0 голосов
/ 16 января 2019

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

Мне нужно, чтобы данные из формы были помещены на отдельный лист (называемый «разделением»), чтобы у меня была запись исходных подробностей тура и новых подробностей тура на одном листе. Но я получаю сообщение об ошибке «1004» (ошибка приложения или объекта) при попытке запуска макроса. Я новичок в VBA и не знаю, что сделал неправильно!

Это мой код:

Private Sub UserForm_Initialize()
    With Me
        .OriginalTourCode.Value = Cells(ActiveCell.Row, "A").Value
        .OriginalStartDate.Value = Cells(ActiveCell.Row, "B").Value
        .OriginalEndDate.Value = Cells(ActiveCell.Row, "C").Value
    End With
End Sub

Private Sub SplitTourCommand_Click()

Dim ctrl As Control
    Dim ws As Worksheet
    Set ws = Sheets("Splits")

erow = ws.Cells(Rows.Count, 1).End(x1Up).Offset(1, 0)
    Cells(erow, 1) = OriginalTourCode.Text
    Cells(erow, 2) = OriginalStartDate.Text
    Cells(erow, 3) = OriginalEndDate.Text
    Cells(erow, 4) = NewTourCode1.Text
    Cells(erow, 5) = NewStartDate1.Text
    Cells(erow, 6) = NewEndDate1.Text
    Cells(erow, 7) = NewTourCode2.Text
    Cells(erow, 8) = NewStartDate2.Text
    Cells(erow, 9) = NewEndDate2.Text
    Cells(erow, 10) = ReasonForSplit.Text


End Sub

Private Sub CloseCommand_Click()

Unload Me

End Sub

Раздел Userform Intitialise автоматически заполняет первые три ячейки пользовательской формы, а затем я буду использовать форму для ввода новых данных.

Раздел «Закрыть» - это отдельная кнопка в форме для выхода.

Как получить форму, когда я нажимаю командную кнопку "split tour", чтобы ввести данные в следующую пустую строку листа "split"?

Большое спасибо заранее за помощь.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Переменная объекта не требуется

Конечный параметр: xlUp, а не x1Up.

Версия массива

Option Explicit

Private Sub SplitTourCommand_Click()

    Const cSheet As String = "Splits"

    Dim erow As Long
    Dim vnt As Variant

    ReDim vnt(1 To 1, 1 To 10) As String

    vnt(1, 1) = OriginalTourCode.Text
    vnt(1, 2) = OriginalStartDate.Text
    vnt(1, 3) = OriginalEndDate.Text
    vnt(1, 4) = NewTourCode1.Text
    vnt(1, 5) = NewStartDate1.Text
    vnt(1, 6) = NewEndDate1.Text
    vnt(1, 7) = NewTourCode2.Text
    vnt(1, 8) = NewStartDate2.Text
    vnt(1, 9) = NewEndDate2.Text
    vnt(1, 10) = ReasonForSplit.Text

    With Worksheets(cSheet)
        erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(erow, 1).Resize(, 10) = vnt
    End With

End Sub

Модельный ряд

Option Explicit

Private Sub SplitTourCommand_Click()

    Const cSheet As String = "Splits"

    Dim erow As Long

    With Worksheets(cSheet)
        erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(erow, 1) = OriginalTourCode.Text
        .Cells(erow, 2) = OriginalStartDate.Text
        .Cells(erow, 3) = OriginalEndDate.Text
        .Cells(erow, 4) = NewTourCode1.Text
        .Cells(erow, 5) = NewStartDate1.Text
        .Cells(erow, 6) = NewEndDate1.Text
        .Cells(erow, 7) = NewTourCode2.Text
        .Cells(erow, 8) = NewStartDate2.Text
        .Cells(erow, 9) = NewEndDate2.Text
        .Cells(erow, 10) = ReasonForSplit.Text
    End With

End Sub
0 голосов
/ 16 января 2019
erow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

В вашем коде было 2 ошибки. Во-первых, команда xlUp, а не x1Up - «xl» означает «Excel», а не «X One» - это прекрасный пример того, почему вы почти всегда должны использовать Option Explicit

Второе: ваш код как есть попытается поместить .Value из ячейки в нетипизированную переменную erow - поскольку ячейка пуста (так как ячейка ниже последней ячейки с данными) это означает, что erow будет всегда будет 0. И строка 0 не существует для помещения данных.

Вместо этого, используя Range.Row, мы получаем номер следующей строки для вставки данных в

0 голосов
/ 16 января 2019

Вы были так близко

Dim ctrl As Control
    Dim ws As Worksheet
    Set ws = Sheets("Splits")

erow = ws.Cells(Rows.Count, 1).End(x1Up).Offset(1, 0)
    ws.Cells(erow, 1) = OriginalTourCode.Text
    ws.Cells(erow, 2) = OriginalStartDate.Text
    ws.Cells(erow, 3) = OriginalEndDate.Text
    ws.Cells(erow, 4) = NewTourCode1.Text
    ws.Cells(erow, 5) = NewStartDate1.Text
    ws.Cells(erow, 6) = NewEndDate1.Text
    ws.Cells(erow, 7) = NewTourCode2.Text
    ws.Cells(erow, 8) = NewStartDate2.Text
    ws.Cells(erow, 9) = NewEndDate2.Text
    ws.Cells(erow, 10) = ReasonForSplit.Text


End Sub
...