Использование пользовательской формы Excel для вырезания строки с x, удаления строки и вставки на другой лист

Работа над пользовательской формой в Excel, которая вырежет строку со значением в столбце «B», которое вводится в пользовательской форме, затем вставит строку в лист 2, а также добавит еще 3 значения из пользовательской формы. Это то, что у меня есть, но в настоящее время для меня это ничего не делает:

Private Sub OkButton2_Click()

Dim i As Long: i = 1
With ActiveSheet
    For n = nLastRow To nFirstRow Step -1
        If .Cells(n, "B") = "ChartTextBox2.Value" Then
            .Cells(n, "B").EntireRow.Cut Sheet2.Cells(i, "A")
            .Cells(n, "B").EntireRow.Delete
            i = i + 1
'Transfer information
Sheets("Sheet2").Cells(emptyRow, 7).Value = DTPicker4.Value
Sheets("Sheet2").Cells(emptyRow, 8).Value = DispoTextBox.Value
Sheets("Sheet2").Cells(emptyRow, 9).Value = ReasonTextBox.Value
        End If
    Next
    End With
End Sub

person Joe Carpenter    schedule 31.10.2016    source источник
comment
Cells(emptyRow, Sheet2, 11) не то, как вы это используете. Вы имеете в виду Sheets("Sheet2").Cells(emptyRow,11)?   -  person BruceWayne    schedule 01.11.2016


Ответы (1)


Код ниже работал у меня нормально. Вы сравниваете с текстом "ChartTextBox2.Value" или с текстом в текстовом поле ChartTextBox2? Предполагая, что вы сравниваете текст в текстовом поле, приведенный ниже код мне подходит. Также в вашем коде не декларировались nLastRow и nFirstRow. Если это не так, вы можете удалить эти утверждения.

Private Sub OkButton2_Click()
  Dim nLastRow As Long  'If already declared neglect this statement
  Dim nFirstRow As Long 'If already declared neglect this statement
  Dim i As Long: i = 1

  nLastRow = ActiveSheet.UsedRange.Rows.Count   'If already specified neglect this statement
  nFirstRow = ActiveSheet.UsedRange.Row         'If already specified neglect this statement

  With ActiveSheet
    For n = nLastRow To nFirstRow Step -1
      If .Cells(n, "B") = ChartTextBox2.Value Then
        .Cells(n, "B").EntireRow.Cut Sheets("Sheet2").Cells(i, "A")
        .Cells(n, "B").EntireRow.Delete
        i = i + 1
        'Transfer information
        Sheets("Sheet2").Cells(emptyRow, 7).Value = DTPicker4.Value
        Sheets("Sheet2").Cells(emptyRow, 8).Value = DispoTextBox.Value
        Sheets("Sheet2").Cells(emptyRow, 9).Value = ReasonTextBox.Value
      End If
    Next
  End With
End Sub
person Mukul Varshney    schedule 03.11.2016
comment
У меня все еще не работает :( Сводя с ума, я не могу найти, что вешает. Никакой ошибки ... просто ничего: P Сравнение с текстом в текстовом поле ChartTextBox2. - person Joe Carpenter; 07.11.2016
comment
Попробуйте прокомментировать большинство утверждений и раскомментировать одно за другим. Это может помочь. Вы пробовали поставить точку останова и отладить с помощью F8? - person Mukul Varshney; 08.11.2016
comment
Когда я использовал отладчик (используя точки останова), похоже, что меня догоняют бесконечный цикл: If .Cells (n, B) = ChartTextBox2.Value Then End If Next If .Cells (n, B) = ChartTextBox2.Value - person Joe Carpenter; 08.11.2016
comment
Проверьте значения nLastRow, nFirstRow и emptyRow. Тем не менее, цикл for не должен делать его бесконечным. Кстати, я думаю, вам нужно изменить значение emptyRow в цикле for, поскольку эта ячейка каждый раз перезаписывается. Это зависит от строки, которую вы хотите записать в Sheet2. может быть в следующей строке. В таком случае это будут Sheets (Sheet2) .Cells (emptyRow + i, 7) .Value = DTPicker4.Value - person Mukul Varshney; 09.11.2016