Как исправить пользовательскую форму, которая вставляет данные в отдельный лист, но оставляет две пустые строки между каждой записью, несмотря на код для вставки в следующую пустую строку? - PullRequest
0 голосов
/ 24 января 2019

У меня есть пользовательская форма, которая предназначена для вставки данных в листы, называемые «Финальные туры» и «Разделение», но по-разному.

Я выбираю строку в «Final Tours», нажимаю кнопку «Split Tour» и вводю новые детали тура.Затем он копирует новые детали тура в конец «Final Tours» (это работает нормально) и удаляет исходную строку.Он также предназначен для копирования данных в разделы.Однако в разделе «Разделение», когда он правильно вводит данные в строку, каждый раз, когда я вводю новые данные в пользовательскую форму, он оставляет две пустые строки из предыдущей строки.

Итак, если я разделю три тура, на «Разделениях» будут отображаться данные в строках 1, 4, 7 и т. Д. Вместо 1, 2, 3. Я не могу понять, почему это происходит.Какие-нибудь мысли?Мой код ниже:

Option Explicit
Dim originalRow As Range

Private Sub UserForm_Initialize()
    Set originalRow = ActiveCell.EntireRow
    With Me
        .OriginalTourCode.Value = originalRow.Cells(1).Value
        .OriginalStartDate.Value = originalRow.Cells(2).Value
        .OriginalEndDate.Value = originalRow.Cells(3).Value
    End With
End Sub    

Private Sub SplitTourCommand_Click()

    Dim ctrl As Control
    Dim wsSplits As Worksheet
    Set wsSplits = Sheets("Splits")
    Dim wsTours As Worksheet
    Set wsTours = Sheets("Final Tours")
    Dim WSheet As Variant
    Dim DTable As Variant, RowCount As Long

    Application.ActiveWorkbook.Save

    For Each WSheet In ActiveWorkbook.Worksheets
        If wsTours.AutoFilterMode Then
            If wsTours.FilterMode Then
                wsTours.ShowAllData
            End If
        End If
        For Each DTable In wsTours.ListObjects
            If DTable.ShowAutoFilter Then
                DTable.Range.AutoFilter
                DTable.Range.AutoFilter
            End If
        Next DTable
    Next WSheet

    With wsSplits.Cells(Rows.Count, "A").End(xlUp)
        With .Offset(1, 0).EntireRow
            With .Offset(2, 0).EntireRow
                .Cells(1) = OriginalTourCode.Text
                .Cells(2) = OriginalStartDate.Text
                .Cells(3) = OriginalEndDate.Text
                .Cells(4) = NewTourCode1.Text
                .Cells(5) = NewStartDate1.Text
                .Cells(6) = NewEndDate1.Text
                .Cells(7) = NewTourCode2.Text
                .Cells(8) = NewStartDate2.Text
                .Cells(9) = NewEndDate2.Text
                .Cells(10) = ReasonForSplit.Text
                .Cells(11).Value = Date

            End With
        End With

        With wsTours.Cells(Rows.Count, "A").End(xlUp)
            .Offset(1, 0).Value = NewTourCode1.Text
            .Offset(1, 1).Value = NewStartDate1.Text
            .Offset(1, 2).Value = NewEndDate1.Text
            .Offset(2, 0).Value = NewTourCode2.Text
            .Offset(2, 1).Value = NewStartDate2.Text
            .Offset(2, 2).Value = NewEndDate2.Text
        End With

        originalRow.Delete 'remove the row the split tour

        MsgBox "Tour " & OriginalTourCode.Text & _
        " has been split to " & NewTourCode1.Text & _
        " and " & NewTourCode2.Text

        Unload Me

    End With

End Sub

Private Sub CloseCommand_Click()

    Unload Me

End Sub

Заранее благодарен за любую помощь.

1 Ответ

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

Вы опубликовали много кода, что затрудняет полный ответ. Вместо этого я дам вам несколько советов о том, как упростить отслеживание и отладку кода.
Эта часть:

With wsSplits.Cells(Rows.Count, "A").End(xlUp)
    With .Offset(1, 0).EntireRow
        With .Offset(2, 0).EntireRow

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

NewRow = wsSplits.Cells(Rows.Count, "A").End(xlUp).Row

, а затем работать оттуда, как

wsSplits.Cells(NewRow + 1, "A")...
...