vba sur petite base de données - merci !

Le
sylvie.laurent82
Bonjour à vous,

De retour sur mpfe pour vous demander un coup de main, d'avance merci
aux experts toujours prets à contribuer à notre apprentissage par
l'exemple !!

Voilà, je vais joindre un fichier qui traduit ma demande
http://www.cijoint.fr/cjlink.php?file=cj200903/cij3CsjC8I.xls


J'ai une base de données avec en colonne A des numéros de
départements, en colonne B le CA en cours et en colonne C le code du
client.
la sheet se nomme "A"

Je souhaite remplacer ces 3 colonnes par le résultat qui devrait etre
exprimé comme cela:

En colonne E la liste des departements uniques, en colonne F en face
de chaque département, la somme de tous les CA du departement et en
colonne G le nombre de code client UNIQUE pour le département.

Le résultat est visible dans les colonnes EFG de mon fichier exemple,

Le luxe serait d'avoir dans une autre colonne la liste des
départements ou il n'y a pas de CA . donc tous les départements
qui ne sont pas listés dans la colonne A .

Comment faire en passant absolument par vba, sans utiliser les sous
totaux d'excel et le résultat exprimé dans les colonnes EFG doit se
trouver en ABC et remplacer donc toutes les données de la mini
base ..

Je ne m'éloigne pas loin de l'écran, dans l'attente de vos pertinentes
réponses et suggestions

Merci

Syl VBA
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JB
Le #18948891
Bonjour,

Sub Essai()
Set mondico = CreateObject("Scripting.Dictionary")
Set mondico2 = CreateObject("Scripting.Dictionary")
For Each c In Range("A2", [A65000].End(xlUp))
mondico(Format(c.Value, "00")) = IIf(mondico.exists(Format(c.Value,
"00")), mondico(Format(c.Value, "00")) + 1, 1)
mondico2(Format(c.Value, "00")) = IIf(mondico2.exists(Format
(c.Value, "00")), mondico2(Format(c.Value, "00")) + c.Offset(, 1),
c.Offset(, 1))
Next c
[j2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
[L2].Resize(mondico.Count, 1) = Application.Transpose(mondico.items)
[K2].Resize(mondico2.Count, 1) = Application.Transpose
(mondico2.items)
End Sub

http://cjoint.com/?dxmtZeWhIg

JB
http://boisgontierjacques.free.fr

On 21 mar, 11:42, wrote:
Bonjour à vous,

De retour sur mpfe pour vous demander un coup de main, d'avance merci
aux experts toujours prets à contribuer à notre apprentissage par
l'exemple !!

Voilà, je vais joindre un fichier qui traduit ma demandehttp://www.cijo int.fr/cjlink.php?file=cj200903/cij3CsjC8I.xls

J'ai une base de données avec en colonne A des numéros de
départements, en colonne B le CA en cours et en colonne C le code du
client.
la sheet se nomme "A"

Je souhaite remplacer ces 3 colonnes par le résultat qui devrait etre
exprimé comme cela:

En colonne E la liste des departements uniques, en colonne F en face
de chaque département, la somme de tous les CA du departement et en
colonne G le nombre de code client UNIQUE pour le département.

Le résultat est visible dans les colonnes EFG de mon fichier exemple,

Le luxe serait d'avoir dans une autre colonne la liste des
départements ou il n'y a pas de CA ....... donc tous les départements
qui ne sont pas listés dans la colonne A ....

Comment faire en passant absolument par vba, sans utiliser les sous
totaux d'excel et le résultat exprimé dans les colonnes EFG doit se
trouver en ABC et remplacer donc toutes les données de la mini
base .....

Je ne m'éloigne pas loin de l'écran, dans l'attente de vos pertinente s
réponses et suggestions

Merci

Syl VBA


sylvie.laurent82
Le #18948981
Bonjour JB,

Merci une fois de plus de "voler" à ma rescousse !!
Le code est court et cela donne le résultat escompté.

Par contre je ne comprends pas le "mondico", je vais chercher sur ton
site, pour comprendre cette voie ...

Bravo pour cette aide rapide, pour lister les départements absents
faut il partir dans la même direction ?

En tout cas, longue vie à ce forum et a ses contributeurs, je vais
juste maintenant passer plusieurs heures à essayer de "comprendre"
cette nouvelle facon de coder pour moi, car j'essaye toujours de
comprendre et de pouvoir avancer un peu plus toute seule la prochaine
fois ...

Un jour je reviendrai pour aider les autres, c'est promis !!

Merci, si pour la version Luxe on peut m'aider, je suis preneuse bien
sur,

A tout a l'heure

SYLVBA qui vous remercie bien fort !!!
sylvie.laurent82
Le #18948971
Oups !!!!!!!!!!!!!

La dernière colonne du code de JB ne donne pas le nombre de client
UNIQUE mais le total des codes clients y compris les doublons, comment
modifier le code pour avoir en face du département 27 la valeur 1 et
pas 5 car il n'y a qu'un seul client qui a en fait 5 fois une commande
(un seule code client le 27008)

une modif du chef est elle possible ?

Merci et à desuite

SYLVBA
JB
Le #18949281
Totaux par clients
Sub Essai2()
Dim a(), b(), c()
[A1].CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending,
Key2:=Range( _
"C2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1,
MatchCase _
:úlse, Orientation:=xlTopToBottom,
DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortTextAsNumbers
i = 2
k = 0
Do While Cells(i, 1) <> ""
mdept = Cells(i, 1)
k = k + 1
ReDim Preserve a(1 To k)
ReDim Preserve b(1 To k)
ReDim Preserve c(1 To k)
a(k) = mdept
Do While Cells(i, 1) = mdept
mclient = Cells(i, 3)
c(k) = c(k) + 1
Do While Cells(i, 3) = mclient
b(k) = b(k) + Cells(i, 2)
i = i + 1
Loop
Loop
Loop
[E2].Resize(UBound(a), 1).Value = Application.Transpose(a)
[F2].Resize(UBound(b), 1).Value = Application.Transpose(b)
[g2].Resize(UBound(c), 1).Value = Application.Transpose(c)
End Sub

http://cjoint.com/?dxnAJhIyYa

JB

On 21 mar, 12:39, wrote:
Oups !!!!!!!!!!!!!

La dernière colonne du code de JB ne donne pas le nombre de client
UNIQUE mais le total des codes clients y compris les doublons, comment
modifier le code pour avoir en face du département 27 la valeur 1 et
pas 5 car il n'y a qu'un seul client qui a en fait 5 fois une commande
(un seule code client le 27008)

une modif du chef est elle possible ?

Merci et à desuite

SYLVBA


sylvie.laurent82
Le #18949461
Bravo JB,

C'est exactement ce que je souhaitais,

Je vais quand même essayer de comprendre la méthode (nouvelle pour
moi) du mondico ......

Merci encore de ta contribution toujours pertinente,

je continue à travailler, et reviendrai sans doute .... sous peu

Bon samedi et à peut etre à bientot

SYLVBA
JB
Le #18949741
http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm

JB

On 21 mar, 13:33, wrote:
Bravo JB,

C'est exactement ce que je souhaitais,

Je vais quand même essayer de comprendre la méthode (nouvelle pour
moi) du mondico ......

Merci encore de ta contribution toujours pertinente,

je continue à travailler, et reviendrai sans doute .... sous peu

Bon samedi et à peut etre à bientot

SYLVBA


Hervé
Le #18952211
Bonsoir Sylvie et Jacques,

Je me permet de mettre mon grain de sel ;o)

Sylvie , le dictionnaire est un peu comme les collections, il interdit les
doublons puisqu'il nécessite une clé et celle-ci doit être unique. Un
exemple avec une collection (exécuter la proc "Appel" pour tester) :

Sub NbAleatoire(Optional Nombre As Integer = 200, Optional Max As Long =
100)

Dim Col As New Collection
Dim I As Integer
Dim Result As Integer

'Initialise le générateur de nombres aléatoires
Randomize

'si nombre est inférieur à Max + 100
'Défini Nombre à Max + 100 pour augmenter
'les possibilités
If Nombre < Max + 100 Then Nombre = Max + 100

'évite les erreurs des doublons de clés
On Error Resume Next

'boucle jusqu'à avoir le nombre d'éléments
'voulu par Max
Do
Result = Int((Nombre * Rnd) + 1)
Col.Add Result, CStr(Result)
Loop While Col.Count <> Max

'réinitialise le gestionnaire à zéro
On Error GoTo 0

'inscrit le résultat dans les cellules
'de la colonnes A
For I = 1 To Max
Cells(I, 1) = Col(I)
Next I

'effectue un tri croissant
Range(Cells(1, 1), Cells(I, 1)).Sort Range("A1"), xlAscending

'libère la mémoire
Set Col = Nothing

End Sub

Sub Appel()
NbAleatoire 18, 100
End Sub


Hervé.



news:
Bravo JB,

C'est exactement ce que je souhaitais,

Je vais quand même essayer de comprendre la méthode (nouvelle pour
moi) du mondico ......

Merci encore de ta contribution toujours pertinente,

je continue à travailler, et reviendrai sans doute .... sous peu

Bon samedi et à peut etre à bientot

SYLVBA
JB
Le #18952371
L'objet Collection est très lent. Il ne pas faut pas l'utiliser.

JB
On 21 mar, 20:14, Hervé
Bonsoir Sylvie et Jacques,

Je me permet de mettre mon grain de sel ;o)

Sylvie , le dictionnaire est un peu comme les collections, il interdit le s
doublons puisqu'il nécessite une clé et celle-ci doit être unique. Un
exemple avec une collection (exécuter la proc "Appel" pour tester)  :

Sub NbAleatoire(Optional Nombre As Integer = 200, Optional Max As Long =
100)

    Dim Col As New Collection
    Dim I As Integer
    Dim Result As Integer

        'Initialise le générateur de nombres aléatoires
    Randomize

        'si nombre est inférieur à Max + 100
        'Défini Nombre à Max + 100 pour augmenter
        'les possibilités
    If Nombre < Max + 100 Then Nombre = Max + 100

        'évite les erreurs des doublons de clés
    On Error Resume Next

        'boucle jusqu'à avoir le nombre d'éléments
        'voulu par Max
    Do
        Result = Int((Nombre * Rnd) + 1)
        Col.Add Result, CStr(Result)
    Loop While Col.Count <> Max

        'réinitialise le gestionnaire à zéro
    On Error GoTo 0

        'inscrit le résultat dans les cellules
        'de la colonnes A
    For I = 1 To Max
        Cells(I, 1) = Col(I)
    Next I

        'effectue un tri croissant
    Range(Cells(1, 1), Cells(I, 1)).Sort Range("A1"), xlAscending

        'libère la mémoire
    Set Col = Nothing

End Sub

Sub Appel()
    NbAleatoire 18, 100
End Sub

Hervé.

Bravo JB,

C'est exactement ce que je souhaitais,

Je vais quand même essayer de comprendre la méthode (nouvelle pour
moi) du mondico ......

Merci encore de ta contribution toujours pertinente,

je continue à travailler, et reviendrai sans doute .... sous peu

Bon samedi et à peut etre à bientot

SYLVBA


LSteph
Le #18954271
Bonjour,

Si on utilise Option Explicit et que l'on déclare correctement ses
variables...
une collection ne doit pas effrayer!
En l'occurence c'est un cas d'école qu'a choisi Hervé pour l'explication.
Encore faut-il comprendre !

Salutations.

--
lSteph

JB a écrit :
L'objet Collection est très lent. Il ne pas faut pas l'utiliser.

JB
On 21 mar, 20:14, Hervé
Bonsoir Sylvie et Jacques,

Je me permet de mettre mon grain de sel ;o)

Sylvie , le dictionnaire est un peu comme les collections, il interdit les
doublons puisqu'il nécessite une clé et celle-ci doit être unique. Un
exemple avec une collection (exécuter la proc "Appel" pour tester) :

Sub NbAleatoire(Optional Nombre As Integer = 200, Optional Max As Long >> 100)

Dim Col As New Collection
Dim I As Integer
Dim Result As Integer

'Initialise le générateur de nombres aléatoires
Randomize

'si nombre est inférieur à Max + 100
'Défini Nombre à Max + 100 pour augmenter
'les possibilités
If Nombre < Max + 100 Then Nombre = Max + 100

'évite les erreurs des doublons de clés
On Error Resume Next

'boucle jusqu'à avoir le nombre d'éléments
'voulu par Max
Do
Result = Int((Nombre * Rnd) + 1)
Col.Add Result, CStr(Result)
Loop While Col.Count <> Max

'réinitialise le gestionnaire à zéro
On Error GoTo 0

'inscrit le résultat dans les cellules
'de la colonnes A
For I = 1 To Max
Cells(I, 1) = Col(I)
Next I

'effectue un tri croissant
Range(Cells(1, 1), Cells(I, 1)).Sort Range("A1"), xlAscending

'libère la mémoire
Set Col = Nothing

End Sub

Sub Appel()
NbAleatoire 18, 100
End Sub

Hervé.

Bravo JB,

C'est exactement ce que je souhaitais,

Je vais quand même essayer de comprendre la méthode (nouvelle pour
moi) du mondico ......

Merci encore de ta contribution toujours pertinente,

je continue à travailler, et reviendrai sans doute .... sous peu

Bon samedi et à peut etre à bientot

SYLVBA





sylvie.laurent82
Le #18954641
Merci à Hervé pour cette explication, je planche, je planche .....

entre le site de JB et cette explication, je devrai etre capable (je
ne suis pas blonde !!!) de comprendre et d'appliquer une partie des
possibilités de cette nouvelle façon de faire !!

dans ma question d'origine, je souhaitai aussi lister dans une autre
colonne le départements absents (ceux donc il n'y aurait pas de CA)

un for i = 1 to 95

'ici un code qui compare les département de 1 à 95 avec ceux présents
dans la colonne A et aui donne ceux qui ne le sont pas ???

next i
'ici écrire dans la colonne F par exemple.

j'ai utilisé le code de JB avec les 3 loop pour info, comment faire
une version "deluxe" avec l'indication des départements à 0 ?

En tout cas merci encore à vous, c'est toujours un plaisir et en plus
on finit par comprendre !!!

SYLVBA
Publicité
Poster une réponse
Anonyme