Vba 2pb

Bonjour,
j ai 2 petit soucis avec ma macro vba excel.
je génère un nouveau fichier et sur ce nvo je veux creer trois nouvel colonne qui st simplement un left () d'une autre colonne.
j arrive a le faire sous excel en metant gaucha(a2,5) (c'est une chaine de6 caractères à l'origine) mais je n'arrive pas a la générer automatiquement.
le deuxieme point g trouvé la fonction subtotal() mais je sais pas comment elle fonctionne :
Selection.FormulaR1C1 = "=SUBTOTAL(9,R[-" & nb_lignes & "]C:R[-1]C)"
qu'est ce que le neuf
et RC?
nb_ligne est ma variable mais pk on met d moins?
merci d'avance
Configuration: Windows XP
Internet Explorer 6.0

12 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Plusieurs échanges portent sur une macro VBA Excel qui doit créer trois nouvelles colonnes en extrayant les premiers caractères d'une autre colonne avec Left et s'appuyer sur SUBTOTAL. Des explications clés précisent que 9 dans SUBTOTAL désigne la somme et que RC signifie des références relatives, avec un exemple pratique utilisant Range("A1").Value = Left(Range("B1").Value, 5). Pour le volet filtrage, la discussion évoque l'usage de l AutoFilter sur une feuille entière et l'enchaînement de filtres successifs ou l'option alternative des tableaux croisés dynamiques. Certaines réponses proposent des variantes simples pour générer automatiquement les colonnes Left et rappellent que la manipulation des valeurs et des formats peut impacter le filtrage par numéro de compte.

Bobot (l’IA à votre service)
  1. salut,
    il suffit d'écrire

    Selection.AutoFilter

    en c'est une bascule avec ou sans
    Donc quand tu as plus besoin du filtre tu l'enlèves

    pour le tableau croisé dynamique je te conseillerai d'y jeter un oeil
    un site qui explique bien ( mon point de vue personnel ) www.excelabo.net

    bon courage
    A+
    R
    1. je sais pas mes servir des tcd lol mais bon
      a oui tu m 'a conseillé d enlever les filtres mais je ne sais pas faire.
      bisous caro
      1. 1) oui il est possible de faire un filtre sur une feuille entière.

        Fais attention à la quantité de donnée.

        2) faire un filtre d'un filtre cela s'appelle un deuxième critère n'est-ce pas.

        ex:
        fruit qte region
        poire 12 est
        pomme 100 ouest
        raisin 50 sud
        raisin 120 sud

        un filtre sur Qte (field2) avec un critère >51 extrait la ligne 2 et 4 (ouest et sud)
        si tu rajoute field 3 avec comme critère sud seule la ligne 4 sera extraite.

        lorsque tu as beaucoup de données à extraire en cascade il est interessant de voir les
        tableaux croisés dynamiques.

        Roger
        1. je suis content car de mon côté
          je testé une structure avec un filtre comme le tiens
          et ça marché!

          un conseil, quand tu fais des filtres successifs il est souvent utile d'enlever le filtre puis
          de le remettre.

          A+
          1. MERCI BCP EN TOUT CAS
          2. j ai deux dernierequestion
            1. Peut on mettre une feuille entiere en filtre automatique car ma feuille est un copier coller donc faut que j aille dans donnees filtrer pour la mettre hors j aimerais qu elle s'y mette toute seule dans ma macro

            2.peut on faire un filtre d'un filtre?
            merci
        2. je crois que tu as raison ma selection pour l'autofilter je crois que ça prend pas la bonne page mais je c pas comment faire
          1. ça y'est g trouver en faite toute la feuille en filtrer automatique
            merci bcp
            caro
        3. Bonjour,

          je te suggère de modifier ton code pour éviter un risque d'erreur Important
          tu fais référence à une zone sélectionnée puis plus loin tu en sélectionnes une autre.
          du fait qu'il s'agit d'une collection (for each tu pourrais avoir une erreur ou des lignes non traitées)
          je te propose ceci.
          Explique ton deuxième problème.

          Sheets("Détail").Select
          'Range("C11", Range("C11").End(xlDown)).Select ' ici nomme la zone
          Range("C11", Range("C11").End(xlDown)).name="MaZone"

          'For Each cell In Selection ' remplacé par
          For Each cell In range("MaZone") ' comme cela tu feras toujours référence à la même Zone

          Sheets("Détail").Select
          num_compte = ActiveCell
          sens = ActiveCell.Offset(0, 5)
          solde = ActiveCell.Offset(0, 15)

          Sheets("tout").Select

          'sélection du numéro de compte
          If Len(num_compte) = 2 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 3 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 4 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 5 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 6 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          End If

          Range("AD" & nb_lignes + 1).Select
          Selection.FormulaR1C1 = "=SUBTOTAL(9,R[-" & nb_lignes & "]C:R[-1]C)"
          solde_debit = Selection.Value

          Range("AE" & nb_lignes + 1).Select
          Selection.FormulaR1C1 = "=SUBTOTAL(9,R[-" & nb_lignes & "]C:R[-1]C)"
          solde_credit = Selection.Value

          ActiveSheet.ShowAllData

          Sheets("Détail").Select

          If sens = "D+" Or sens = "D-" Then
          ActiveCell.Offset(0, 11) = solde_debit
          ElseIf sens = "+C" Or sens = "-C" Then
          ActiveCell.Offset(0, 11) = solde_credit
          End If
          ActiveCell.Offset(0, 14) = Len(num_compte)
          ActiveCell.Offset(1, 0).Select

          Next
          1. Bonjour,
            bonjour je vous explique g deux feuilles la premier est un num compte au format texte comme dessous
            2011
            2021
            2031
            2031
            2041
            2061
            2051
            205200

            g une 2eme feuille
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            201119 201 2011 20111
            les 3 derniere colonne sont des gauche de la premiere colonne
            je veux filtrer la feuille grace au num de la premiere donc g codé ainsi :
            'sélection du numéro de compte
            If Len(num_compte) = 2 Then
            Selection.AutoFilter Field:=1, Criteria1:=num_compte
            ElseIf Len(num_compte) = 3 Then
            Selection.AutoFilter Field:=2, Criteria1:=num_compte
            ElseIf Len(num_compte) = 4 Then
            Selection.AutoFilter Field:=3, Criteria1:=num_compte
            ElseIf Len(num_compte) = 5 Then
            Selection.AutoFilter Field:=4, Criteria1:=num_compte
            ElseIf Len(num_compte) = 6 Then
            Selection.AutoFilter Field:=1, Criteria1:=num_compte
            End If
            la longueur des numéro de compte est bonne
            mais lorsque j'ai un champ différent du champ 1ça ne marche plus peut il y avoir un probleme de format?
            merci
            voilaz mon soucis
            mais maintenant tout est soucis je vais recommencé au début
          2. voila g refait mais g tjs mon pb de filtre mais pour tout le reste ça fonctionne donc je te remecie bcp et si tu as un idéee du pk ça plante ça m'interesse si je met un champs different de 1 le message d erreur suivant apparait : erreur 1004 la methode autofilter de la classe range a échoué
          3. j'arrive pas a mettre résolu!!!
        4. je n'ai plus le temps je regarde demain ou je laisse un autre te conseiller
          1. ok en meme tu as résolu mes problème j ai plus qu un soucis d autofilter et c sur un autre poste et puid pr le rc mais je pense que tu sais pas un grand merci
        5. Sub Macro2()

          Application.ScreenUpdating = False

          date_arrete = InputBox("Quelle est le PLCR utilisé? (format JJ-MM-AAAA)")

          Sheets("tout").Select
          Range(("A1"), Range("A1").End(xlDown)).Select
          nb_lignes = Selection.Count
          Range("AF1").Value = Left(Range("A1"), 5)

          Sheets("Détail").Select
          Range("C11", Range("C11").End(xlDown)).Select

          For Each cell In Selection

          Sheets("Détail").Select
          num_compte = ActiveCell
          sens = ActiveCell.Offset(0, 5)
          solde = ActiveCell.Offset(0, 15)

          Sheets("tout").Select

          'sélection du numéro de compte
          If Len(num_compte) = 2 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 3 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 4 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 5 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          ElseIf Len(num_compte) = 6 Then
          Selection.AutoFilter Field:=1, Criteria1:=num_compte
          End If

          Range("AD" & nb_lignes + 1).Select
          Selection.FormulaR1C1 = "=SUBTOTAL(9,R[-" & nb_lignes & "]C:R[-1]C)"
          solde_debit = Selection.Value

          Range("AE" & nb_lignes + 1).Select
          Selection.FormulaR1C1 = "=SUBTOTAL(9,R[-" & nb_lignes & "]C:R[-1]C)"
          solde_credit = Selection.Value

          ActiveSheet.ShowAllData

          Sheets("Détail").Select

          If sens = "D+" Or sens = "D-" Then
          ActiveCell.Offset(0, 11) = solde_debit
          ElseIf sens = "+C" Or sens = "-C" Then
          ActiveCell.Offset(0, 11) = solde_credit
          End If
          ActiveCell.Offset(0, 14) = Len(num_compte)
          ActiveCell.Offset(1, 0).Select
          Next

          ActiveWorkbook.SaveAs Filename:= _
          "L:\RL " & date_arrete & " .xls", FileFormat:= _
          xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
          , CreateBackup:=False

          MsgBox ("Le calcul est terminé!")

          End Sub

          je t ai mis tout monn code
          mon tableau de la feuille "tout fais 16400lignes et va jusqua la colonne AD
          j ai mis un autre post car j ai d soucis avec autofilter si tu veux
          merci
          caro
          1. il vaudrait mieux préciser les dimension de ton tableau
            et j'ajouterai que ta demande n'étais pas claire pour moi.

            place ce code dans un module

            Sub essai()

            Dim nligne As Integer
            Dim i As Integer
            Dim C As Variant
            i=0

            nligne = Range("A1").CurrentRegion.Rows.Count ' le début de la base
            For Each C In Range("f1:F" & nligne)
            C.Value = Left(Range("A1").Offset(i, 0), 5) ' permet d'écrire sur la ligne suivante
            ' A1 represente la cellule que tu copies ( on extrait 5 caractères avec left
            i = i + 1 ' ligne suivante
            Next ' cellule suivante

            End Sub

            dis moi si ça marche.
            1. j'essaye ton programme merci
            2. ça marche je t ai mis les renseignements demandés sur un message pas adressé a toi mais sur la discussion en tout cas jte remerci et souhaite te dire que j ai pleins de soucis donc jte réembetterai souvent merci encore
              bisous caro
            3. bon ç marche pas partout :
              Dim i, j, k, l As Integer
              Dim C As Variant
              i = 0
              j = 0
              k = 0
              For Each C In Range("AF1:AF" & nb_lignes)
              C.Value = Left(Range("A1").Offset(i, 0), 5) ' permet d'écrire sur la ligne suivante
              ' A1 represente la cellule que tu copies ( on extrait 5 caractères avec left
              i = i + 1 ' ligne suivante
              Next ' cellule suivante
              For Each C In Range("AG1:AG" & nb_lignes)
              C.Value = Left(Range("A1").Offset(j, 0), 4) ' permet d'écrire sur la ligne suivante
              ' A1 represente la cellule que tu copies ( on extrait 4 caractères avec left
              j = i + 1 ' ligne suivante
              Next ' cellule suivante
              For Each C In Range("AH1:AH" & nb_lignes)
              C.Value = Left(Range("A1").Offset(k, 0), 3) ' permet d'écrire sur la ligne suivante
              ' A1 represente la cellule que tu copies ( on extrait 3 caractères avec left
              k = i + 1 ' ligne suivante
              Next ' cellule suivante

              voila mon bout de code
              af ag ah
              CCPTA CCPT CCP
              10110
              11100
              12151
              12151
              12160
              12710
              13226

              voila un bout de résultat
              je veux prendre les 5 4 puis 3 caractère de le colonne a mais je sais pas si il y a tjs une selection
            4. J ai trouvé j'incrémenté pas la bonne variable
              oops desolee de t avoir embetté mais si tu t y connais en autofilter jsui preneuse
              merci bisous
          2. Mon probleme n'est pas résolu
            Ecris comme cela c'est normal
            Range("AF").Value = Left(Range("a1"), 5)
            Si j'ai bien compris en af je devrai avoir les 5 premier caractere de A
            la methode ' range' de l'objet '_global' a echoue car range n'était pas défini....

            Range("AF1").Value = Left(Range("A1"), 5)

            la méthode range(ligne,colonne) fait référence à une lettre et à un chiffre.
            A moins que je n'ai pas compris ce que tu souhaites faire....
            1. on y est presque sauf que je desire faire toute la colonne et pas seulement la premiere cellule
              merci
            2. j'ai quelque idée en fait
              j'ai seletionner ma colonne deja pour le nb de ligne
              donc si je fais
              for each cell in selection
              Range("AF1").Value = Left(Range("A1"), 5)

              next
              seulement que je vais faire seulement la cellule a1 donc je ne sais pas comment faire
              et la seule chose que je trouve sur subtotal c'est que 9 = ecart type ce qui explique ma question
              mas je trouve pas ce que signifie r -16400c:r-1c Vous savez?
              mercccci caro
          3. Mon probleme n'est pas résolu
            Range("AF").Value = Left(Range("a1"), 5)
            Si j'ai bien compris en af je devrai avoir les 5 premier caractere de A
            la methode ' range' de l'objet '_global' a echoue apparait
            1. Bonjour,

              pour la deuxième question c'est facile avec l'aide

              ça donne ça!

              1 101 MOYENNE
              2 102 NB
              3 103 NBVAL
              4 104 MAX
              5 105 MIN
              6 106 PRODUIT
              7 107 ECARTYPE
              8 108 ECARTYPEP
              9 109 SOMME 10 110 VAR
              11 111 VAR.P

              le sous-total contient une somme. Mais je crois que tu viens de découvrir quelquechose.

              pour "je veux créer trois nouvelles colonnes qui sont simplement un left () d'une autre colonne. "
              puisque la fonction left est nommée, il s'agit d'un code vba
              pour mettre un titre dans une cellule: on écrit range("A1").value=left(range("B1",5))
              la cellule A1 contiendra le 5 premiers caractères en partant de la gauche de la cellule B1.
              1. merci bcp et pk met on rc?