Ecrire dans la première cellule vide d'une colonne

Bonjour,

je suis un peu embêté car je coince sur une fonction qui semble être très simple, mais qui me pose problème...

J'ai une feuille Excel, sur laquelle j'ai une colonne (E), dans laquelle je voudrais écrire un identifiant unique généré.

Pour automatiser le traitement j'utilise une procédure appelée par la macro principale, son but est de sélectionner le range, de chercher avec un vlookup si l'identifiant unique est situé dans la plage, si négatif, j'aimerais ajouter cet identifiant à la première cellule vide de cette même colonne (ou plage). Une fois ceci fait, je clos la procédure et repasse dans ma macro principale pour générer un autre identifiant (qui sera unique ou pas) et rebelote je réappelle ma procédure pour tester.

J'ai trouvé beaucoup d'exemples avec des select et copy/paste, mais je souhaite écrire mon numéro unique qui est une variable string dans la cellule et c'est la ou cela coince.

En fait j'ai l'impression que le problème, c'est que j'écris systématiquement dans la cellule E3, je ne descend jamais à la suivante vide.

Voiçi le code que j'utilise :

Sub numero_unique_formation(numero_A_tester As String)

Dim feuille_Option As Worksheet
Dim colonne_Num_unique As Range

'Numéro unique de session de formation construite sous cette forme :
'année_mois_jour-T (ou H pour théorique/Handson)-Numéro_de_groupe (G1 /G2 / GA)-Numéro_module_formation
'Sera écrit dans le sheet4 (calcul don t touch)

'MsgBox (numero_A_tester & vbCrLf & "-" & Mid(numero_A_tester, 17, 1) & "-")

'Premieère tape consiste à controler la validité du numéro unique !
If Mid(numero_A_tester, 17, 1) = "" Then
    'MsgBox (numero_A_tester & vbCrLf & Mid(numero_A_tester, 17, 1))
    Exit Sub
End If

Set feuille_Option = Sheet4
Set colonne_Num_unique = feuille_Option.Range("E3:E3000")

'VLOOKUP(Valeur_Cherchée ; Plage_Données ; Index_Colonne ; [Valeur_Proche])
'Les paramètres utilisables sont les suivants :
'- valeur_Cherchée : valeur qui sera cherchée dans la première colonne de la plage Plage_Données ;
'- plage_Données : Plage source de la recherche ;
'- index_Colonne : Index numérique de la colonne qui contient la valeur qui sera renvoyée ;
'- [Valeur_Proche] : Précise si Excel peut utiliser la valeur inférieure la plus proche (paramètre facultatif).

'Si je n'ai pas d erreur cela veut dire que le chiffre est déjà dans la liste !

'On Error Resume Next
'MsgBox (Application.VLookup(numero_A_tester, colonne_Num_unique, 1, False))

On Error Resume Next
If Application.VLookup(numero_A_tester, colonne_Num_unique, 1, False) = xlErrNA Then

   Num_unique_bool = True
   colonne_Num_unique.End(xlUp).Offset(1).Value = numero_A_tester

Else

    Num_unique_bool = False

End If

Set colonne_Num_unique = Nothing
Set feuille_Option = Nothing

End Sub

Num_unique_bool est une variable globale de type boolean

Merci pour l'aide

David

Bonjour Dav99 le forum

un petit fichier les explications dedans et on va faire

Tes variables je pense qu'elles ne sont pas assez longue "numéro_unique_pour_vérifier_si_elle_existent" serait beaucoup mieux pour être sur de se tromper un coup sur deux !!!!

a+

papou

Bonjour David, le forum,

Difficile de t'aider à partir d'un code incomplet et détaché de son fichier. Peux-tu joindre le code dans lequel tu appelles cette procédure ? Voire idéalement un fichier avec tout ça dedans, que l'on puisse tester en direct des solutions...

Salut dav999

Bon alors perso, je trouve cette procédure bien compliqué pour l'insertion d'une valeur unique :p

Mais concentrons nous sur le problème pour lequel tu viens vers nous !

En fait j'ai l'impression que le problème, c'est que j'écris systématiquement dans la cellule E3, je ne descend jamais à la suivante vide.

Si c'est sa ton problème, alors la source provient de ta variable colonne_Num_unique et plus particulièrement :

colonne_Num_unique.End(xlUp).Offset(1).Value = numero_A_tester

Que je te conseil de remplacer par :

colonne_Num_unique.End(xlUp).Offset(1).Value + 1= numero_A_tester

Je peux pas le tester de mon côté sans ton fichier alors n'hésite pas à revenir si sa n'a pas solutionner ton problème

Re Dav999 le forum

Num_unique_bool = True
   colonne_Num_unique.End(xlUp).Offset(1).Value = numero_A_tester

tu remplaces par:

Num_unique_bool = True
fin=feuille_Option.Range("E" & rows.count).end(3).row+1
feuille_Option.Range("E" & fin)= numero_A_tester

mais de toute façon ton code est à revoir !!!!

a+

papou

Merci à tous,

Oui j'ai repéré quelques coquilles, en fait ca fonctionne quand je change :

Set colonne_Num_unique = feuille_Option.Range("E3:E3000")

par ca :

Set colonne_Num_unique = feuille_Option.Range("E3000")

Je vais quand même regarder vos astuces car j'ai toujours quelque chose qui me contrarie

Merci à tous pour vos réponses

Re Dv999 le forum

en fait ton code il est bon a être jeté et en refaire un de 10 lignes qui lui fera ce que tu veux!!!

de plus tes variables avec des noms à rallonges c'est une bêtise

mais comme tu ne veux pas passer ton fichier bah !!!! Continue donc tout seul.

a+

Papou

Merci Papou,

en ayant obtenu une réponse sur un autre post, je comprends maintenant pourquoi les erreurs ne sortaient pas, à cause de ma mauvaise gestion des erreurs sous excel. Du coup cela ne me permettait pas de trouver d'où venait le problème.

Je vais essayer de m'en sortir seul, je réactive le post si je n'y arrive pas.

De plus j'ai lu que VLOOKUP ne fonctionne que sur des plages d'au moins 2 colonnes, or avec ma colonne unique je déclenchais une erreur qui ne sortait pas à cause de ma gestion désastreuse des erreurs.

Merci pour ta réponse, je vais effectivement revoir tout le code avec ce que je sais maintenant.

Bonne journée

Merci Papou,

en ayant obtenu une réponse sur un autre post, je comprends maintenant pourquoi les erreurs ne sortaient pas, à cause de ma mauvaise gestion des erreurs sous excel. Du coup cela ne me permettait pas de trouver d'où venait le problème.

Je vais essayer de m'en sortir seul, je réactive le post si je n'y arrive pas.

De plus j'ai lu que VLOOKUP ne fonctionne que sur des plages d'au moins 2 colonnes, or avec ma colonne unique je déclenchais une erreur qui ne sortait pas à cause de ma gestion désastreuse des erreurs.

Merci pour ta réponse, je vais effectivement revoir tout le code avec ce que je sais maintenant.

Bonne journée

La fonction TaPlage.Find(Quoi?,lookin:=xlValues,lookat:=xlWhole) serait plus adaptée.

Voilà un code que tu peux utiliser pour générer automatiquement un Identifiant unique qui viendra se placer dans ta colonne E :

Si tu veux t'en inspirer ou l'utiliser ^^

Sub ID_unique()
' Déclaration variable
Dim Lig As Integer, ID_num As Integer, x As Integer
Dim ID_lettre1 As String, ID_lettre2 As String, ID_lettre3 As String
' Compte le nombre d'indice présent dans ma colonne E
Lig = Range("E" & Rows.Count).End(xlUp).Row + 1
' Genère un chiffre entre 1 et 999
Randomize
ID_num = Int(999 * Rnd) + 1
' Génère trois lettres
Randomize
ID_lettre1 = Int((26 * Rnd) + 1)
ID_lettre2 = Int((26 * Rnd) + 1)
ID_lettre3 = Int((26 * Rnd) + 1)
' On regroupe ce qui a été généré dans la même variable
ID_lettre1 = Chr(ID_lettre1 + 64) & Chr(ID_lettre2 + 64) & Chr(ID_lettre3 + 64) & ID_num
' On boucle pour chercher si une valeur identique est existante dans ma colonne E
For x = 1 To Lig
    If Cells(x, 5) = ID_lettre1 Then    'Et si c'est le cas
        Call ID_unique                  'On rappel notre macro
    End If
Next
' Si la valeur est bien unique, alors on la place en fin de colonne E
Cells(Lig, 5) = ID_lettre1

End Sub

Bonjour Juice !

Ne serait-il pas plus simple de générer un numéro unique non pas de façon aléatoire mais suivant une suite logique ? Par exemple, un nombre égal au maximum déjà présent auquel on ajoute tout simplement 1 ?

La fonction TaPlage.Find(Quoi?,lookin:=xlValues,lookat:=xlWhole) serait plus adaptée.

Ok merci pour l'info je vais regarder à quoi ca ressemble

@Juice : Je génère moi même le nombre unique, cette partie ne posait pas de problème et n'en pose toujours pas, mais merci je garde cela sous le coude ca pourra servir à un autre moment.

Voila à quoi ca ressemble maintenant et ca fonctionne bien :

Sub numero_unique_formation(numero_A_tester As String)

Dim feuille_Option As Worksheet
Dim colonne_Num_unique As Range

Set feuille_Option = Sheet4
Set colonne_Num_unique = feuille_Option.Range("E2000")

'Premieère tape consiste à controler la validité du numéro unique !
If Len(numero_A_tester) < 17 Then
    Exit Sub
End If

'Si je n'ai pas d erreur cela veut dire que le chiffre est déjà dans la liste !

'Si le retour de la fonction ISNA est true, cela veut dire que vlookup ne trouve pas le numéro de training, dans ke
If WorksheetFunction.IsNA(Application.VLookup(numero_A_tester, Sheet4.Range("E3:F2000"), 1, False)) = True Then
   Num_unique_bool = True
   colonne_Num_unique.End(xlUp).Offset(1).Value = numero_A_tester
Else
    Num_unique_bool = False
End If

End Sub

Coucou Pedro,

Le truc c'est qu'on ne connais pas la mise en forme des ID de dev999 :p

Personnellement, tout comme tu le souligne, pour mon propre fichier je fais une suite logique de chiffre en me servant simplement du numéro de ligne.

Mais bon, je me suis dit que j'allais lui fournir un code pour réellement générer un ID aléatoire et unique x)

La fonction TaPlage.Find(Quoi?,lookin:=xlValues,lookat:=xlWhole) serait plus adaptée.

Ok merci pour l'info je vais regarder à quoi ca ressemble

@Juice : Je génère moi même le nombre unique, cette partie ne posait pas de problème et n'en pose toujours pas, mais merci je garde cela sous le coude ca pourra servir à un autre moment.

Voila à quoi ca ressemble maintenant et ca fonctionne bien :

Sub numero_unique_formation(numero_A_tester As String)

Dim feuille_Option As Worksheet
Dim colonne_Num_unique As Range

Set feuille_Option = Sheet4
Set colonne_Num_unique = feuille_Option.Range("E2000")

'Premieère tape consiste à controler la validité du numéro unique !
If Len(numero_A_tester) < 17 Then
    Exit Sub
End If

'Si je n'ai pas d erreur cela veut dire que le chiffre est déjà dans la liste !

'Si le retour de la fonction ISNA est true, cela veut dire que vlookup ne trouve pas le numéro de training, dans ke
If WorksheetFunction.IsNA(Application.VLookup(numero_A_tester, Sheet4.Range("E3:F2000"), 1, False)) = True Then
   Num_unique_bool = True
   colonne_Num_unique.End(xlUp).Offset(1).Value = numero_A_tester
Else
    Num_unique_bool = False
End If

End Sub

Ton code te sert juste à dire si un numéro unique spécifié est retrouvé dans ta plage, n'est ce pas ?

Dans ce cas il s'agirait plutôt d'écrire une fonction avec en entrées : le N° unique, la plage où le chercher, et qui te donne une valeur booléenne (oui je le trouve, non je ne le trouve pas). Au final, c'est un besoin courant et c'est donc déjà existant dans Excel ou dans VBA.

D'après moi, tout ton code peut être remplacé par :

Resultat=Sheet4.Range("E3:F2000").Find(numero_a_tester, lookin:=xlValues, lookat:=xlWhole)

S'il n'est pas retrouvé : resultat = nothing, sinon résultat est la cellule contenant ton numéro unique.

Oui c'est presque cela, sauf que lorsque je construit le numéro unique ,il est composé de plusieurs strings, et une en particulier peut être absente, du coup je dois tester la longueur de chaine avant de faire le vlookup ou d'utiliser ta fonction.

Il semblerait donc que je ne puisse pas le résumer à cette seule ligne de code

Mais si ton numéro unique est déconnant, tu le retrouveras de toute façon pas dans ta liste, non ?

Sinon tu peux ajouter un contrôle :

If Len(numero_a_tester) > 17 Then Resultat=Sheet4.Range("E3:F2000").Find(numero_a_tester, lookin:=xlValues, lookat:=xlWhole)
Rechercher des sujets similaires à "ecrire premiere vide colonne"