Compléter un tableau selon différents critères

Résolu
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour, est il possible de créer une macro pour cet Objectif :


Extraire automatiquement les montants depuis une base de données (avec deux colonnes : Compte et Montant) vers un autre tableau, en appliquant un filtre :

Inclure les lignes où le numéro de compte commence par "602"

Exclure les lignes où le numéro de compte commence par "60266"


Le but est que seuls les montants correspondant à ces critères soient reportés dans un autre tableau.

Merci 

A voir également:

12 réponses

jee pee Messages postés 41468 Date d'inscription   Statut Modérateur Dernière intervention   9 706
 

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%" "


0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

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 

0
jee pee Messages postés 41468 Date d'inscription   Statut Modérateur Dernière intervention   9 706
 

ce tableau, il est fait avec quel logiciel ?

0
brucine Messages postés 21524 Date d'inscription   Statut Membre Dernière intervention   3 383
 

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"),

0
jee pee Messages postés 41468 Date d'inscription   Statut Modérateur Dernière intervention   9 706 > brucine Messages postés 21524 Date d'inscription   Statut Membre Dernière intervention  
 

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.

0
brucine Messages postés 21524 Date d'inscription   Statut Membre Dernière intervention   3 383 > jee pee Messages postés 41468 Date d'inscription   Statut Modérateur Dernière intervention  
 

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.

0
cousinhub29 Messages postés 1074 Date d'inscription   Statut Membre Dernière intervention   361 > brucine Messages postés 21524 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

C'est un tableau Excel ainsi que l extraction des informations qui sert au remplissage.

0
jee pee Messages postés 41468 Date d'inscription   Statut Modérateur Dernière intervention   9 706
 

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.

0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

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.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cousinhub29 Messages postés 1074 Date d'inscription   Statut Membre Dernière intervention   361
 

Re-,

(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.. :)


0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

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

0
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   229
 

Bonjour,

Dans quelle colonne du classeur "Extract°N pour Depmt.xlsx" faut-il chercher les code de la colonne B.

Daniel


0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

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".

0
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   229
 

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


0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

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

0
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   229
 

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


0
Nanou3868 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   3
 

Merci infiniment Daniel pour le temps que vous m'avez consacré et pour toutes les informations partagées. Même si je suis encore novice dans ce domaine, je vais essayer de tirer parti de tout cela pour créer une macro qui facilitera le remplissage du fichier. Encore un grand merci !

0
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   229
 

Heureux d'avoir pu vous être utile. Si vous avez d'autres questions, n'hésitez pas.

Daniel

0