Philippe Tulliez, oui, d'accord avec vous. Sorry
Version imprimable
Philippe Tulliez, oui, d'accord avec vous. Sorry
Bonjour Olivier,
Maintenant que j'ai été formaté à l'utilisation des Tableaux Structurés, je ne pourrai que t'en vanter les avantages, et le premier est de ne pas avoir à définir la dernière ligne :)
En partant du postulat que l'on renomme ton tableau "t_data" pour l'exemple.
Désolé pour la réponse tardive, mon message était en cours d'édition depuis 10h ce matin mais j'ai eu quelques impératifs. Je poste quand même mon message au cas où ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Private Sub Comptage() Dim Wb As ThisWorkbook Dim WbO As Worksheet Dim t As ListObjects Dim CBlank As Integer Set WbO = Wb.Sheets(1) Set t = WbO.ListObjects("t_data") CBlank = t.ListColumns(8).DataBodyRange.SpecialCells(xlCellTypeBlanks).Count If t.ListColumns(7).DataBodyRange.Count = t.DataBodyRange.Rows.Count And t.ListColumns(6).DataBodyRange.Specialcells(xlCellTypeBlanks).Count <> t.DataBodyRange.Rows.Count Then 'Suite de la procédure End if End Sub
Bonjour,
J'ai modifié mon code qui fonctionne super :
Code:
1
2
3
4
5
6 Sub Bouton10_Cliquer() Dim Der_L&, Nb_Cel_vides& Der_L = Cells(Rows.Count, 1).End(xlUp).Row Nb_Cel_vides = Application.CountBlank(Range("G2:G" & Der_L)) MsgBox Nb_Cel_vides & (" Retours vides") End Sub
J'aimerais, pour un autre tableau, modifier ce code pour stipuler que la colonne "G" doit être vide et que la colonne "E" ne doit PAS être vide.
Des idées ?
Merci.
Bonne journée
Bonjour,
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Private Sub Comptage() Dim Wb As ThisWorkbook Dim WbO As Worksheet Dim t As ListObjects Dim CBlank As Integer Set WbO = Wb.Sheets(1) Set t = WbO.ListObjects("t_data") CBlank = t.ListColumns(7).DataBodyRange.SpecialCells(xlCellTypeBlanks).Count If CBlank = t.DataBodyRange.Rows.Count And t.ListColumns(5).DataBodyRange.Specialcells(xlCellTypeBlanks).Count <> t.DataBodyRange.Rows.Count Then 'Si le nombre de cellules vides en colonne G = nombre de lignes du tableau ET nombre de cellules vides en colonne E différent du nombre de lignes du tableau alors... 'Suite de la procédure End if End Sub
Merci mais problème :
pour info, ma feuille s'appelle "FACTURES"Citation:
Erreur d'exécution '91
Variable objet ou variable de bloc With non définie.
J'ai modifié le nomCode:Set t = WbO.ListObjects("FACTURES")
C'est dans Wb.Sheets("FACTURES") pas dans ListObjects ;) ListObjects représente dans le cas présent le tableau t_data
voici ce que j'ai :
Code:
1
2
3 Set WbO = Wb.Sheets("FACTURES") Set t = WbO.ListObjects("t_data")
Toujours le même problème
A quelle ligne apparaît l'erreur ?
Si jamais, remplace Wb par ThisWorkbook. Déjà eu l'erreur sur un autre fichier, alors que sur mon fichier de travail cela fonctionne très bien. Je ne sais pas pourquoi :aie:
cela ne fonctionne pasCode:
1
2
3
4
5 Set WbO = ThisWorkbook.Sheets("FACTURES") Set t = WbO.ListObjects("t_data") CBlank = t.ListColumns(8).DataBodyRange.SpecialCells(xlCellTypeBlanks).Count
Erreur sur la ligneCode:Set t = WbO.ListObjects("t_data")
As-tu bien renommé ton tableau "t_data" ? Via l'onglet création
Oups....
Je ne vois pas comment faire.....
Je reprends chaque année, un tableau type..... je suppose que je devrai également modifier celui-là ?
Tu vas sur n'importe quelle cellule de ton tableau, tu fais Ctrl + * , mettre sous forme de tableau, et tu le renommes en t_data (pour l'exemple).
Si chaque année ta base de données change, ce que tu peux faire c'est de les renommer chacun en "t_data_2019" , "t_data_2020" et l'utilisateur saisira l'année désirée à travers une InputBox par exemple.
De cette manière, le code ira chercher les données dans le tableau de l'année choisie. Attention à ce que tous tes tableaux "t_data" aient les mêmes colonnes.Code:
1
2
3
4
5 Dim Annee As Integer Annee = InputBox("Veuillez saisir une année") Set t = WbO.ListObjects("t_data_" & Annee)
j'ai renommé le tableau
Toujours erreur code :Code:Set t = WbO.ListObjects("t_data")
Essaie en remplaçant WbO par ThisWorkbook.Sheets("FACTURES") ? - en toute logique l'erreur devrait se poursuivre mais ne sait-on jamais !
Auquel cas... Je ne saurai pas t'expliquer la raison... A moins que tu partages ton fichier de travail, si cela t'est bien évidemment autorisé et que rien de confidentiel n'y figure.
voici mon code :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub FACTURES_Bouton10_Cliquer() Dim Wb As ThisWorkbook Dim WbO As Worksheet Dim t As ListObjects Dim CBlank As Integer Set WbO = ThisWorkbook.Sheets("FACTURES") Set t = WbO.ListObjects("t_data") CBlank = t.ListColumns(8).DataBodyRange.SpecialCells(xlCellTypeBlanks).Count If CBlank = t.DataBodyRange.Rows.Count And t.ListColumns(5).DataBodyRange.SpecialCells(xlCellTypeBlanks).Count <> t.DataBodyRange.Rows.Count Then 'Si le nombre de cellules vides en colonne G = nombre de lignes du tableau ET nombre de cellules vides en colonne E différent du nombre de lignes du tableau alors... 'Suite de la procédure End If MsgBox (" Retours vides") End Sub
Oups ! Dim t As ListObject (sans le s) - par contre laisse le S à ListObjects dans la ligne Set.
Aucun calcul ne se fait.
Je te joins mon tableau.
Le code est sur le" bouton10"
(Le bouton "Retours vides "est pour un autre type de code mais ça c'est autre chose..... autre problème de code)
Tu as stipulé "Colonne G Vide" et "Colonne E Non vide" - Ne serait-ce pas plutôt les cellules ?
Affichera 0 - puisqu'il n'y a aucune ligne ayant E vide ET G contenant quelque chose. J'ai testé en inscrivant 317 en E2, le code retournait 1 ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Sub FACTURES_Bouton10_Cliquer() Dim Wb As ThisWorkbook Dim WbO As Worksheet Dim t As ListObject Dim CBlank As Integer Dim Cible As Range Set WbO = ThisWorkbook.Sheets("FACTURES") Set t = WbO.ListObjects("t_data") For Each Cible In t.ListColumns(4).DataBodyRange If Cible.Offset(0, 1).Value <> "" And Not Cible.Offset(0, 3).Value <> "" Then CBlank = CBlank + 1 End If Next Cible MsgBox CBlank & (" Retours vides") End Sub
OK, un super grand merci. :)
Tout fonctionne.
Je pense que je vais renommer mon fichier original en t_data (cela sera plus facile)
Je vois pour trouver un code pour le bouton" Retours vides" - j'ai mis un autre post sur le forum.
Bonne fin de journée