XL 2016 écrire dans première cellule vide

kinguepat

XLDnaute Nouveau
Bonsoir!!!

J'ai un tableau dans lequel je stocke des données et il m'arrive de supprimer certaines et du coup il ya des lignes vides qui restent entre des lignes renseignées.

La question est comment faire pour enregistrer (via userform) dans la première ligne (ou cellule) vide trouvée?

J'ai essayé avec
VB:
Dim Ligne as long
Ligne = Range("D" & Rows.Count).End(xlUp).Offset(1).Row 'sélection de la première cellule vide de la colonne D
Cells(Ligne, 3) = cbxCivil.Value
Cells(Ligne, 4) = txtNom.Value
...
mais il ne fonctionne pas du tout

Forme du tableau

Code:
NOM        VILLE    DATE
albert    ville1    date1
Joss    ville2    date2
        
Roland    ville4    date4
        
patrick    ville6    date6
 

dg62

XLDnaute Accro
Bonjour Kinguepat

remplace dans ton code par
VB:
ligne = Range("D1").End(xlDown).Offset(1, 0).Row
 

djidji59430

XLDnaute Accro
Bonjour à tous,

Avec une formule, ça donne :

{=ADRESSE(MIN(SI(ESTVIDE(D1:D1000;LIGNE(D1:D1000)));4)}
en matricielle

Crdlmt
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

Pour varier les plaisirs, une autre syntaxe possible
VB:
Sub Macro1()
Dim ligne As Long
On Error GoTo Erreur_Malheur
ligne = Columns(4).SpecialCells(xlCellTypeBlanks).Item(1).Row
MsgBox ligne
Exit Sub
Erreur_Malheur:
MsgBox "Pas de cellules vides dans la  colonne D du tableau!", vbCritical, "Erreur"
End Sub
 

kinguepat

XLDnaute Nouveau
Bonjour Kinguepat

remplace dans ton code par
VB:
ligne = Range("D1").End(xlDown).Offset(1, 0).Row
Bonjour! cette solution ne fonctionne pas, j'arrive à écrire sur la première ligne vide mais lors du prochain enregistrement, les données sont réécrites sur la même ligne que précédemment.
 

kinguepat

XLDnaute Nouveau
Bonjour le fil,

Pour varier les plaisirs, une autre syntaxe possible
VB:
Sub Macro1()
Dim ligne As Long
On Error GoTo Erreur_Malheur
ligne = Columns(4).SpecialCells(xlCellTypeBlanks).Item(1).Row
MsgBox ligne
Exit Sub
Erreur_Malheur:
MsgBox "Pas de cellules vides dans la  colonne D du tableau!", vbCritical, "Erreur"
End Sub
Merciiii:);) cette solution fonctionne

VB:
Dim Ligne as Long
Ligne = Columns("D").SpecialCells(xlCellTypeBlanks).Item(1).Row
Cells(Ligne, 3) = cbxCivil.Value
Cells(Ligne, 4) = txtNom.Value
Cells(Ligne, 5) = cbxSex.Value
...
 

kinguepat

XLDnaute Nouveau
je profite de ce fil pour demander comment supprimer une plage définie.

dans notre exemple, nous avons la plage ("A:C") tout en sachant que les autres cellules contiennent des infos à ne pas supprimer
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

kinguepat
Si tu entends une plage définie, comme une plage nommée, voir le petit exemple ci-dessous
VB:
Sub Test()
'création d'une plage nommée
Columns("A:C").Name = "titi"
mess = "Nom plage: " & [titi].Name.Name & Chr(13)
mess = mess & "Adresse de la plage nommée: " & [titi].Address(0, 0)
MsgBox mess, vbInformation
'suppression d'une plage nommée
ThisWorkbook.Names("titi").Delete
End Sub
NB: A tester sur un classeur vierge
 

dg62

XLDnaute Accro
Bonjour! cette solution ne fonctionne pas, j'arrive à écrire sur la première ligne vide mais lors du prochain enregistrement, les données sont réécrites sur la même ligne que précédemment.
Bonjour le fil,
chez moi cela fonctionne bien bizarre
 

Staple1600

XLDnaute Barbatruc
Re, bonjour dg62

kinguepat
Si tu avais joint un fichier exemple dans ton premier message, on n'en serait pas au 10ième message ;)

PS: Si on se base sur ton bout de tableau (cf message#1)
La colonne D est vide...
Sinon, je confirme que le code de dg62 donne le même résultat que le mien
Voir avec cette macro
VB:
Sub limation()
Dim ligne&
ligne = Range("A1").End(xlDown).Offset(1, 0).Row
MsgBox ligne, vbInformation, "Test dg62"
ligne = Columns(1).SpecialCells(xlCellTypeBlanks).Item(1).Row
MsgBox ligne, vbInformation, "Test Staple"
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour à tous,

Une remarque sur la solution de Staple1600 : la méthode SpecialCells ne recherche que sur le UsedRange.

Prenez une feuille vierge et remplissez la plage A1:A10.

ligne = Columns(1).SpecialCells(xlCellTypeBlanks).Item(1).Row ne trouvera pas la ligne 11...

A+
 

Staple1600

XLDnaute Barbatruc
Bonjour job75

[humour du dimanche aprés-midi]
Prenez une feuille vierge et remplissez la plage A1:A10.
puis faites ce qu'explique kinguepat dans son message#1
il m'arrive de supprimer certaines et du coup il ya des lignes vides qui restent entre des lignes renseignées.
Donc effacer(au hasard) le contenu de A4
alors
ligne = Columns(1).SpecialCells(xlCellTypeBlanks).Item(1).Row trouvera 4
tout comme la syntaxe de dg62
ligne = Range("A1").End(xlDown).Offset(1, 0).Row
;)
[/humour du dimanche aprés-midi]

PS: Ceci dit dans mes propres tableaux (ceux du taf); je n'ai jamais de lignes vides ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

pour le fun,

A l'opposé, si on remplit A1:A9, si on vide la cellule A4, si on masque la ligne 4 (ce cas se rencontre lors des filtrages) alors :
  • ligne = Range("A1").End(xlDown).Offset(1, 0).Row ne fonctionnera pas (affiche 10)
  • et ligne = Columns(1).SpecialCells(xlCellTypeBlanks).Item(1).Row fonctionnera (affiche 4)
 

job75

XLDnaute Barbatruc
Cette solution fonctionne dans tous les cas :
VB:
Sub LigneVide()
Dim tablo, ligne
tablo = Columns(1) 'matrice, plus rapide
For ligne = 1 To UBound(tablo)
    If IsEmpty(tablo(ligne, 1)) Then Exit For
Next
End Sub
Testé avec la colonne A pleine, la ligne 1048576 est atteinte en 0,48 seconde chez moi, c'est jouable.

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Une petite modif pour pallier la difficulté des "cellules vides" pas" vides". On remplace IsEmpty() par ="".
Voir fichier pour comparaison entre les deux méthodes.
VB:
Sub LigneVide2()
Dim t, n&
  n = UsedRange.Row + UsedRange.Rows.Count: t = Columns(1).Resize(n)
  For n = 1 To UBound(t)
    If t(n, 1) = "" Then Exit For
  Next
  MsgBox n, vbInformation
End Sub
 

Fichiers joints

job75

XLDnaute Barbatruc
t(n, 1) = "" crée un bug si la cellule contient une valeur d'erreur, il vaut mieux rechercher les cellules réellement vides avec IsEmpty.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Je suis d'accord (j'avais oublié les erreurs - et pourtant ça m'est arrivé plusieurs fois) mais IsEmpty n'enlève pas le problème des cellules vides "non vides".
C'est "rigolo" comme un problème simple peut présenter des cas aboutissant à une complication insoupçonné:
  • zone UsedRange
  • lignes masquées
  • cellules apparemment vides
  • présence d'erreur...
 
Dernière édition:

job75

XLDnaute Barbatruc
Normalement les cellules vides "non vides" contiennent une formule, il n'y a pas d'intérêt à les rechercher.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Je te rejoins. Mais le cas s'était produit fortuitement via une copie à partir de cellules dont la formule était du type =sierreur( ... ; "")
Enfin tu as raison, le cas se produit rarement.
 

Discussions similaires


Haut Bas