VBA si cellule vide

Bonjour,

J'aurai besoin de compléter légèrement un code VBA mais je ne trouve pas...

J'ai une macro qui me permet de reporter dans les cellules vides de la colonne A la date que je mets en H3 (je viens coller chaque jour plein de données en colonne B et ça va plus vite pour mettre la date dans toutes les cellules).

Mon soucis c'est que si je n'ai pas de cellules vides en colonne A dans le tableau, alors soit ça vide tout si pas de date en H3, soit ça reporte partout la date en H3.

Quel serait un code pour dire : si pas de cellules vides dans la colonne A du tableau alors on ne fait rien (ou au pire une messagebox pour dire qu'il n'y a pas de date à reporter).

Merci d'avance pour votre aide.

12compilation-v1.xlsm (26.92 Ko)

Bonsoir,

c'est relativement simple :
Vous faites un filtre sur les cellules vides, dans votre exemple il n'y en a aucune.
C'est peut-être ce qui fait que VBA travaille avec la colonne entière au lieu du résultat du filtre :

With Range("t_datas_CA[Date]")
Une proposition de correction avec SpecialCells() :
  'met la date de la cellule V2 dans les cellules vides de la colonne V du tableau
  On Error Resume Next
    With Range("t_datas_CA[Date]").SpecialCells(xlCellTypeVisible)
      .Value2 = [dateExtract1].Value2
      .NumberFormat = "ddd dd mm yy"
    End With
  On Error GoTo 0

Avec une gestion d'erreur (c'est pas beau !) car s'il n'y a aucune cellule visible suite au filtre cela engendre une erreur...

@ bientôt

LouReeD

Bonjour à tous ,

Une autre proposition.

Private Sub CommandButton1_Click()
Dim ladate, lsto As ListObject, t, i&
   Set lsto = Worksheets("Datas_CA").ListObjects(1)         ' le tableau structuré
   ladate = lsto.HeaderRowRange(1, lsto.ListColumns.Count)  ' la date pour remplir les cellules vides
   If lsto.ListRows.Count = 0 Then Exit Sub                 ' si le tableau est vide, on quitte
   lsto.Range.AutoFilter: lsto.Range.AutoFilter             ' tout afficher
   t = lsto.ListColumns(1).Range                      ' tableau des valeurs de la 1ère colonne (date)
   For i = 2 To UBound(t): t(i, 1) = IIf(t(i, 1) = "", ladate, t(i, 1)): Next    ' boucle de remplissage
   lsto.ListColumns(1).Range.Value2 = t                     ' on rebascule t sur le tableau structuré
End Sub

Attention ! La date que vous avez en H3 n'est pas une date mais c'est du texte ! Les en-têtes de tableau structuré sont toujours convertis en texte par Excel. D'ailleurs, AMHA, avoir un champ variable comme en-tête de champ n'est pas une bonne idée. La preuve ? Vous avez été obligé de nommer la cellule H3 alors qu'elle devrait être repérable simplement par son nom (en-tête) mais comme le nom du champ varie... Si la date est toujours l'en-tête de la dernière colonne, on peut s'en sortir sans nommer la cellule (voir le code ci-dessus).

Bonjour, merci beaucoup pour vos retours et conseils, les 2 solutions fonctionnent.

bonne journée.

Bonsoir,

merci @ vous pour votre retour et vos remerciements !

@ bientôt

LouReeD

Bonsoir,

une petite nuance de mon code afin de ne pas utiliser le "On Error Resume Next" :

' met la date de la cellule V2 dans les cellules vides de la colonne V du tableau
Set Plage = Range("t_datas_CA[Date]").SpecialCells(xlCellTypeVisible)
If Not Plage Is Nothing Then
      Plage.Value2 = [dateExtract1].Value2
      Plage.NumberFormat = "ddd dd mm yy"
End With

On attribue la plage de cellule vide à Plage, si Plage est non rien (donc il y a au moins une cellule) alors on inscrit la valeur et le format.

@ bientôt

LouReeD

Rechercher des sujets similaires à "vba vide"