Compléter un tableau selon différents critères
Résoludanielc0 Messages postés 1856 Date d'inscription Statut Membre Dernière intervention -
- Comment créer un tableau sur excel
- Comment créer un groupe whatsapp - Guide
- Trier un tableau excel - Guide
- Créer un compte google - Guide
- Tableau word - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
12 réponses
Bonjour,
Une macro dans quoi ?
Sur une base de données on utiliserait un ordre sql comme "select * from mvt where compte like "602%" and compte not like "60266%" "
Bonjour,
C'est un tableau type que je complète d'ordinaire en saisissant les données cases par cases.
Je souhaite que la saisie ne soit plus manuelle mais grâce à une macro.
Comme chaque ligne un compte est défini (602, 6021,6022, 6023, .. , 606, 6066, 61, ...)
Je ne sais pas si c'est possible et comment penser la chose.
Merci
Bonjour,
Je me suis fait jeter dans ma réponse précédente pour une raison qui m'échappe, elle va peut-être ressusciter, Wait and See.
On suppose qu'il s'agit d'un plan comptable dont on veut exclure les comptes en question et dont on ne sait pas pourquoi s'ils sont incrémentés, mais peu importe.
Dans cette hypothèse, il y a aura plusieurs opérations 60266 voire 60266(n) où n vaut de 1 à 9.
Une solution serait peut-être un filtre Power Query sur le mode:
Table.SelectRows(#"Previous Step", each [Column Name] < "60266" or [Column Name] > "602669"),
j'ai eu le même soucis de commentaire non validé. Il y a des problèmes sur les serveurs : https://forums.commentcamarche.net/forum/affich-38213404-dephasage-entre-les-serveurs-de-ccm On doit se retrouver dans un contexte où on fait un commentaire sur un message que le serveur au moment de la validation ne connait pas.
Ben oui, cela ressuscite ou pas et a un aspect pénible.
Au passage, en <7>, je n'ai pas été jusqu'au bout de ma pensée et je n'ai pas été bon, cela ne fonctionne que si existe seulement 60266 et pas 60266(n) puisque 602661 est plus grand que 60267 (ou si tous les comptes sont extraits avec le nombre de zéros non significatifs idoines, par exemple un compte fournisseur générique 401 deviendrait 401000).
Sinon il faut être capable de ne prendre si les caractères de la cellule commencent par 60266 que ces 5 premiers caractères avant de les convertir en nombre et de faire la comparaison, mais je suis tout sauf un expert Power Query, peut-être quelqu'un aura l'inspiration si la piste est bonne.
Hello,
Avec Power Query, il faut tout d'abord convertir en "Texte" les numéros de compte, puis effectuer un filtre sur les débuts de numéro.
Ce code pourrait le faire :
let
Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
TypeText = Table.TransformColumnTypes(Source,{{"Compte", type text}}),
Filtre = Table.SelectRows(TypeText, each Text.StartsWith([Compte], "602") and not Text.StartsWith([Compte], "60266"))
in
Filtre
Bon dimanche
C'est un tableau Excel ainsi que l extraction des informations qui sert au remplissage.
C'est une information primordiale, qu'il faudrait donner dès le départ dans la question pour avoir des réponses le plus pertinentes possible.
Je transfère la question dans le forum adéquate. Je ne suis pas spécialiste sur Excel, mais il est possible d'avoir sur une cellule une liste de valeurs pour remplir la cellule. Cette liste de valeurs peut elle être constituée par une macro ? Il y aura peut être un autre intervenant qui saura répondre.
Dans la plupart des cas un fichier exemple est plus parlant que des phrases pour expliquer le contexte. Pouvez vous donner un fichier exemple, éventuellement sans données confidentielles. Le déposer sur un site comme cijoint.org et donner ici sur le forum le lien généré sur le site pour le fichier.
Ah oui, désolée, je n’avais pas précisé qu’il s’agissait d’un fichier Excel — c’était effectivement une information clé. Je prévois de déposer les fichiers demain. Merci encore pour le temps que vous avez consacré à me faire des retours ainsi que pour vos conseils.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionRe-,
(J'ai répondu en commentaire du fil #11, mais ce n'est pas passé....)
Donc, personnellement, je comprends qu'il faut filtrer sur les comptes commençant pas 602, mais en extraire ceux commençant par 60266.
Mais je peux me tromper.. :)
Bonjour,
Voici les fichiers :
- Essai CA-Departmt.xls : https://cijoint.org/r/CDwDqUMv#gKgD4y6w5tKjovoluY1IkKHeItWAXpH026CHrZsCCeE=
(dernier délai pour télécharger : mercredi 20 août 2025 11:04)
- Extract°N pour Depmt.xlsx : https://cijoint.org/r/UEEXXG77#afwcYDi82HvOWPA9lNkyZe6YeuXdfkjDlIP0HfwCI6I=
(dernier délai pour télécharger : mercredi 20 août 2025 11:04)
Je dois compléter le fichier Excel « Essai CA-Departmt.xls » en m’appuyant sur les données du fichier « Extract°N pour Depmt ».
Je ne sais pas si c’est réalisable pour toutes les lignes de l’onglet « Cadre Budgétaire CHARGE »,
ou si certaines lignes ne pourront être renseignées que partiellement, voire pas du tout.
Étant débutant en VBA, je ne sais pas par où commencer pour structurer ce projet.
Par exemple :
Pour la cellule E2, est-ce que je dois faire remonter tous les montants associés au compte 602, puis soustraire les montants correspondant aux lignes E9 à E13 ?
Et appliquer une logique similaire pour les comptes comme 6026 / 602661 ? …
Aussi, est-ce que je dois ajouter une colonne dans le fichier de l’extraction pour reprendre les numéros de compte tout en retirant la lettre "D" (ça je sais faire) ?
Merci
Bonjour,
Dans quelle colonne du classeur "Extract°N pour Depmt.xlsx" faut-il chercher les code de la colonne B.
Daniel
Bonjour Daniel,
Dans la colonne H de préférence mais la colonne I pourrait également présenter tous les comptes apparaissant dans le classeur "Essai CA-Departmt".
Teste cette macro :
Sub Compléter() Dim Plage As Range, C As Range, Wbk As Workbook, Sh As Worksheet Dim Ligne As Long, X As Range On Error Resume Next Workbooks("Extract°N pour Depmt.xlsx").Activate If Err.Number > 0 Then MsgBox "Veuillez ouvrir le classeur " & "Extract°N pour Depmt.xlsx" Exit Sub End If Set Wbk = ActiveWorkbook With Wbk.Sheets("Feuil1") Set Plage = .Range("H2", .Cells(.Rows.Count, 8).End(xlUp)) End With ThisWorkbook.Activate With Sheets("CadreBudgétaire CHARGES") For Each C In .Range("B8", .Cells(.Rows.Count, 2).End(xlUp)) If Left(C, 3) = "602" And C <> Left(C, 5) <> "60266" Then For Each X In Plage If X = "D" & C Then C.Offset(, 3) = C.Offset(, 3) + X.Offset(, 2) C.Offset(, 4) = C.Offset(, 4) + X.Offset(, 3) C.Offset(, 6) = C.Offset(, 6) + X.Offset(, 5) End If Next X End If Next C End With End Sub
Je ne suis pas comptable. Dis-moi ce qui cloche.
Daniel
Bonjour Daniel,
Il y a deux comptes qui s'incrémentent : l'un en ligne 10 (colonnes E et H) et l'autre en ligne 12 (mêmes colonnes).
La remontée des informations fonctionne correctement.
Afin que je puisse poursuivre l’écriture de la macro, pourriez-vous m’expliquer les codes que vous utilisez
For Each C In .Range("B8", .Cells(.Rows.Count, 2).End(xlUp))
If Left(C, 3) = "602" And C <> Left(C, 5) <> "60266" Then
For Each X In Plage
If X = "D" & C Then
C.Offset(, 3) = C.Offset(, 3) + X.Offset(, 2)
C.Offset(, 4) = C.Offset(, 4) + X.Offset(, 3)
C.Offset(, 6) = C.Offset(, 6) + X.Offset(, 5)
End If
Next X
End If
Next C
et Comment je dois penser la macro ( exemple pour la ligne 18 : Filtrer directement tous les comptes commençant par 606, en excluant les sous-comptes spécifiques comme 60622, 60626, 6063, 6066,
ou bien Commencer par totaliser séparément les montants des sous-comptes 60622, 60626, 6063, 6066, puis dans un second temps, en ligne 18, calculer la somme de tous les 606 en soustrayant les montants déjà pris en compte dans ces sous-comptes détaillés ?
Je vous remercie pour l’aide que vous m’avez déjà apportée, ainsi que pour celle que vous pourrez encore m’apporter par la suite
Bonjour,
J'ai mis des commentaires dans la macro. S'il ne sont pas suffisants, n'hésite pas à poser des questions :
With Sheets("CadreBudgétaire CHARGES") 'On boucle sur les cellules de la colonne B. "C" représente 'tour à tour chaque cellule de la colonne B For Each C In .Range("B8", .Cells(.Rows.Count, 2).End(xlUp)) 'Si la cellule est égale à 602 et différente de 60266 alors... If Left(C, 3) = "602" And C <> Left(C, 5) <> "60266" Then ' "Plage" représente la colonne H de Feuil1 du classeur "Extract°N pour Depmt.xlsx" 'X représente tour àtour chaque cellule de cette colonne 'On boucle sur chaque cellule de cette plage For Each X In Plage If X = "D" & C Then 'Si la cellule de la colonne H de Feuil1 est égale 'à la cellule de la colonne B de "CadreBudgétaire CHARGES" alors : 'On ajoute le contenu de la cellule dela colonne J '(X décalée de 2 colonnes vers la droite) à la colonne E 'de "CadreBudgétaire CHARGES" (C décalé de 3 colonnes C.Offset(, 3) = C.Offset(, 3) + X.Offset(, 2) 'Même chose pour la colonne "DM" C.Offset(, 4) = C.Offset(, 4) + X.Offset(, 3) 'Même chose pour la colonne "Réalisé" C.Offset(, 6) = C.Offset(, 6) + X.Offset(, 5) End If Next X End If Next C End With
Pour ce qui est de tes questions :
"Filtrer directement tous les comptes commençant par 606, en excluant les sous-comptes spécifiques comme 60622, 60626, 6063, 6066,"
Ca dépend de ce que tu veux faire. Si tu veu conserver "606" à l'exclusion de tous les sous-comptes, teste seulement si la cellule est égale à 606. Si tu veux éliminer tout un série de comptes, par exemple ceux qui commencent par 6064, teste :
if left(x,4)="6064" then
Si tu as beaucoup d'exceptions, tu peux les entrer dans une table :
Dim Tbl(3) As Long, X As Range Set X = [A1] 'pour test Tbl(0) = 606266 Tbl(1) = 6061 Tbl(2) = 6063 Tbl(3) = 606800 X = 6063 'pour test If IsNumeric(Application.Match(X, Tbl, 0)) Then 'blabla End If
ou, mieux dans un dictionnaire. En fait, ça dépend du nombre d'exceptions.
Daniel