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
 

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
 

Pièces jointes

  • mapomme- LigneVide- v1.xlsm
    19.5 KB · Affichages: 15

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:

kinguepat

XLDnaute Nouveau
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

Bonjour Staple 1600
dans mon message #6, j'ai fais mention de ce que ta solution fonctionne. j'ai adapté ta proposition à mon fichier. Merci encore
 

kinguepat

XLDnaute Nouveau
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
Merci encore une fois de plus Staple 1600.
Je teste et reviens vers vous
 

kinguepat

XLDnaute Nouveau
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
 

Pièces jointes

  • Test.xlsm
    46.2 KB · Affichages: 3

Staple1600

XLDnaute Barbatruc
Bonjour le fil, kinguepat, job75, mapomme

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
 

kinguepat

XLDnaute Nouveau
Je n'étions point le seul à apporter ma pierre à l'édifice ;)

Ah oui tu as raison. vous vous y êtes mis tous en apportant des éclaircis.

Si j'ai bien compris ta dernière question, ta macro ainsi modifiée donne-elle le résultat escompté?

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.

Au plaisir de vous relire :)
 

kinguepat

XLDnaute Nouveau
Super!!!!!! o_Oo_O
ça fonctionne!

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
 

Staple1600

XLDnaute Barbatruc
Re

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 ;)
 

Discussions similaires

Statistiques des forums

Discussions
311 730
Messages
2 081 991
Membres
101 856
dernier inscrit
Marina40