Problème intéressant en faisant du VBA; Lorsque le code est exécuté, il n'imprime pas la valeur sur la première ligne vide. Lorsque vous sautez du code avec f8, cela fonctionne. Semble être dans la dernière ligne de commande. Le code est:

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

Personnellement, je pense que la ligne NextCell = Answer est le problème, mais je n'arrive pas à la trouver.

1
RobExcel 20 avril 2020 à 08:54

3 réponses

Meilleure réponse

Fin (xlUp) vs Find

Cet article fait référence à la partie suivante du code OP:

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

La maladie

Dans la ligne

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

Vous avez oublié d'utiliser Set (NextCell est un objet). Utilisez plutôt ceci:

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

Pourquoi "Correct?" ?

Si NextCell est la cellule H1, il est possible qu'elle soit vide et que le code y écrira. La prochaine fois, 'End(xlUp)' renverra à nouveau la cellule H1 qui n'est pas vide maintenant et y écrira ... et encore et encore ... pour conclure:

Si la cellule H1 est vide ou non et que toutes les autres cellules sont vides, le code écrira dans la cellule H1, le fait étant que le plus souvent vous avez des en-têtes dans la première ligne et le code n'ajoutera pas de données aux lignes suivantes.

D'autre part, le code fonctionnera s'il y a des données au moins dans la 2ème ligne (par exemple, en-têtes dans la 2ème ligne).

Un rappel

Lorsque vous utilisez End(xlUp), vous devez toujours garder à l'esprit ce qui suit:

  1. S'il n'y a pas de données dans une colonne ou s'il n'y a des données que dans le premier
    row, il renverra la première cellule de la colonne (référencée dans FirstxlUp1, FirstxlUp2, FirstFind).

  2. Il peut également renvoyer des résultats indésirables lorsque les lignes sont masquées ou filtré (mentionné dans FirstFind uniquement).

Un remède

Voici quelques solutions pour éviter les problèmes précédents. Pour une meilleure compréhension, ils ont été simplifiés.

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

Le vrai remède

En pratique, vous devez toujours utiliser des en-têtes . Ensuite, vous pouvez éviter tout cela 'If-ing' et utiliser les one-liners suivants pour trouver la 'première' cellule vide dans une colonne comme celle-ci:

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)

Si vous masquez ou filtrez des lignes, utilisez exclusivement la méthode de recherche.

1
VBasic2008 20 avril 2020 à 10:04

L'utilisateur @PeH a bien compris. Foutu avec la ligne With Sheets. Acclamations!

0
RobExcel 20 avril 2020 à 06:33

Tous les objets Cells, Range, Rows et Columns doivent être clairement spécifiés dans leur feuille de calcul. Aimer

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

Sinon, il se peut qu'Excel choisisse la mauvaise feuille sur laquelle écrire.

Ou si vous souhaitez utiliser la déclaration With Sheets("Table") (qui n'est pas du tout utilisée pour le moment), alors vos instructions Cells, Range, Rows et Columns doivent pour commencer par un point:

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
1
Pᴇʜ 20 avril 2020 à 06:37