IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Somme si ens en vba [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Points : 83
    Points
    83
    Par défaut Somme si ens en vba
    Bonjour à tous,
    je voudrez faire une somme sous deux conditions en vba
    faisant partie d'une macro plus grande. Le premier critère et une cible le deuxieme est une correspondance de date.
    je mets la macro entière puis la partie ou je voudrais une somme conditionnelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Sub copieclient()
     
    Set Flcd = ThisWorkbook.Worksheets("CC2012")
    Set Fl = ThisWorkbook.Worksheets("facturation prévisionnelle")
    Set Flech = ThisWorkbook.Worksheets("Echéancier prévisionnel")
     
     
         Set rancom = Application.InputBox("Sélectionnez une plage !", "Sélection de cellules", Type:=8)
     
    If Not rancom Is Nothing Then
    lNx = rancom.Row
     
       Fl.Activate
     
    ' Remplissage de la feuille de facturation prévisionnelle.
     
    Range("A1").Select
    If Range("A2").Value <> "" Then ActiveCell.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
          randes = ActiveCell.Row
          ActiveCell.Offset(0, 1).Value = Flcd.Cells(lNx, 8)            'Nom du client
          ActiveCell.Offset(0, 2).Value = rancom.Value                  'Numéro de commande
          ActiveCell.Offset(0, 3).Value = Flcd.Cells(lNx, 9)            'Nom du chantier
          ActiveCell.Offset(0, 4).Value = Flcd.Cells(lNx, 5)            'statut(en cours/soldé)
          ActiveCell.Offset(0, 5).Value = Date                          'Date
          Flcd.Cells(lNx, 1).Copy Fl.Cells(randes, 1)                   'Numéro de Devis
     
          U_Fact.Show
          If satisf = True Then
     Fl.Cells(randes, 7).Value = valtb1                        'Numéro de Bon
     Fl.Cells(randes, 9).Value = valtb2                        'Numéro de palette
     Fl.Cells(randes, 10).Value = valtb3                       'Nombre de pierre
     Fl.Cells(randes, 8).Value = valtb4                        'Montant Hors taxe
     Fl.Cells(randes, 11).Value = valtb5                       'Versement
     Fl.Cells(randes, 12).Value = cbo1                         'Chèque ou espèce
     Fl.Cells(randes, 13).Value = cbo2                         'statut complete /partielle
     Fl.Cells(randes, 14).Value = cbo3                         'Vu par tel/mail/pers.
     End If
      If satisf = False Then
      U_Fact.Hide
      Flcd.Activate
     End If
     End If
     
     Fl.Activate
     
    ' Somme des montants des bons de livraison dans le carnet de commande.
     
    ligdebut = 4
    ligfin = Fl.Range("A" & Fl.Rows.Count).End(xlUp).Row
     
      For xndev = ligdebut To ligfin
      ndevis = Fl.Cells(xndev, 1).Value
      cib1 = ndevis
      Set rcib1 = Flcd.Columns(1).Find(What:=cib1, LookAt:=xlPart)
      Set rcibis = Flech.Columns(1).Find(What:=cib1, LookAt:=xlPart)
     
      If Not rcib1 Is Nothing Then
      Flcd.Cells(rcib1.Row, 12) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(8))
      Flcd.Cells(rcib1.Row, 17) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(10))
      Flcd.Cells(rcib1.Row, 20) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(9))
      Flcd.Cells(rcib1.Row, 13) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(11))
    End If
     
    ' Envoi dans l'échéancier prévisionnel
     
    datecher = Fl.Cells(xndev, 6).Value
    lemois = Month(datecher)
     
    Select Case lemois
     
      Case 1
     colmois = 8
      Case 2
     colmois = 9
      Case 3
     colmois = 10
      Case 4
     colmois = 11
      Case 5
     colmois = 12
     Case 6
     colmois = 13
     Case 7
     colmois = 14
     Case 8
     colmois = 15
     Case 9
     colmois = 16
      Case 10
     colmois = 17
      Case 11
     colmois = 18
      Case 12
     colmois = 19
    End Select
     
     If Not rcibis Is Nothing Then
    Flech.Cells(rcibis.Row, colmois) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(8))
    End If
    Next
     
        Set Flcd = Nothing
        Set Fl = Nothing
        Set Flech = Nothing
    End Sub
    C'est sur cette partie que je veux ajouter une condition à ma somme en vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     If Not rcibis Is Nothing Then
    Flech.Cells(rcibis.Row, colmois) = Application.WorksheetFunction.SumIf(Fl.Columns(1), cib1, Fl.Columns(8))
    End If
    Next
    je veux en plus de la cib1 (qui est un numéro de devis) que la somme qui s'effectue dans mon échéancier (Flech) respecte la date colonne F de la feuille Fl. Actuellement j'ai la somme de tous les bons d'enlèvements dans chaque mois or je voudrais la somme des bons en fonction du mois de la date d'enlèvement.
    N'hésitez pas à me demander des clarification si vous pensez pouvoir m'aider merci d'avance.

  2. #2
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Je vois plusieurs solutions :
    - Tu ajoutes une colonne qui concatène la cible et la date et tu fais un sumif sur cette colonne.
    - Tu fais une boucle dans ton code sur toutes les lignes en vérifiant les deux conditions à chaque fois (attention à mettre d'abord la plage dans un tableau pour ne pas que ça prenne des heures).
    - Sinon, pour faire des SumIf avec plusieurs critères, il faut utiliser SumProduct. Tu trouveras des tonnes d'exemple en formule de feuille de calcul si tu tapes "Somme.Si multicritère" sur Google. Une adaptation en VBA avec WorksheetFunction ne doit pas être trop compliquée.
    - Tu fais une requête SQL sur ta plage. Voir dans la FAQ pour utiliser Excel comme source de donnée ADO.

  3. #3
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Sur 2010, le "somme si" multi critères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.WorksheetFunction.SumIfs
    Attention à la comptabilité descendante (Excel 2003)

  4. #4
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Il va vraiment falloir qu'un jour je quitte mon vieux 2003 !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Points : 83
    Points
    83
    Par défaut Réponse tardive
    Bonjour à tous,
    merci à zebreloup et Jfontaine pour leur précieux conseils.
    Malheureusement je crois que mon problème vient du fait que ce n'est pas une somme conditionnelle l'outil dont j'ai besoin...
    Je boucle sur les lignes de la feuille Fl (prévisionnel de fact.).
    sur chacune de ces lignes j'ai le numéro de devis (cib1) et la date du bon d'enlèvement (Fl.Cells(xndev, 6)).
    Je veux que la somme des bons d'enlèvement de chaque devis soit additionnée.
    dans l'échéancier dans la colonne du mois correspondant à la date d'enlèvement.
    Or si je reste dans ma boucle il faut écrire dans un des critères de somme :
    si "cellules de destination " non vide alors additionner. Et je ne sais pas si c'est possible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     If Not rcibis Is Nothing Then
    Flech.Cells(rcibis.Row, colmois) = Application.WorksheetFunction.SumIfs(Fl.Columns(8), Fl.Columns(1), cib1, Month(Fl.Cells(xndev, 6)), Month(Flech.Cells(3, colmois).Value))
    End If
    Next
    J'ai essayé ceci mais ça ne fonctionne pas je crois que c'est un problème de correspondance de variable.
    Si quelqu'un à une idée pour m'aider merci d'avance.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 128
    Points : 83
    Points
    83
    Par défaut c 'est bon
    J'ai trouvé la réponse à ma question =) qui n'était pas claire
    Parfois il suffit de poser la question pour que la solution se présente d'elle même.
    Je poste la réponse pour ceux qui rencontreraient le même problème :.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If Not rcibis Is Nothing Then
     If Flech.Cells(rcibis.Row, colmois).Value = "" Then
    Flech.Cells(rcibis.Row, colmois) = Fl.Cells(xndev, 8).Value
    Else
    Flech.Cells(rcibis.Row, colmois) = Flech.Cells(rcibis.Row, colmois).Value + Fl.Cells(xndev, 8).Value
    End If
    End If
    Next
    Bon courage à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Transposer somme.si.ens avec critère sur date et heures en vba ?
    Par novice06 dans le forum Excel
    Réponses: 25
    Dernier message: 30/04/2015, 13h10
  2. somme.si.ens en vba
    Par stagiairecg dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/03/2015, 14h44
  3. [XL-2007] Fonction somme.si.ens (VBA)
    Par ARTETA13 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2013, 10h20
  4. [XL-2007] comment convertir SOMME.SI.ENS() en macro
    Par patricecrabbe dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/12/2009, 18h52
  5. [XL-2003] Fonction Somme.si.ens en 2003
    Par jijie dans le forum Excel
    Réponses: 4
    Dernier message: 24/04/2009, 21h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo