Somme.si, VBA et plages dynamiques

Vilain

XLDnaute Accro
Bonsoir à tous,

Je reviens une fois de plus avec un problème de plage dynamique en vba.
J'explique mon problème :
J'ai un onglet 1 et un onglet 2. Dans mon onglet 1, j'ai en colonne N ma clé unique. Je reprends cette clé unique en onglet 2 en ayant supprimé les doublons. J'ai dans mon onglet 1, dans la colonne P et dans les suivantes mes données. Je souhaite reprendre ces données dans mon onglet 2 dans les colonnes C et suivantes grâce à une formule : min(1;somme.si(liste clé unique de l'onglet 1; clé unique de la ligne; somme des données correspondantes)).
Je joins mon fichier dans sa structure exacte et avec la formule que je souhaite dans les colonnes C et D de mon onglet 2. Mon problème réside dans le fait que le nombre de données dans ma colonne de clés uniques varient grandement.

Merci d'avance pour votre précieuse aide.

Vilain
 

Pièces jointes

  • exemple.xls
    28 KB · Affichages: 46
  • exemple.xls
    28 KB · Affichages: 53

CISCO

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Bonjour

Tu peux peut être faire en 2!C2 avec quelque chose du genre
Code:
=MIN(1;SOMME.SI(DECALER('1'!N$2;;;EQUIV(9^9;'1'!N:N;1));'2'!$A2;DECALER('1'!P$2;;;EQUIV(9^9;'1'!P:P;1))))
avec quelques $ en plus, si tu as bien des nombres dans les colonnes 1!N et 1!P.

@ plus
 

Vilain

XLDnaute Accro
Re : Somme.si, VBA et plages dynamiques

Bonsoir Cisco,

Merci pour cette réponse rapide. L'idée est bonne mais j'essaie ne pas inclure ce genre de choses et de passer que par des solutions VBA (j'étais passé par l'intermédiaire des plages nommées en dynamiques dans un premier temps). Si je n'arrive pas à régler ce problème, j'essaierai qqch de ce genre.

Encore merci.

A plus
 

R@chid

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Bonsoir @ tous,
le MIN() ne sert à rien ici, puisque l'on peut faire juste comme ça : =N(SOMME.SI('1'!$N$2:$N$7;$A2;'1'!P$2:p$7)>0)
le problème de l'ami Vilain est qu'il veut extraire les "Clés uniques" avec un code VBA et pas avec une formule, mais surement une âme charitable va passer par là pour lui donner de l'aide.


@ + +
 

Vilain

XLDnaute Accro
Re : Somme.si, VBA et plages dynamiques

Re,

Merci Rachid pour ton aide.
Le problème ici c'est que ta formule ne tient compte que des 7 lignes remplies dans mon onglet 1. Parfois j'en aurai 1000, parfois 10000, parfois 100000 ! C'est la dessus que je bloque en fait...
 

R@chid

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Re,
pour les formules on peut les appliquer sur toutes les colonnes, en C2 :
Code:
=N(SOMME.SI('1'!$N:$N;$A2;'1'!P:P)>0)
@ tirer vers le bas et vers la droite


Si quelqu'un parmi les VBAistes peut adapter l’événement Worksheet_Activate pour incrémenter les formules au fur et à mesure.


@ + +
 

R@chid

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Re,
tu actives l'onglet "2" tu vas retrouver tous tes clés uniques puis tu cliques sur le bouton pour incrémenter les formules.
macro de Job75 sur ton autre discussion.


@ + +
 

Pièces jointes

  • Vilain3.xls
    41.5 KB · Affichages: 38

gosselien

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Bonjour,

j'avoue ne pas comprendre la formule et à quoi elle sert, mais pour la macro en worksheet activate, ça aide..
donc aucune certitude quant au résultat :)
P.
 

Pièces jointes

  • Vilain2.xls
    60 KB · Affichages: 44
  • Vilain2.xls
    60 KB · Affichages: 50

Modeste

XLDnaute Barbatruc
Re : Somme.si, VBA et plages dynamiques

Bonjour,

Pour saluer R@chid et ses premiers essais de macro (je salue bien évidemment les autres au passage!), on peut faire "tout" dans la seule procédure Worksheet_Activate et donc se dispenser du bouton, avec le code suivant:
VB:
Sub SansDoublonsTrie()
  Dim temp()
  Set f1 = Sheets("1")
  Set f2 = Sheets("2")
  Set mondico = CreateObject("Scripting.Dictionary")
  a = Range(f1.[N2], f1.[N65000].End(xlUp)).Value
  For Each c In a
     mondico(c) = ""
  Next c
  derlig = f2.Cells(Rows.Count, 1).End(xlUp).Row 'n° ligne dernière cellule non-vide en colonne A
  Set dest = f2.Range("A2")
  dest.ClearContents
  f2.[A3].Resize(derlig - 2, 4).ClearContents '4, pcq 4 colonnes à effacer (sans effacer les formules en ligne 2)
  dest.Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
  dest.Resize(mondico.Count, 1).Sort Key1:=dest, Order1:=xlAscending
  [C2:D2].AutoFill ([C2].Resize(mondico.Count, 2)) 'recopier les formules de ligne 2 (sur 2 colonnes de large)
  Set mondico = Nothing    ' libère mondico
End Sub
 

Discussions similaires