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
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
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é:
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.
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
trouvez ci-joint une fichier exemple afin de trouver une solution à mon problème.
avec l'aide de Staple 1600 (merci encore) je parviens à ajouter des infos dans le première ligne vide trouvée.
Ce que j'aimerai faire : après choix dans combobox (userform "ModifEmploy"), supprimer les infos de la plage ("C:V") de la cellule active tout en laissant les formules dans les cellules comportant des formules.
Tout en espérant avoir bien expliquer ma préoccupation, je vous remercie d'avance
code que j'ai essayé dans le bouton supprimer et qui ne convient pas à mes attentes :
VB:
With Sheets("Feuil1")
'on set la zone de recherche = colonne D du tableau
Set zone = .Range("D2:D" & Range("D" & Rows.Count).End(xlDown).Row)
'on cherche en colonne F la valeur sélectionnée dans le combobox
Set c = zone.Find(cbxNom.Value, lookat:=xlWhole)
' si le nom est trouvé
If Not c Is Nothing Then
'on efface les données sur les colonnes
c.Resize(, 20).ClearContents
End If
End With
trouvez ci-joint une fichier exemple afin de trouver une solution à mon problème.
avec l'aide de Staple 1600 (merci encore) je parviens à ajouter des infos dans le première ligne vide trouvée.
Je n'étions point le seul à apporter ma pierre à l'édifice
Si j'ai bien compris ta dernière question, ta macro ainsi modifiée donne-elle le résultat escompté?
VB:
Private Sub btnSupp_Click()
'''Dim cellule As Range
'''Dim supp As Integer
Dim zone As Range, c As Range
With Sheets("Feuil1")
'on set la zone de recherche = colonne D du tableau
Set zone = .Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
'on cherche en colonne D la valeur sélectionnée dans le combobox
Set c = zone.Find(cbxNom.Value, lookat:=xlWhole)
' si le nom est trouvé
If Not c Is Nothing Then
'on efface les données sur les colonnes
'''c.Resize(, 20).ClearContents
Rows(c.Row).ClearContents
End If
End With
End Sub
Non!!! elle supprime toute la ligne et même les formules contenues dans certaines cellules ( A, B, R). Je voudrais, tout en laissant les formules dans les cellules qui en contiennent, .ClearContents uniquement la plage de cellules (C:V) et non toute le ligne.
Et en remplaçant la ligne de code d'effacement par ceci ? 'on efface les données sur les colonnes
.Rows(c.Row).SpecialCells(xlCellTypeConstants, 23).ClearContents
Et si il faut vraiment ne viser que la plage C:V
On peut utiliser ceci
'on efface les données sur les colonnes
.Cells(c.Row, 3).Resize(, 20).SpecialCells(2, 23) = ""
Merci à vous qui avez apporté vos contributions au plus que importantes à ce fil. merci particulier à Staple 1600 pour son temps accordé et sa patience.
VB:
Private Sub btnSupp_Click()
Dim zone As Range, c As Range
With Sheets("Feuil1")
'on set la zone de recherche = colonne D du tableau
Set zone = .Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
'on cherche en colonne D la valeur sélectionnée dans le combobox
Set c = zone.Find(cbxNom.Value, lookat:=xlWhole)
' si le nom est trouvé
If Not c Is Nothing Then
'on efface les données sur la plage (C:V)
Cells(c.Row, 3).Resize(, 20).SpecialCells(2, 23) = ""
End If
End With
End Sub
Si j'étais moi, j'ajouterai ces deux petites choses
1)
VB:
Private Sub btnSupp_Click()
Dim zone As Range, c As Range
With Sheets("Feuil1")
'on set la zone de recherche = colonne D du tableau
Set zone = .Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
'on cherche en colonne D la valeur sélectionnée dans le combobox
Set c = zone.Find(cbxNom.Value, lookat:=xlWhole)
' si le nom est trouvé
If Not c Is Nothing Then
'on efface les données sur les colonnes
.Cells(c.Row, 3).Resize(, 20).SpecialCells(2, 23) = ""
With cbxNom
.RemoveItem (.ListIndex): .ListIndex = -1
End With
End If
End With
End Sub
2)
VB:
Private Sub UserForm_Initialize()
Dim DerLign As Long, f As Worksheet
Dim Plg As Range
Set f = Feuil1
For Each c In f.Range("D2:D" & f.Cells(Rows.Count, 4).End(xlUp).Row)
If Not IsEmpty(c) Then cbxNom.AddItem c.Value
Next c
''''cbxNom.List = Range("D2:D54").Value
cbxSex.List = f.Range("X2:X3").Value
cbxCivil.List = f.Range("Z2:Z4").Value
cbxCat.List = [echelon].Value
cbxRegime.List = f.Range("X56:X58").Value
cbxModePaie.List = f.Range("X5:X6").Value
cbxType.List = f.Range("Z6:Z7").Value
cbxEchel.Column = [categorie].Value
End Sub
Je te laisse voir le confort que cela apporte
Puis ensuite le petit désagrément que cela apporte aussi
(puisqu'il faut alors continuer à remanier le reste de ton code) sinon il y a du décalage dans l'air