Vba 2pb

ptikiki -  
Bidouilleu_R Messages postés 1209 Statut Membre -
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. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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. ptikiki
       
      merci bcp et pk met on rc?
      0
  2. ptikiki
     
    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
  3. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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. ptikiki
       
      on y est presque sauf que je desire faire toute la colonne et pas seulement la premiere cellule
      merci
      0
    2. ptikiki
       
      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
  4. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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. ptikiki
       
      j'essaye ton programme merci
      0
    2. ptikiki
       
      ç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. ptikiki
       
      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. ptikiki
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ptikiki
     
    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
  7. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    je n'ai plus le temps je regarde demain ou je laisse un autre te conseiller
    0
    1. ptikiki
       
      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
  8. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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. ptikiki
       
      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. ptikiki
       
      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. ptikiki
       
      j'arrive pas a mettre résolu!!!
      0
  9. ptikiki
     
    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. ptikiki
       
      ça y'est g trouver en faite toute la feuille en filtrer automatique
      merci bcp
      caro
      0
  10. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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. ptikiki
       
      MERCI BCP EN TOUT CAS
      0
    2. ptikiki
       
      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
  11. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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
  12. ptikiki
     
    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
  13. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    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