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

  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.
    0
    1. merci bcp et pk met on rc?
      0
  2. 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
    0
    1. 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....
      0
      1. on y est presque sauf que je desire faire toute la colonne et pas seulement la premiere cellule
        merci
        0
      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
        0
    2. 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.
      0
      1. j'essaye ton programme merci
        0
      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
        0
      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
        0
      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
        0
    3. 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
      0
      1. je n'ai plus le temps je regarde demain ou je laisse un autre te conseiller
        0
        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
          0
      2. 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
        0
        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
          0
        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é
          0
        3. j'arrive pas a mettre résolu!!!
          0
      3. 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
        0
        1. ça y'est g trouver en faite toute la feuille en filtrer automatique
          merci bcp
          caro
          0
      4. 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+
        0
        1. MERCI BCP EN TOUT CAS
          0
        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
          0
      5. 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
        0
        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
          0
          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
            0