Un objet avec une case à cocher importé d'1 autre classeur
Bonjour,
Ce bouton "PDF", comme tous les autres, provient d'un autre classeur (qui fonctionne d'ailleurs parfaitement) mais quand je clique dans ce nouveau classeur sur le bouton "PDF", l'objet "Saisie" n'est pas trouvé quand je fais le débogage.
Or l'objet est bien présent.
Autre chose. J'ai un peu changé la box "saisie" en renommant les épreuves. Il n'y en a plus 11 mais 8 ce coup-ci.
Mais je ne sais pas comment modifier le ou les modules associés à ce bouton pour que ça donne des sauvegardes en pdf dans le style suivant (voir capture ci-dessous), dans l'ordre décroissant de la colonne "CLT1"
Là il s'agissait de l'épreuve pompe (colonne "E_1") dans l'autre classeur ==>
L'ancienne box :
LA nouvelle :
Sur le bouton "Débloquer ou Quitter", tapez vodoraix pour tt débloquer.
Et mot de passe pour débloquer les feuilles ==> seb
MErci à vous
Bonne soirée
Bonjour,
quand je clique dans ce nouveau classeur sur le bouton "PDF", l'objet "Saisie" n'est pas trouvé quand je fais le débogage.
Bon, si vous déroulez la macro en pas à pas avec F8, vous vous apercevrez que l'erreur vient de la macro " Private Sub CheckboxUnique(N°)"
en effet vous avez oublié de remplacer 11 contrôles par 8 contrôles, comme ci-dessous (après correction):
Private Sub CheckboxUnique(N°) 'N° est le numéro du checkbox qu'on veut cocher !
'macro commune pour les 11 macros suivantes pour éviter plusieurs "checkboxes cochés"
For I = 1 To 8 'boucler les 8 checkboxes
With Me.Controls("CheckBox" & I) 'ce checkbox
b = (I = N°) 'drapeau c'est le checkbox voulu
If b <> .Value Then .Value = b: DoEvents 'si statut du checkbox n'est pas le statut voulu, change-le
End With
Next
End SubIl faut penser aussi à modifier les propriétés de la dernière checkbox et remplacer son chiffre de 11 par 8
Le fichier corrigé:
Cdlt
Bonjour Arturo83 et merci beaucoup, une nouvelle fois
Ce que tu m'écris, je l'avais vu et en tentant plusieurs modifs, on arrivait à des bugs du style, toutes les colonnes à droite de "G" sont masquées.
Ca vient peut-être du fait que dans l'autre classeur, j'avais 2 colonnes de plus (en "I"= Poids et "J"=Taille)
Je vais continuer à explorer et à faire des essais car le code est compliqué à déchiffrer pour moi...
Et dans propriétés de l'objet, je n'ai pas trouvé le 11 à remplacer par le 8 :
En tout cas, merci beaucoup pour ta précieuse aide et tes explications, on avance, on avance
Bonne journée
Désolé je rentre chez moi à peine...
Checkbox8, tu avais déjà fait, merci
Bonne soirée et merci à toi
J'ai trouvé une autre erreur avec la variable r2 sur la colonne "date_" qui n'existe plus sur ce classeur.
Et qui serait à remplacer par "Essai_" sur les 3 premières et la 5ème épreuve et "Pts_" sur la 4ème, 6ème et 7ème épreuves.
For k = 8 To 1 Step -1 'boucler les checkboxes de 8 à 1
If Me.Controls("CheckBox" & k).Value = True Then 'il est coché ?
Cnt = Cnt + 1 'compteur+1
If k <= 7 Then 'checkbox d'une épreuve
r1 = Application.IfError(Application.Match("E_" & k, .HeaderRowRange, 0), 0): If r1 = 0 Then MsgBox "problème avec épreuve " & k: Exit Sub 'listcolumn début de cette épreuve
r2 = Application.IfError(Application.Match("date_" & k, .HeaderRowRange, 0), 0):: If r2 = 0 Then MsgBox "problème avec date " & k: Exit Sub 'listcolumn fin de cette épreuve
r3 = Application.IfError(Application.Match("CLT" & k, .HeaderRowRange, 0), 0):: If r3 = 0 Then MsgBox "problème avec CLT" & k: Exit Sub 'listcolumn du classement de cette épreuveMAis je ne sais pas comment réécrire ce code
Bonne soirée et merci de me lire
Bonjour,
Pas sûr d'avoir bien répondu, vu que je ne suis pas à l'origine du code, je n'ai pas testé car, pas compris le fonctionnement et le résultat attendu, mais voici quand même ma proposition:
La partie modifiée est entre les 2 lignes d'astérisques.
J'ai réorganisé quelque peu le code pour une meilleure lisibilité, en effet, à l'écriture en ligne des tests avec conditions du genre:
"IF ... THEN .... : ELSE ....."
je préfère l'écriture conventionnelle:
IF .......
...................................
Else
...................................
End If
Certes, ça prend plus de place, mais tout est bien séparé et est beaucoup plus clair à déchiffrer, surtout quand on ne maîtrise pas le VBA.
Si ma proposition ne répond pas exactement à vos attentes, je pense qu'avec ce nouvel affichage, vous serez plus en mesure de vous dépanner tout seul.
Private Sub Masquer()
Dim k, r1, r2, b, r, r3, cle
With Range("tabel1").ListObject 'votre tableau
'.Range.AutoFilter 'enlever les filtres
.Range.EntireColumn.Hidden = False 'montrer toutes les colonnes du tableau
' .Range.Columns(1).BorderAround LineStyle:=xlContinuous, Weight:=xlThick, ColorIndex:=3
MFC 'mettre à jour toutes lesMFCs
.Range.EntireColumn.Hidden = True 'cacher toutes les colonnes du tableau
I = .ListColumns("E_1").Index 'numéro de la Listcolumn "E_1", donc première épreuve
.Range.Resize(, I - 1).EntireColumn.Hidden = False 'montrer les listcolumns à partir de la 2eme jusqu'à la colonne avant "épreuve 1"
.Range.Cells(1, .Range.Columns.Count).ColumnWidth = 0.1
Cnt = 0
For k = 8 To 1 Step -1 'boucler les checkboxes de 8 à 1
If Me.Controls("CheckBox" & k).Value = True Then 'il est coché ?
Cnt = Cnt + 1 'compteur+1
If k <= 7 Then 'checkbox d'une épreuve
r1 = Application.IfError(Application.Match("E_" & k, .HeaderRowRange, 0), 0)
If r1 = 0 Then
MsgBox "problème avec épreuve " & k
Else
Exit Sub 'listcolumn début de cette épreuve
End If
'***********************************************************************************
If k <= 3 Or k = 5 Then
r2 = Application.IfError(Application.Match("Essai_" & k, .HeaderRowRange, 0), 0)
If r2 = 0 Then
MsgBox "problème avec Essai " & k
Else
Exit Sub 'listcolumn fin de cette épreuve
End If
ElseIf k = 4 Or k >= 6 Then
r2 = Application.IfError(Application.Match("Pts_" & k, .HeaderRowRange, 0), 0)
If r2 = 0 Then
MsgBox "problème avec Pts " & k
Else
Exit Sub 'listcolumn fin de cette épreuve
End If
End If
'***********************************************************************************
r3 = Application.IfError(Application.Match("CLT" & k, .HeaderRowRange, 0), 0)
If r3 = 0 Then
MsgBox "problème avec CLT" & k
Else
Exit Sub 'listcolumn du classement de cette épreuve Else 'pour classement général
End If
r2 = .ListColumns.Count - 1 'listcolumn fin = avant-dernière listcolumn du tableau
r1 = r2 - 3 'listcolumn du début = 2 vers gauche
r3 = r2 - 1 'listcolumn classement est égal à r2-1
End If
.HeaderRowRange.Cells(1, r1).Resize(, r2 - r1 + 1).EntireColumn.Hidden = False 'montrer cette épreuve
If k = 11 Then
Nom_Epreuve = "Classement"
Else
Nom_Epreuve = .HeaderRowRange.Cells(0, r1).Value2 'nom de l'épreuve à utiliser dans le nom du PDF
End If
' sp = Split(.HeaderRowRange.Cells(2, r1).FormulaR1C1, ",") 'formule utilisée pour créer le rang
' Cle =iif(sp(ubound(sp)) like "1)*", xlDescending
' Case Else: Cle = xlAscending 'les autres ascending
' End Select
If r3 > 0 Then 'listcolumn "classement" est connue
With .Range
.Sort .Cells(1, r3), xlAscending, Header:=xlYes 'trier colonne classement "ascendant" ou "descendant"
End With
End If
.Range.AutoFilter r1, "<>" 'cacher toutes les lignes avec une cellule vide dans la première colonne de cette épreuve
End If
Next
End With
End SubCdlt
Bonjour Arturo83.... Et merci beaucoup, vraiment, des explications détaillées, j'ai essayé de comprendre chaque ligne explicative dont cette partie ci-dessous.
J'ai juste corrigé ton k=11 en k=8
C'est exactement ça, pour limiter la fin de la plage de sélection
Le début de la plage est également bien visée puisqu'on a bien "E_1" pour r1
Et pourtant elle est masquée :
Il manque cette plage ==>
En tout cas des erreurs peuvent provenir de ces 3 lignes :
r2 = .ListColumns.Count - 1 'listcolumn fin = avant-dernière listcolumn du tableau
r1 = r2 - 3 'listcolumn du début = 2 vers gauche
r3 = r2 - 1 'listcolumn classement est égal à r2-1
r1 n'est pas toujours égale à r2 - 3 ==> pas pour épreuves 1, 2, 3 & 5 (c'est r2 - 4). Mais ça n'explique pas les colonnes masquées
Je continue d'essayer de comprendre...
En tout cas merci beaucoup pour tout le temps que tu m'as consacré !!!!
Bon w.e.
Comme je ne suis pas à l'origine du code, je ne peux pas tout l'étudier et le décortiquer pour savoir comment il fonctionne, je ne peux que répondre à quelques questions que vous vous posez, pour plus de détails, il faut s'adresser directement à celui qui l'a développé, (ce serait plus simple)
Quant à la ligne suivante:
"Nom_Epreuve = .HeaderRowRange.Cells(0, r1).Value2 'nom de l'épreuve à utiliser dans le nom du PDF"
la variable "Nom_Epreuve correspond au titre de la colonne r1 qui est issue de la ligne un peu plus haut dans le code:
r1 = r2 - 3 'listcolumn du début = 2 vers gauche.
Encore merci beaucoup pour tout
Donc c'est bien l'entête du nom de l'épreuve de la colonne dans le tableau. Surement la zone qui est mal pointée...
Bon w.e.

