Смещение входного значения не «печатается» в VBA - PullRequest
1 голос
/ 20 апреля 2020

Интересная проблема при выполнении некоторых VBA; Когда код выполняется, он не «печатает» значение в первой пустой строке. При пропуске кода через F8 все работает. Кажется, в последней командной строке. Код:

Call SlotjeEraf (Unlock/Unhide VBA)
Dim Answer As Variant
  Dim NextCell As Range
With Sheets("Table")
    Set NextCell = Cells(Rows.Count, "H").End(xlUp)
    If NextCell.Row > 1 Then NextCell = NextCell.Offset(1, 0)

    Answer = InputBox("Medewerkersnaam:")

    NextCell = Answer

    Call SlotjeErop (Lock VBA/Hide Sheet)

End With
End Sub

Лично я чувствую, что проблема связана с строкой NextCell = Answer, но я не могу ее найти.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Все объекты Cells, Range, Rows и Columns должны быть четко указаны, на каком листе они находятся. Например,

Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "H").End(xlUp)

, в противном случае Excel может выбрать неправильный лист для записи.

Или, если вы хотите использовать With Sheets("Table") устав (который не используется совсем верно сейчас) тогда ваши операторы Cells, Range, Rows и Columns должны начинаться с точки:

With ThisWorkbook.Worksheets("Table")
    Set NextCell = .Cells(.Rows.Count, "H").End(xlUp)
    If NextCell.Row > 1 Then NextCell = NextCell.Offset(1, 0)

    Answer = InputBox("Medewerkersnaam:")

    NextCell = Answer

    Call SlotjeErop '(Lock VBA/Hide Sheet)
End With
0 голосов
/ 20 апреля 2020

Конец (xlUp) против Find

Этот пост относится к следующей части кода OP:

Dim NextCell As Range
Set NextCell = Cells(Rows.Count, "H").End(xlUp)
If NextCell.Row > 1 Then NextCell = NextCell.Offset(1, 0)

Болезнь

В строке

If NextCell.Row > 1 Then NextCell = NextCell.Offset(1, 0)     ' Wrong

вы забыли использовать Set (NextCell - это объект). Используйте это вместо:

If NextCell.Row > 1 Then Set NextCell = NextCell.Offset(1, 0) ' Correct?

Почему "Правильно?" ?

Если NextCell - это ячейка H1, возможно, она пуста и код будет записан в нее. В следующий раз 'End(xlUp)' снова вернет ячейку H1, которая сейчас не пуста, и запишет в нее ... и снова и снова ... чтобы сделать вывод:

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

С другой стороны, код будет работать, если есть данные хотя бы во 2-й строке (например, заголовки во 2-й строке).

Напоминание

При использовании End(xlUp), вы всегда должны иметь в виду следующее:

  1. Если в столбце нет данных или есть данные только в первой строке
    , он вернется первая ячейка в столбце (см. FirstxlUp1, FirstxlUp2, FirstFind).

  2. Может также возвращать нежелательные результаты, когда строки скрыты или отфильтрованы (см. только в FirstFind).

A Cure

Ниже приведены некоторые решения избежать предыдущих проблем. Для лучшего понимания они были упрощены.

Option Explicit

Sub FirstxlUp1()
    Dim NextCell As Range
    With ThisWorkbook.Worksheets("Sheet1")
        Set NextCell = .Cells(.Rows.Count, "H").End(xlUp)
    End With

    If NextCell.Row = 1 Then
        If NextCell.Value <> "" Then Set NextCell = NextCell.Offset(1)
    Else
        Set NextCell = NextCell.Offset(1)
    End If

    NextCell.Value = "TestxlUp1"
End Sub

Sub FirstxlUp2()
    Dim NextCell As Range
    With ThisWorkbook.Worksheets("Sheet1")
        Set NextCell = .Cells(.Rows.Count, "H").End(xlUp)
    End With

    If NextCell.Row > 1 Then
        Set NextCell = NextCell.Offset(1)
    Else
        If NextCell.Value <> "" Then Set NextCell = NextCell.Offset(1)
    End If

    NextCell.Value = "TestxlUp2"
End Sub

Sub FirstFind()
    Dim NextCell As Range
    With ThisWorkbook.Worksheets("Sheet1")

        ' Try to find a non-empty cell in the column; 'xlFormulas'
        ' includes finding cells with formulas evaluating to "".
        Set NextCell = .Columns("H").Find(What:="*", LookIn:=xlFormulas, _
          SearchDirection:=xlPrevious)
        ' Or:
        'Set nextCell = .Columns("H").Find("*", , xlFormulas, , , xlPrevious)

        ' Check if a cell was found. If a non-empty cell was not found,
        ' the range evaluates to 'Nothing'.
        If Not NextCell Is Nothing Then
            ' Found the last non-empty (bottom-most) cell in the column.
            Set NextCell = NextCell.Offset(1)
        Else
            ' All cells in the column are empty.
            Set NextCell = .Cells(1, "H")
        End If

    End With
    NextCell.Value = "TestFind"
End Sub

The Real Cure

На практике вы должны всегда использовать заголовки . Тогда вы можете избежать всего этого «If-ing» и использовать следующие однострочные, чтобы найти «первую» пустую ячейку в столбце, подобную этой:

Set NextCell = Cells(Rows.Count, "H").End(xlUp).Offset(1)
' or:
Set NextCell = Columns("H").Find(What:="*", LookIn:=xlFormulas, _
  SearchDirection:=xlPrevious).Offset(1)
' Or:
'Set nextCell = Columns("H").Find("*", , xlFormulas, , , xlPrevious).Offset(1)

Если вы прячетесь или для фильтрации строк используйте исключительно метод поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...