Requête vba avec gestion de types

Blueangel

XLDnaute Junior
Bonsoir à tous,

Je reviens vers vous pour une requête en vba. Ci-dessous, mon projet :
Cijoint.fr - Service gratuit de dépôt de fichiers

Voici ce que je souhaite faire :
Dans le USF "Listing", je souhaite créer ma requête : "Classer les clients par Commandes (montant total ou plus grosse commande).

Ce que j'ai tenté (avec mon tout petit niveau en vba) :
Lorsque je clic sur "Ok" dans mon USF "Listing", cela m'ouvre un nouveau USF affichant un LisView contenant le résultat.
Dans un 1er temps mon USF s'affichait bien, mais mon ListView était vide (à part les en-têtes de colonnes).
Maintenant, j'ai un bug : "ARGUMENT NON FALCULTATIF"

En mettant des points d'arrêts, je me suis aperçu que mes tableaux restaient toujours vides !! D'après mes petites connaissances, je dirais que mon pb vient du passage en paramètre de mes différents tableaux. Mais je n'ai toujours pas encore bien saisie le fonctionnement.

J'espère avoir été assez clair dans mes explications, car à force de tout tourner dans tous les sens... je suis un peu (beaucoup) paumé.

D'avance merci pour vos réponses.

@+
Blueangel
 

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Bonjour à tous,

Je me permet de relancer mon sujet, car j'ai un mal de crâne pas possible. J'ai tout tenté aujourd'hui (sauf la bonne réponse, bien sûr!). Je ne cromprend pas pourquoi il ne se passe rien dans mes boucles et comment je doit déclarer les paramètres dans mes différentes fonctions.

J'espère que quelqu'un pourra me mettre sur une piste.

Merci
@+
Blueangel
 

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Re,

Voilà ! J'ai fait un fichier beaucoup plus light. Du coup, j'en ai profité pour revoir un peu ma copie. Et j'ai choisi une autre méthode (enfin, sensiblement la même mais découpée en 2 étapes), je m'explique :

Je clic sur un bouton --> Classement des clients par commandes dans une nouvelle feuille "Résultats" (cette feuille me servira d'état pour mes futures macros "impression" et "aperçu avant impression").
Ce résultat est ensuite transféré dans mon listview (seule partie visible par l'utilisateur qui n'a aucun accès aux feuilles excel) --> Je pense pouvoir me débrouiller tout seul pour cette partie.

Dans le fichier que je vous ai joint, j'ai une erreur de compilation : "L'objet associé à With doit être de type défini par l'utilisateur, Objet ou Variant"

Est-ce que quelqu'un pourrait m'aider à corriger ce bug, svp ? (Toutes mes tentatives se sont conclues par un échec)

D'avance merci.
@+
Blueangel
 

Pièces jointes

  • Test Requête.zip
    20.7 KB · Affichages: 52
  • Test Requête.zip
    20.7 KB · Affichages: 72
  • Test Requête.zip
    20.7 KB · Affichages: 54

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Re,

J'ai réussi !!! Ci-joint mon fichier pour ceux à qui ça peut servir.

@+
 

Pièces jointes

  • Test Requête.zip
    22.6 KB · Affichages: 64
  • Test Requête.zip
    22.6 KB · Affichages: 58
  • Test Requête.zip
    22.6 KB · Affichages: 64
G

Guest

Guest
Re : Requête vba avec gestion de types

Bonjour BlueAngel,

Merci à toi de faire profiter tout le monde de ce joli travail.

Je te propose pour afficher les résultats (commandButton1_Click) la macro suivante qui est plus rapide. Surtout si le nombre de lignes Clients doit augmenter.

En Fin de macro tu trouveras deux façons différentes de renseigner la colonne des sommes de commandes par client.

Une en mettant en un seul passage une formule (Somme.Si)dans les cellules pour n'en garder ensuite que la valeur (très rapide)

Une autre moins rapide qui fait une boucle et utilise l'équivalent VBA de 'Somme.Si'.
Code:
Private Sub CommandButton1_Click()
    Dim WsC As Worksheet
    Dim WsCo As Worksheet
    Dim WsR As Worksheet
    Dim plgC As Range, plgCo As Range, plgRes As Range
    Dim Som As Double
    Dim k As Long
 
    Set WsC = Worksheets("Clients")
    Set WsCo = Worksheets("Cdes")
    Set WsR = Worksheets("Résultat")
 
    Set plgC = WsC.Range("A1:K" & WsC.Cells(65536, 1).End(xlUp).Row) 'Plage clients
    Set plgCo = WsCo.Range("A1:F" & WsCo.Cells(65536, 1).End(xlUp).Row) 'Plage commandes
 
    Set plgC = plgC.Offset(1).Resize(plgC.Rows.Count - 1, plgC.Columns.Count) 'Plage clients sans l'entête
    Set plgCo = plgCo.Offset(1).Resize(plgCo.Rows.Count - 1, plgCo.Columns.Count) 'plage commandes sans l'entête
    'Vider la plage de résultat précédente
    WsR.UsedRange.Clear
 
    'Préparer la plage résultats ATTENTION la plage commence en B pour laisser la colonne A aux sommes
    Set plgRes = WsR.Range("B1").Resize(plgC.Rows.Count, plgC.Columns.Count)
 
    'Y mettre toutes les données clients d'un seul coup
    plgRes.Value = plgC.Value
 
    'Somme des totaux par formule pour n'en garder que les valeur
    With plgRes.Columns(1).Offset(, -1)
        .Cells.FormulaR1C1 = "=SUMIF('" & WsCo.Name & "'!" & plgCo.Columns(2).Address(True, True, xlR1C1) & ",'" & WsR.Name & "'!RC[1],'" & WsCo.Name & "'!" & plgCo.Columns(4).Address(True, True, xlR1C1) & ")"
        .Value = .Value 'Ne garde que les valeurs résultat
    End With
 
   'Somme des totaux par formule en bouclant sur la colonne
   ' k = 1
    'Pour toutes les cellules de la colonne 1 (id) de la plage clients
   ' For k = 1 To plgRes.Rows.Count
        'Faire calculer par excel (fonction de feuille somme.si) le montant totatl des commande pour l'iD client
   '     Som = Application.SumIf(plgCo.Columns(2), plgRes.Cells(k, 1), plgCo.Columns(4))
   '     WsR.Cells(k, 1) = Som
   ' Next
End Sub
A bientôt
 
Dernière modification par un modérateur:

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Bonjour Hasco,

Merci beaucoup pour cette optimisation de mon code. Je vais tester tout ça ce soir.
Je vais avoir d'autres requêtes du même type à faire (enfin... un peu plus pointues). Je les posterai ici afin d'en faire profiter tout le monde (difficile à trouver ce genres de requêtes sur la toile).

@+
Blueangel
 

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Bonjour Hasco, Bonjour Bebere,

Merci encore pour votre aide. Toutefois je rencontre 1 pb d'affichage avec votre code respectif :

- Je commence avec celui d'Hasco : le colonne Montant affiche "0" à chaque ligne. Je ne parviens pas à détecter le pb. Cela est sûrement dû au fait que je ne comprends pas trop la ligne de calcul de "Som" (même avec F1):

With plgRes.Columns(1).Offset(, -1)
.Cells.FormulaR1C1 = "=SUMIF('" & WsCo.Name & "'!" & plgCo.Columns(2).Address(True, True, xlR1C1) & ",'" & WsR.Name & "'!RC[1],'" & WsCo.Name & "'!" & plgCo.Columns(4).Address(True, True, xlR1C1) & ")"



- Concernant celui de Bebere : ma colonne "montant" est vide (???). De plus , dans l'élaboration de mon projet, les "exit for" (ou autres "go to"...) sont bannis. Je ne peux donc pas utiliser ton code tel qu'il est. Est-il beaucoup plus performant que celui de Hasco (ou le mien, lol)? ça vaut peut-être le coup que je me penche dessus pour supprimer le "exit for".

@+
Blueangel
 

Bebere

XLDnaute Barbatruc
Re : Requête vba avec gestion de types

dans une boucle si tu recherches une ligne précise et elle est trouvée tu sors de la boucle
continuer est inutile
Met ta feuille en ordre la colonne montant est en texte .pour t'en persuader sélectionnes les données et en bas à droite tu dois avoir la somme.Compare les feuilles cdes,tu comprendras.Pour les dates aussi.LIs le code du bouton ajouter
à bientôt
 
G

Guest

Guest
Re : Requête vba avec gestion de types

bonjour BleuAngel,
Bebere:)

Voici ton fichier avec la macro donnée plus haut. Celle-ci mets en une seule passe une formule Somme.Si dans la colonne et n'en conserve que les valeurs.

Tu verras que c'est vraiment très rapide.

A+
 

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

Re,

Merci beaucoup à vous 2.
En effet Hasco, c'est super rapide !!
Super Bebere !! merci pour les différents ajouts. Le combobox dans G_Com est génial (j'y avais pensé, mais vu le temps qu'il me reste... je comptais voir ça à la fin : cool !! Merci).
J'ai corrigé mon code et mon classeur concernant les formats. La colonne montant se remplie bien maintenant. Par contre, je n'ai plus le sigle "€" dans mes listView (ni dans ma feuille Cdes). Comment puis-je remédier à cela ?

Je vais mettre mon programme à jour en mixant tout ça.

Encore merci.
@+
Blueangel
 

Blueangel

XLDnaute Junior
Re : Requête vba avec gestion de types

C'est encore moi ! :)

Petite question pour Hasco : dans ton code, tu intègres bien le format monétaire dans la colonne "Montant". Je ne parvient pas à le dupliquer à mon listview G_Com. Peux-tu me renseigner stp ?

Voici le code correspondant au contenu du listview :

Private Sub IniListview(Tbl As Variant) 'contenu de la listView

With ListView1
.ListItems.Clear
For l = 1 To UBound(Tbl, 1)
.ListItems.Add , , Tbl(l, 1)
For c = 2 To UBound(Tbl, 2)
.ListItems(.ListItems.Count).ListSubItems.Add , , Tbl(l, c)
Next
Next
End With

End Sub


Merci de ton aide.
@+
 
G

Guest

Guest
Re : Requête vba avec gestion de types

Bonjour,
Peut-être comme ceci:
VB:
With ListView1
.ListItems.Clear
For l = 1 To UBound(Tbl, 1)
.ListItems.Add , , Format(.Tbl(i, 1), "# ##0.00")
For c = 2 To UBound(Tbl, 2)
.ListItems(.ListItems.Count).ListSubItems.Add , , Tbl(l, c)
Next
Next
End With

Utilise la balise
Code:
(le bouton '#" de l'éditeur de post pour publier tes codes.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 089
Membres
103 464
dernier inscrit
Inconnu2