TabBDCréditBudgétaires de la feuille BD budgets primitifs
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Bonjour à toutes et à tous,
Dans ce fichier, un petit problème qui entraîne une erreur de global a échoué : dans le tableau structuré TabBDCréditsBudgétaires, le nom de la dernière colonne change : un o (ou un zéro) au lieu de Numéro création. J'ai pensé à quelque chose : dans ce fichier, la première ligne remplie est en 5; dans le fichier original, elle est en 4. Donc dans derlig_T1, partout où il y a 4, il faut que je le remplace par 5 (y compris dans les sh: O4 devra être remplacé par O5). Je testerai demain. Personnellement, je n'y crois pas trop car, à mon avis d'idiot, d'imbécile, de connard invétéré, cela devrait jouer également sur le titre des autres colonnes.
D'avance merci à celle (s), à celui (ceux) qui pourront me résoudre ce petit problème.
B onnes soirée et continuation à toutes et à tous. Prenez bien soin de vous.
Bonjour,
Effectivement, l'adressage commence en ligne 4 au lieu de la ligne 5.
Seules les deux dernières lignes de ce code sont concernées pour corriger cette erreur.
Au long de ton code, tu fais référence au tableau et, tout d'un coup, tu utilises d'adressage direct des cellules. Les tableaux de ton fichier test et du fichier original ne commençant pas à la même ligne, l'adressage direct aux cellules pose problème.
Ne serait-il pas préférable de remonter le tableau en supprimant une ligne au-dessus du tableau dans le fichier test pour le rendre plus semblable au fichier d'origine ???
Private Sub RenuméroterTabBDCréditsBudgétaires()
Dim DerLig_T1 As Long 'T1 pour le premier tableau structuré de la feuille BD budgets primitifs, ici TabBDCréditsBudgétaires.
'On Error : Valide une routine de gestion d'erreur et définit son emplacement au sein d'une procédure ; cette instruction permet également d'invalider une routine de gestion
'd'erreur préalablement validée. On Error Resume Next : Lorsqu'une erreur d'exécution survient, le contrôle est transmis àl'instruction qui suit immédiatement celle où l'erreur
's'est produite et l'exécution continue. Il est recommandé d'utiliser cette information plutôt que l'instruction On Error GoTo pour accéder à des objets.
On Error Resume Next
'ListObject.DataBodyRange : Cette propriété renvoie un objet Range qui représente la plage de valeurs, à l'exception de la ligne d'en-tête dans une table. Type de données en
'lecture seule.
DerLig_T1 = sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Rows.Count + 3 '3 : trois lignes depuis le début de la feuille jusqu'à la ligne du nom des colonnes
'comprises
If DerLig_T1 = 0 Then DerLig_T1 = 5
'Range.Row : Cette propriété renvoie le numéro de la première ligne de la première zone de la plage. Type de données Long en lecture seule.R = Row, C = Column (Colonne).
'Ici, la plage active est sh04.Range ("O4:O" & DerLign_T1),c'est-à-dire toutes les lignes de la colonne O du tableau T1 sur laquelle on applique cette formule. =if([@[Code caté-
'gorie]]<>R[-1]C[-13] : le début de la formule dit ceci : pour chaque cellule de la colonne Catégorie, si elles sont différentes des cellules situées R[-1], soit une ligne au-dessus et,
'C[-13], treize colonnes situées avant. Explication : la colonne "Catégorie" du tableau T1,TabBDCréditsBudgétaires, est en colonne A, et pour chaque cellule de cette colonne,
'compare avec le contenu de la cellule située une ligne au-dessus de la colonne "Catégorie" du tableau structuré T1, TabBDCréditsBudgétaires, si c'est la même catégorie, a-
'lors on augmente le numéro de création de 1, s'il est différent alors on lui attribue le numéro zéro.Pour une question de rapidité d'exécution, la formule est appliquée en une seu-
'le fois sur toute la colonne concernée, puis on remplace la formule par les valeurs trouvées avec cette ligne "sh04.Range("O4:O" & DerLig_T1).value=sh04.Range("O4:O" &
'DerLig_T1).Value". C'est ce principe qui est appliqué pour toutes les renumérotations. Range.Formula : Cette propriété renvoie ou définit une valeur de type Variant qui repré-
'sente la formule de l'objet dans une notation de style A1 et dans la langue de la macro. Countif : Compte le nombre de cellules à l'intérieur d'une plage qui répondent aux cri-
'tères donnés. -13 : treizième colonne après la colonne "Code catégorie" tu tableau structuré T1, TabBDCréditsBudgétaires, (y compris, éventuellement, les colonnes vides).
'O : nom de la colonne concernée dans le tableau T1, TabBDCRéditsBudgétaires, ici Numéro création. 4 : ligne où figurent les premières données dans ledit tableau structuré.
'' sh04.Range("O4:O" & DerLig_T1).FormulaR1C1 = "=if([@[Code catégorie]]<>R[-1]C[-13],[@[Code catégorie]]&""-01"",[@[Code catégorie]]&""-""&text(countif(R3C[-13]:RC[-13],[@[Code catégorie]]),""00""))"
'' sh04.Range("O4:O" & DerLig_T1).Value = sh04.Range("O4:O" & DerLig_T1).Value
sh04.Range("O5:O" & DerLig_T1).FormulaR1C1 = "=if([@[Code catégorie]]<>R[-1]C[-13],[@[Code catégorie]]&""-01"",[@[Code catégorie]]&""-""&text(countif(R3C[-13]:RC[-13],[@[Code catégorie]]),""00""))"
sh04.Range("O5:O" & DerLig_T1).Value = sh04.Range("O5:O" & DerLig_T1).Value
End SubBiz
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Bonjour Bizarre,
Merci pour ton aide qui confirme bien ce que je pensais. Le plus simple, effectivement, sera de supprimer une ligne au-dessus du tableau.
bonjour le fil,
avec un tableau structuré, il ne faut pas savoir grand chose, on n'utilise que le "databodyrange" et comme ici on veut compter à partir de l'entête, on soustrait 1. Je n'ai pas testé cela dans l'userform, donc si vous prenez la partie entre "With" et "End With", cela doit fonctionner ...
Maintenant, vous pouvez déplacer ce tableau autant que vous voulez.
Sub RenuméroterTabBDCréditsBudgétaires2()
With Sheets("BD budgets primitifs").ListObjects("TabBDCréditsBudgétaires") 'ce tableau
If .ListRows.Count Then 'il n'est pas vide
With .ListColumns("0").DataBodyRange 'cette colonne
.FormulaR1C1 = "=if([@[Code catégorie]]<>R[-1]C[-13],[@[Code catégorie]]&""-01"",[@[Code catégorie]]&""-""&text(countif(R" & .Row - 1 & "C[-13]:RC[-13],[@[Code catégorie]]),""00""))" 'formule (avec correction, si on la déplace)
.Value = .Value 'remplacer par valeur
End With
End If
End With
End Sub- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Bonjour BsAlv,
Merci pour votre aide.
Juste une petite précision : .Value = .Value 'remplacer par valeur C'est le programme qui remplace ou c'est à moi de mettre quelque chose ? Si c'est à moi, que dois-je mettre ? Que se passe-t-il si le tableau est vide (je vais une erreur du genre with in non défini ou quelque chose de ce goût-là, je ne me souviens pas de l'expression exacte) ?
D'avance merci pour votre réponse.
c'est le programme qui remplace la formule par son résultat
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
@BsAlv,
J'ai une erreur sur cette ligne : with .listColumns("O").DataBodyRange : l'indice n'appartient pas à la sélection. J'ai essayé avec la lettre O, avec le chiffre zéro mais toujours le même message d'erreur.
Private Sub RenuméroterTabBDCréditsBudgétaires()
With Sheets("BD budgets primitifs").ListObjects("TabBDCréditsBudgétaires")
If .ListRows.Count Then
With .ListColumns("O").DataBodyRange
.FormulaR1C1 = "=if([@[Code catégorie]]<>R[-1]C[-13],[@[Code catégorie]]&""-01"",[@[Code catégorie]]&""-""&text(countif(R3C[-13]:RC[-13],[@[Code catégorie]]),""00""))"
.Value = .Value
End With
End If
Bonjour,
Un essai : en utilisant le nom de l'entête de la colonne du tableau, au lieu d'utiliser l'indicatif naturel de la colonne de la feuille Excel.
Ainsi, théroriquement, le tableau peut être déplacé sans provoquer d'erreur dans l'exécution du code.
Sub RenuméroterTabBDCréditsBudgétaires()
With Sheets("BD budgets primitifs").ListObjects("TabBDCréditsBudgétaires") 'ce tableau
If .ListRows.Count Then 'il n'est pas vide
'' With .ListColumns("O").DataBodyRange ' << correction de Biz
With .ListColumns("Numéro création").DataBodyRange 'cette colonne
.FormulaR1C1 = "=if([@[Code catégorie]]<>R[-1]C[-13],[@[Code catégorie]]&""-01"",[@[Code catégorie]]&""-""&text(countif(R" & .Row - 1 & "C[-13]:RC[-13],[@[Code catégorie]]),""00""))" 'formule (avec correction, si on la déplace)
.Value = .Value 'remplacer par valeur
End With
End If
End With
End SubBiz
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Merci. Plus de message d'erreur. Une dernière question : là, j'ai supprimé la ligne qui précède mon tableau. Si je garde le tableau original que j'avais joint hier (une ligne vide avant le tableau), d'après ce que je crois avoir compris, cela marchera également ? Réponse oui. Je viens de tester.
Bonjour,
Oui, bien sûr que cela va fonctionner.
En revanche, tu utilises l'objet tableau partout ou presque (je n'ai pas tout regardé) et hop! tout d'un coup, tu déroges et utilises une autre façon d'adresser l'information.
Perso, ça me chagrine.
Biz
re,
encore plus facile, avec 15, le numéro de la colonne dans votre tableau (pas nécessairement la 15eme colonne de la feuille, le tableau commence pas toujours dans la colonne A), donc oubien c'est index de la colonne ou le nom exacte de la colonne
With .ListColumns(15).DataBodyRange 'cette colonne- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
@Bizarre,
Ce n''est pas moi qui ait créé le programme : il est issu de différentes personnes. Je reste ouvert à toutes propositions qui pourrait simplifier le code et alléger son poids mais en donnant les résultats souhaités.
@BsAlv,
Je vais tester. Effectivement, pour les autres tableaux structurés à venir, ils ne commenceront pas dans la colonne A. Pour la génération des tableaux structurés, si une bouton de commande unique était possible avec, dans le module MGénérerTablesBudgets, l'utilisation de select case d'après Catégorie et, éventuellement, un deuxième select case d'après nature article, je suis preneur. Cela, dans un premier temps, pourrait alors réduire le nombre de feuilles : la source du remplissage des tableaux structurés serait dans une feuille unique et il n'aurait qu'un seul tableau source et de nombreux tableaux destinataires (normalement soit 32, soit 36). Le dernier tableau structuré dépendra la catégorie Budget mensuel et il aurait double tables numérotées de 1 à 12 précédée du nom du tableau structuré TabBDBudgetMensuelDépensesAlimentaires1, TabBDBudgetMensuelDépensesAlimentaires2 et ainsi de suite jusqu'à12, même principe pour les dépenses bancaires, etc. Ceci pourrait modifier le nombre de tableaux destinataires (je n'arrive pas à me rendre compte de ce que cela donnerait en quantité de tableaux destinataires).
re,
Je vous laisse entre les mains expertes d'Arturo 83 et BeGood. Je ne peux pas suivre vos spaghettis.
Bonjour à tous,
@BsAlv, c'est vrai que c'est un sac de nouilles ses fichiers, ça fait trois fois que je lui corrige sa procédure renuméroter et il ressort toujours un nouveau fichier différent.
je ne sais pas le but de ce fichier, mais je dirais "un chat n'arrive plus à retrouver ses petits".
La structure est trop compliqué et cela n'a rien à voir avec les procédures. 32 à 36 tableaux structurés, c'est un bordelle. Il faut tout simplifier vers 10 (?) ... mais je ne connais pas le contexte, donc c'est mieux que je me tais.
Bonjour à tous,
@BUDGETS,
Pourquoi n'avez-vous pas pris le fichier que je vous ai modifié là : https://forum.excel-pratique.com/s/goto/1196885
Pourquoi ressortez-vous toujours des fichiers différents avec les mêmes erreurs ?
Pourquoi, depuis près de deux mois que je vous le demande, n'avez-vous toujours pas fourni un exemple représentatif de ce que vous voulez ?
Pourquoi n'êtes-vous pas capable de donner le nombre de tableaux que comprendra votre application ?
etc ...
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Bonjour BeGood,
Pour la simple raison que je souhaiterais que la partie budget primitif dépenses alimentaires soit au point. Pour moi, cela sera plus facile de répondre à vos questions. D'autre part, je sais, je me doute qu'il serait possible d'alléger ce programme, de réduire le poids du fichier mais, malgré mes questions sur ce sujet, je n'ai toujours reçu de réponses à mes suggestions. Dans le fichier joint, regarder la dernière feuille (Budgets) dans laquelle je fais des suggestions, des propositions. Merci de me dire si cela est réaliste, faisable, codifiable. quelle (s) solution (s) serait (seraient) la plus adaptée (s) ?
Re,
Allez donc, et un autre fichier, un !
malgré mes questions sur ce sujet, je n'ai toujours reçu de réponses à mes suggestions
Comment voulez-vous qu'on vous réponde, si vous ne donnez pas d'exemple de ce qui est attendu.
regarder la dernière feuille (Budgets) dans laquelle je fais des suggestions, des propositions
Ce n'est pas le tout de donner les en-têtes d'un nouveau tableau, mais il faudrait que vous décriviez les enchaînements entre BP, BDM1, BDM2, BM, lors des créations, modifications, suppression. Ce que je vous demande depuis deux mois en somme.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
Saisie des données à partir du formulaire UF02CréditBudgétaires, dans n'importe quel ordre, clic sur Validation : ce clic sur Validation pourra 1) signaler que le crédit budgétaire existe déjà et que je peux le modifier ou le supprimer; 2)crédit budgétaire inexistant : alors il transfère les données dans la feuille Budgets, tableau structuré tabBDCrédits; 3) la procédure Private sub cmdValidation_Click comprendra trois appels uniquement pour le tableau structuré TabBDCrédits : a)trier; b) renuméroter; c)générer. Le tableau structuré TabBDCrédits rempli, certaines de ses informations seront envoyées dans des tableaux destinataires (TabBDBudgetprimitifDépensesAlimentaires, TabBDBudgetPrimitifDépensesBancaires, etc. ainsi de suite pour tout ce qui concerne Budget primitif; Ces tableaux destinataires, dépendants du tableau structuré source, n'auront plus de boutons de commande pour trier ou renuméroter; par contre, si absolument nécessaire, ils auront un bouton de commande générer). Pour les tableaux destinataires DM1, DM2 et budget mensuel, j'y reviendrai plus tard si le besoin s'en fait sentir (suivant ce que les procédures budget primitif contiendront, je pourrais peut-être écrire les procédures seul). Voilà des premières explications pour ce qui concerne les tableaux structurés destinataires budget primitif.
Au vu de ces premières informations, pensez-vous pouvoir répondre aux suggestions contenues dans un précédent message : utilisation de Select case ou pas, utilisation ou pas de caches à cocher, de boutons d'options ?
Le tableau structuré TabBDCrédits servira de source également pour les tableaux structurés Budgets DM1 (8 tableaux structurés), Budgets DM2 (8 tableaux structurés), Budgets mensuels (8 tableaux structurés et, pour chacun d'eux, 12 tables numérotées de 1 à 12 incluses)..
Bonjour,
Donc vous partez une nouvelle fois sur un autre fichier ?
Vous ne dites toujours rien des enchaînements entre BP, BDM1, BDM2, BM, lors des créations, modifications, suppression. peut-être ne savez-vous pas vous-même ce qu'il doit en être ? Alors nous, vous pensez bien !
Qu'est-ce qui vous empêche d'en commencer le codage ?
Vous voulez utiliser des caches à cocher, des boutons d'options, pour quoi ?