VBA recherche de la première cellule vide d'un tableau

Bonjour,

Je sollicite votre aide pour un fichier compteur (prise de numéros qui se suivent comme à la sécu) que j'ai créé et qui marchait quand j'utilisais la recherche de la dernière cellule vide avec la formule End(xlup).Row et qui me donne toujours le même numéro avec celle avec End(xldown).Row .

Pourquoi j'ai voulu changer la formule qui marche tout simplement parceque lorsque des numéros étaient annulés il fallait les régulariser manuellement. La recherche de la première cellule vide par End(xldown).Row permet de combler les vides dus aux annulations.

Je joins le fichier EXCEL avec la macro.

Dites moi ce que je n'ai pas capté pour que ce fichier marche.

Merci d'avance

Bonjour

Essaie plutôt ceci

Sub nouveau_numero()
'DEFINITION DES VARIABLES :

Dim num As Long, nbmax As Long, nbmin As Long, i As Long, derlign As Long

'DONNE LE PROCHAIN NUMERO DE LA LISTE, INSCRIT LE NOM DE L'UTILISATEUR et LA DATE ET SAUVE LE FICHIER :

With ActiveWorkbook.Sheets("LISTE")
    .Activate
    derlign = .Range("A" & .Rows.Count).End(xlUp).Row
    nbmax = WorksheetFunction.Max(.Range("A5:A" & derlign))
    nbmin = WorksheetFunction.Min(.Range("A5:A" & derlign))
    '
    For i = nbmin To nbmax
        If Application.CountIf(.Range("A5:A" & derlign), i) = 0 Then
            derlign = Range("A4").End(xlDown).Row + 1
            .Range("A" & derlign) = i
            .Range("B" & derlign + 1).Value = Environ("username")
            .Range("C" & derlign + 1).Value = Date
            Exit For
        End If
    Next
    .Range("A" & derlign + 1) = nbmax + 1

    .Range("B" & derlign + 1).Value = Environ("username")
    .Range("C" & derlign + 1).Value = Date
End With

ActiveWorkbook.Save
compteur.Show
End Sub

Ensuite placer --> Sub UserForm_InitiaLize() dans l'Userform Compteur et pas dans un module !

Mettre aussi PRIVATE devant. Comme ceci --> Private Sub UserForm_Initialize()

A te relire

Crdlt

Bonjour,

Merci pour la rapidité de ta réponse.

Je suis débutante "avancée" en VBA et je ne sais pas trop quoi changer sur la ligne :

derlign = .Range("A" & .Rows.Count).End(xlUp).Row

où le message suivant s'affiche : erreur d'exécution '424' objet requis

Pour la macro Private Sub UserForm_Initialize() si j'ai bien compris, le simple fait de la positionner dans le code concernant le compteur suffit sans appeler la macro à réinitialiser le compteur à chaque fois qu'il est chargé (compteur.show)

VOICI LE CODE tel que tu m'as conseillé de le changer et merci encore pour ton aide.

THISWORKBOOK :

Option Explicit

Private Sub Workbook_Open()

'DESACTIVER LA MISE A JOUR DE L'ECRAN

Application.ScreenUpdating = False

'DESACTIVE LA VISIBILITE DE L'APPLICATION A L'OUVERTURE DU FICHIER :

Application.WindowState = xlMinimized

Application.Visible = False

'DEFINITION DES VARIABLES :

Dim num As Long, nbmax As Long, nbmin As Long, i As Long, derlign As Long

'DONNE LE PROCHAIN NUMERO DE LA LISTE, INSCRIT LE NOM DE L'UTILISATEUR et LA DATE ET SAUVE LE FICHIER :

With ActiveWorkbook.Sheets("LISTE").Activate

derlign = .Range("A" & .Rows.Count).End(xlUp).Row

nbmax = WorksheetFunction.Max(.Range("A5:A" & derlign))

nbmin = WorksheetFunction.Min(.Range("A5:A" & derlign))

For i = nbmin To nbmax

If Application.CountIf(.Range("A5:A" & derlign), i) = 0 Then

derlign = Range("A4").End(xlDown).Row + 1

.Range("A" & derlign) = i

.Range("B" & derlign + 1).Value = Environ("username")

.Range("C" & derlign + 1).Value = Date

Exit For

End If

Next

.Range("A" & derlign + 1) = nbmax + 1

.Range("B" & derlign + 1).Value = Environ("username")

.Range("C" & derlign + 1).Value = Date

End With

ActiveWorkbook.Save

compteur.Show

End Sub

COMPTEUR :

Private Sub BTnouvNUM_Click()

'REND VISIBLE LE COMPTEUR ET APPELLE LA PROCEDURE NOUVEAU NUMERO (cf module 1)

compteur.Hide

Call nouveau_numero

End Sub

Private Sub BTsortir_Click()

'FERME LE CLASSEUR

ActiveWorkbook.Close

End Sub

Private Sub information_Click()

End Sub

Private Sub RETOURliste_Click()

'REACTIVER LA MISE A JOUR et la visibilité DE L'ECRAN

compteur.Hide

Workbooks.Application.Visible = True

Workbooks.Application.WindowState = xlMaximized

Application.ScreenUpdating = True

End Sub

Private Sub UserForm_Initialize()

compteur.TextBox1.Value = Sheets("LISTE").Range("A1").Value

compteur.TextBox2.Value = Sheets("LISTE").Range("B1").Value

compteur.TextBox3.Value = Sheets("LISTE").Range("C1").Value

compteur.TextBox4.Value = Sheets("LISTE").Range("G4").Value

compteur.Show

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

'REACTIVER LA MISE A JOUR et la visibilité DE L'ECRAN

compteur.Hide

Workbooks.Application.Visible = True

Workbooks.Application.WindowState = xlMaximized

Application.ScreenUpdating = True

End Sub

Bonjour,

Modifie la ligne suivante :

With ActiveWorkbook.Sheets("LISTE").Activate

comme celle-ci

With ActiveWorkbook.Sheets("LISTE")

Re

Merci d'essayer d'utiliser les balises de code car le code est plus facile à lire

où le message suivant s'affiche : erreur d'exécution '424' objet requis

Comme précisé par Raja, le bug vient du fait que le code posté dans mon message a été mal copié dans le fichier.

La ligne ACTIVATE doit se trouver après With ActiveWorkbook.Sheets("LISTE") en non à la suite

Je n'ai pas dit qu'il faut placer le code dans THISWORKBOOK, il faut juste le remplacer par celui qui est dans le fichier posté. Cela n'a d'ailleurs pas de sens puisque ce code doit être associé au bouton sur la feuille

En le plaçant dans Private Sub Workbook_Open(), le code va s'exécuter à chaque ouverture du fichier

Attention aussi avec les instructions HIDE qui cache l'USF à l'arrière plan et qui ne la décharge pas. Il faut utiliser "UNLOAD compteur"

Cordialement

Je me suis mal exprimée.

C'est un fichier en partage qui est censé donner un numéro de dossier unique dès qu'il est chargé.

C'est pourquoi j"avais placé initialement le code dans Private Sub Workbook_Open().

J'ai rectifié en ne mettant qu'une partie du code dans thisworkbook (tout ce qui concerne la désactivation de la MAJ de l'écran et la non visibilité du fichier au chargement et l'appel de la procédure nouveau_numéro dont j'ai mis le code dans le module 1).

Pour le code du module 1 je me suis inspirée en partie de ton code, Dan, et je t"en remercie. Le fichier fonctionne parfaitement pour donner un nouveau numéro soit en chargeant le fichier pour la première fois, soit par le biais de l'userform " compteur" en cliquant sur le bouton nouveau numéro ou soit par le bouton "nouveau numéro" lorsque l'utilisateur a cliqué sur "retour liste" et se trouve positionner sur la feuille "LISTE" rendue visible.

La macro "nouveau numéro" permet de donner le numéro suivant sur la première ligne trouvée vide dans la colonne A donc soit de compléter la série de nombres s"il n"y a pas d'interruption, soit de combler les lignes vides qui peuvent avoir été effacées.

En effet, les utilisateurs m'ont demandé s'ils pouvaient effacer les données des lignes dont les numéros ont été pris par erreur, de les laisser en blanc pour malgré tout réutiliser les numéros libres au prochain chargement du fichier.

J'ai donc créé un nouveau bouton "ANNULATION NUMERO" qui modifie le label "instruction" dévérouille le TextNUMERO, vide toutes les données qui étaient affichées dans l'userform et modifie le titre du bouton "ANNULATION NUMERO" en "CONFIRMATION ANNULATION"

Le problème est que je n'ai pas la main dans TextNUMERO après appel de l'userform pour inscrire un numéro existant de la liste des numéros et afficher les données correspondantes (nom de l'assistant et date) avant confirmaton de l'annulation, puis l'annulation proprement dite des données de la ligne correspondantes au numéro choisi. Je ne connais ni l'évênement ni la syntaxe à utiliser dans ce cas.

Je vous joins le fichier dans son intégralité et je vous serais infiniment reconnaissante si vous pouviez encore m'apporter votre aide.

bien cordialement

Christine

Bonjour

Première chose à changer est cette ligne

With ActiveWorkbook.Sheets("LISTE")

par celle-ci

With ThisWorkbook.Sheets("LISTE")

Cela évite le plantage si le classeur n'est pas actif

Deuxième modification, enlever les HIDE qui cache l'USF à l'arrière plan et mettre UNLOAD comme ceci "UNLOAD COMPTEUR" par exemple (sans point entre les deux)

Pour ce qui concerne les lignes effacées, je ne ferai pas comme cela. Compte tenu qu'il s'agit au final d'une base de données, le mieux serait de supprimer la ligne à effacer plutôt que de laisser des lignes vides. Ce n'est jamais bon au final

Le problème est que je n'ai pas la main dans TextNUMERO après appel de l'userform pour inscrire un numéro existant de la liste des numéros et afficher les données correspondantes (nom de l'assistant et date) avant confirmaton de l'annulation, puis l'annulation proprement dite des données de la ligne correspondantes au numéro choisi. Je ne connais ni l'évênement ni la syntaxe à utiliser dans ce cas.

On crée un bouton Recherche dans l'USF qui ouvre une autre USF pour chercher les données et par Ok ensuite il affiche les données dans la première USF ou éventuellement on peut aussi faire tout sur la première USF

Bon cela ?

Crdlt

Merci DAN pour ton aide précieuse.

Je joins le fichier qui marche super bien.

Je n'ai cependant pas suivi tes conseils tout à fait à la lettre.

D'une part pour le unload compteur : je ne l'ai pas changé à 2 endroits car le fichier apparaissait de manière fugace dans la procédure alors qu'avec la méthode "Hide" je n'ai pas ce problème ( cf BTannulation_Click et BTannulation_Click de l'userform) je n'ai pas d'explication !

D'autre part, je n'ai pas supprimé les lignes vides dans la série car les utilisateurs veulent pouvoir réutiliser les numéros afin de ne pas avoir de blancs dans leurs dossiers.

Je l'ai testé sans partage et en partage, c'a a l'air de fonctionner.

Merci encore pour votre aide.

Rechercher des sujets similaires à "vba recherche premiere vide tableau"