Addition pourtant simple

Bonjour à tous,

C'est pourtant simple à écrire, mais j'aurais besoin d'un code VBA pour additionner la colonne C en fonction de la valeur de A. Pour exemple, je voudrais faire le totale du volume de la "destination" 1001, 1002, 1003, etc... sur la feuil2. Je bricole en VBA, mais là je sèche carrément

Mon fichier peu faire jusqu'à 10 000 lignes avec une trentaine de destinations !

Merci pour votre aide

Romnat.

10testvolume.xlsx (88.73 Ko)

Bonsoir,

=SOMME.SI(Sheet1!$A:$A;A4;Sheet1!$C:$C)

Tu ne vas pas mobiliser VBA pour une opération triviale ne réclamant qu'une formule toute simple !

Bah si en fait... puisque c'est seulement cette partie qu'il me manque... j'ai déjà une grosse partie de mon projet faite en vba.

Mais je n'arrive pas à faire ce bout de code sniff.

Bonjour Romnat,

Voici un code que tu peux utiliser

Sub TotalDest()
  Dim ShtS As Worksheet, ShtD As Worksheet
  Dim DLig As Long, Lig As Long
  Dim LigF As Long, NLig As Long
  Dim LeCode As Integer
  ' Définir la feuille source à utiliser
  Set ShtS = Worksheets("Sheet1")
  ' Définir la feuille de destination
  Set ShtD = Worksheets("Sheet2")
  ' Dernière ligne de la feuille source
  DLig = ShtS.Range("A" & Rows.Count).End(xlUp).Row
  ' Pour chaque ligne
  For Lig = 2 To DLig
    ' Récupérer le code
    LeCode = ShtS.Range("A" & Lig)
    ' Le chercher dans la feuille de destination
    On Error Resume Next
    LigF = 0
    LigF = ShtD.Columns("A:A").Find(What:=LeCode, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
    On Error GoTo 0
    ' Si le code n'est pas trouvé, le créer
    If LigF = 0 Then
      ' Nouvelle ligne
      NLig = ShtD.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
      ' Inscrire le code
      ShtD.Range("A" & NLig).Value = LeCode
      ' Inscrire la formule
      ShtD.Range("B" & NLig).FormulaLocal = "=SOMME.SI(" & ShtS.Name & "!A:A;A" & NLig & ";" & ShtS.Name & "!C:C)"
    End If
  Next Lig
  ' Effacer les variables objet
  Set ShtD = Nothing: Set ShtS = Nothing
End Sub

A+

Et avec l'explication c'est vraiment cool

Je teste demain.

Merci d'avance

Salut Romnat, BrunoM45,

Bonjour MFerrand!

Je te jure que je pensais laisser ça à un crack ès formule mais si notre hôte veut du VBA, tu me connais...

Private Sub cmdGO_Click()
'
Dim tTab1, tTab2()
With Worksheets("Volumes")
    iRow = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("A2:C" & iRow).Sort key1:=.Range("A2"), order1:=xlAscending, key2:=.Range("B2"), order2:=xlAscending, Orientation:=xlTopToBottom
    tTab1 = .Range("A2:C" & iRow)
End With
'
iFlag = 0
For x = 1 To UBound(tTab1, 1)
    If tTab1(x, 1) <> iFlag Then
        iIdx = iIdx + 1
        ReDim Preserve tTab2(2, iIdx)
        iFlag = tTab1(x, 1)
        tTab2(0, iIdx - 1) = tTab1(x, 1)
    End If
    tTab2(1, iIdx - 1) = tTab2(1, iIdx - 1) + tTab1(x, 3)
Next
'
With Worksheets("Recap")
    .Range("A4").Resize(iIdx, 3) = WorksheetFunction.Transpose(tTab2)
End With
'
End Sub

A+

7testvolumes.xlsm (108.50 Ko)

Nikel sa fonctionne

J'ai un autre soucis et j'avoue profiter de votre expérience

je voudrais mettre ceci : =IF(AE2<1;AC2-144;AC2) en vba. Directement sur la feuille sa fonction.

En vba :

Dim Colis_FSS As Integer
    With ActiveSheet
        Colis_FSS = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("AG2:AG" & Colis_FSS).FormulaR1C1 = ActiveCell.FormulaR1C1 = "=IF(RC[-2]<1,RC[-4]-144,RC[-4])"
    End With

Je récupère le résultat : FALSE partout.

Une idée ? Merci

Combien de = !!!

        .Range("AG2:AG" & Colis_FSS).FormulaR1C1 = [barrer]ActiveCell.FormulaR1C1 =[/barrer] "=IF(RC[-2]<1,RC[-4]-144,RC[-4])"

C'est avec des gens comme vous, que des amateurs comme moi progressent chaque jour dans le VBA (au risque de se faire chahuter). Au début, qui n'a pas essayer d'utiliser l'enregistreur de macro puis d'améliorer le code produit ? Bah j'en fait partie, même si pour vous sa en devient risible !

Ceci dit merci pour votre aide

Bonjour,

Ce n'est pas un problème spécifiquement VBA... ! Lorsque tu faisais le développement mathématique d'une expression, en alignant un certain nombre de signes =, le passage de l'un à l'autre signifiait passage d'une étape du calcul à la suivante, jusqu'à la phase finale de résultat. L'ordinateur ne procède pas ainsi, le processeur qui opère un calcul, qu'il soit commandé par VBA ou n'importe quel programme, procède éventuellement par étapes, en stockant des résultats intermédiaires en mémoire pour les reprendre, jusqu'au résultat final qu'il livre... mais de ces étapes intermédiaires, tu n'en vois rien.

Lorsque tu utilises = dans une instruction, tu n'écris pas une égalité, tu écris une instruction d'affectation : tu demandes que soit affecté au membre indiqué à gauche du signe = le résultat de l'expression mise à droite du signe =. C'est donc tout à fait autre chose !

Ainsi, rencontrant le premier = le programme en déduit qu'il doit affecter à ce qui est indiqué avant ce qu'il va trouver après. Et si dans l'expression qui suit il va à nouveau trouver un signe =, ce nouvel = a pour lui signification que l'expression est booléenne, c'est à dire que si l'égalité qu'il trouve est vérifiée, il renverra True, sinon il renverra False.

Il n'y a donc pas lieu de s'étonner d'obtenir une collection de False...

Tu m'excuseras mais cela fait partie des choses que je trouve drôle... mais je te fournis l'explication et j'espère qu'elle servira !

Ceci n'est pas lié à l'enregistreur, mais puisque tu y fais allusion, je conseille toujours pour apprendre à travailler en VBA, et à travailler efficacement, d'oublier l'enregistreur, qui est un frein à l'apprentissage. On apprend plus rapidement à coder correctement sans. Par la suite, l'enregistreur peut rendre quelque service, non pour produire du code (qui est toujours mauvais) mais pour détecter un point de syntaxe dans un cas douteux (dans la mesure où c'est quelque chose qui sera enregistré car ce n'est pas toujours le cas), et là tu utilises une toute petite fraction de ligne sur une page enregistrée...

Bonne continuation et cordialement...

J'apprécie ta remarque très instructive pour moi. D'autant plus que tu prends le temps de développer. Merci.

Rechercher des sujets similaires à "addition pourtant simple"