XL 2010 [RESOLU]Transformer Procédure en Fonction Générique

cathodique

XLDnaute Barbatruc
Bonjour,

Je viens vers vous pour un truc que je ne maîtrise pas correctement.
je voudrais transformer ma procédure (module userform) en fonction générique (module standard) pour être utilisable depuis différents userforms.
Présentement, Le résultat est envoyé dans une textbox. Je voudrais avoir le résultat dans une variable.

Je pense que ça sera plus explicite en consultant le fichier joint.

En vous remerciant par avance.
 

Pièces jointes

  • Fonction_Combien.xlsm
    29.2 KB · Affichages: 12

vgendron

XLDnaute Barbatruc
Bonjour
pourquoi remplacer des textbox (ton fichier origine) par des combo (ton fichier posté)
ca n'a rien à voir dans la manière de les remplir..

en plus tu dis que la source est une listview.. dans le fichier proposé.. elle est ou la source?

il faut que ton fichier soit "Représentatif" de ton fichier d'origine..
 

vgendron

XLDnaute Barbatruc
ci joint un exemple
deux formulaires qui appellent la meme sub
la sub charge le textbox passé en paramètre ET met une donnée dans une variable globale
la variable globale est utilisée directement par le formulaire pour charger le tbx 2
 

Pièces jointes

  • Fonction_Combien.xlsm
    29.3 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Bonsoir.
Moi j'ai une fonction SujetCBx utilisable dans n'importe quel UserForm.
On lui spécifie un tableau ou une plage verticale d'une seule colonne, typiquement un DataBodyRange de ListColumn.
Elle renvoie un Variant contenant deux éléments, le 0 et le 1.
Le 0 peut être directement affecté à une List de ComboBox.
Le 1 contient un table de listes de numéros de lignes où les éléments du 1 ont étés trouvés …
Et quand il y a plusieurs ComboBox, je les confie à un objets ComboBoxLiées qui se charge de tout et, en se servant du module de service contenant la fonction dont je parlais au début, sait retrouver les lignes comportant tout les élément choisis dans toutes les ComboBox dont on lui a confié la charge. C'est rapide et d'un emploi très facile avec mise au point rapide tant qu'on ne cherche pas à comprendre comment ça fonctionne …
 

cathodique

XLDnaute Barbatruc
Bonsoir @vgendron ,

Il ne m'est pas possible de joindre mon véritable (données confidentielles).

J'ai fait un fichier pour que l'on m'aide à transformer ma procédure qui donne des résultats justes.

Elle se trouve dans le module de l'userform ci-dessous
VB:
Sub Combien()
Dim i As Long
'   Tb = [TbAfectAnimal].Value
   Set d = CreateObject("scripting.dictionary")
   For i = LBound(Tb) To UBound(Tb)
      If Tb(i, 5) = ComboBox2 And Tb(i, 4) = ComboBox1 Then
         d(Tb(i, 2)) = d(Tb(i, 2)) + 1
      End If
   Next i
   Resultat = d.Count
End Sub

Merci
 

cathodique

XLDnaute Barbatruc
Bonsoir.
Moi j'ai une fonction SujetCBx utilisable dans n'importe quel UserForm.
On lui spécifie un tableau ou une plage verticale d'une seule colonne, typiquement un DataBodyRange de ListColumn.
Elle renvoie un Variant contenant deux éléments, le 0 et le 1.
Le 0 peut être directement affecté à une List de ComboBox.
Le 1 contient un table de listes de numéros de lignes où les éléments du 1 ont étés trouvés …
Et quand il y a plusieurs ComboBox, je les confie à un objets ComboBoxLiées qui se charge de tout et, en se servant du module de service contenant la fonction dont je parlais au début, sait retrouver les lignes comportant tout les élément choisis dans toutes les ComboBox dont on lui a confié la charge. C'est rapide et d'un emploi très facile avec mise au point rapide tant qu'on ne cherche pas à comprendre comment ça fonctionne …
Bonsoir @Dranreb ,

J'apprécie beaucoup ta main tendue pour m'aider.
Cependant, ayant sans succès fait beaucoup d'efforts pour comprendre tes codes, certes très efficaces.
Je dois comprendre un minimum sinon je n'adhère pas.
Si aucune solution, dont je comprendrai un minimum. Je la mettrai dans chaque userform.
Merci beaucoup pour ta gentillesse.
 

job75

XLDnaute Barbatruc
Bonjour cathodique, vgendron, Bernard,

La fonction VBA dans Module4 :
VB:
Function Combien(Tableau As Range, colIdPerson%, colCat%, colNoDossier%, IdPerson$, Cat$)
Dim Tb, d As Object, i&
Tb = Tableau 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Tb)
    If Tb(i, colIdPerson) = IdPerson And Tb(i, colCat) = Cat Then d(Tb(i, colNoDossier)) = d(Tb(i, colNoDossier)) + 1
Next
Combien = d.Count
End Function
Elle est appelée dans l'UserForm par :
VB:
Private Sub ComboBox2_Change()
TextBox1 = Combien([TbA], 4, 5, 2, ComboBox1, ComboBox2)
End Sub
A+
 

Pièces jointes

  • Fonction_Combien.xlsm
    28.5 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Il faut demander ce que vous ne comprenez pas.
Là le code est vraiment très court :
VB:
Option Explicit
Private WithEvents CLs As ComboBoxLiées
Private Sub UserForm_Initialize()
   Set CLs = New ComboBoxLiées
   CLs.Plage Feuil3
   CLs.Add ComboBox1, "IdPerson"
   CLs.Add ComboBox2, "Cat."
   CLs.LMaxDropBtn = 150
   CLs.Actualiser
   End Sub
Private Sub CLs_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   TextBox1 = NbrLgn
   End Sub
 

Pièces jointes

  • CBxLiéesCathodique3.xlsm
    90.2 KB · Affichages: 4

job75

XLDnaute Barbatruc
La fonction du post #7 compte le nombre de chaque item mais n'utilise pas ce comptage.

Dans ce cas on peut donc simplifier la fonction :
VB:
Function Combien(Tableau As Range, colIdPerson%, colCat%, colNoDossier%, IdPerson$, Cat$)
Dim Tb, d As Object, i&
Tb = Tableau 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Tb)
    If Tb(i, colIdPerson) = IdPerson And Tb(i, colCat) = Cat Then d(Tb(i, colNoDossier)) = ""
Next
Combien = d.Count
End Function
 

Pièces jointes

  • Fonction_Combien.xlsm
    28.5 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re
bonsoir
ta sub combien est devenu une fonction dans le module standard
ta variable résultat bye!bye!
la fonction estt appelée avec 3 argument puisque qu'elle travaille avec un tableau et 2 valeurs
et le textbox = combien(tontableau,la combo1,la combo2)
terminé
1722795314343.png


ton textbox
VB:
Private Sub ComboBox2_Change()
TextBox1 = Combien(Tb, ComboBox1, ComboBox2)
End Sub
 

Pièces jointes

  • Fonction_Combien.xlsm
    24.3 KB · Affichages: 5

cathodique

XLDnaute Barbatruc
Messieurs Bonjour;),

Je vous remercie. Vos codes renvoient des résultats justes. Vous me mettez un peu dans l'embarras.
Quel post cocher comme solution?
Étant donné, qu'on ne peut cocher qu'un. Pour le moment, je mettrai seulement dans le titre du fil [RESOLU].

@patricktoulon : Merci beaucoup d'être présent dés que j'ai besoin d'aide.

@job75 : Merci beaucoup. j'ai pris mon temps pour tester vos différents codes. Mais surtout, l'exactitude du résultat. je n'ai encore atteint votre niveau. Peux-tu Stp, m'expliquer la différence entre ta fonction du post#7 et celle du post#9. Les lignes ci-dessous renvoient toutes deux des résultats justes.
VB:
'post#9'
If Tb(i, colIdPerson) = IdPerson And Tb(i, colCat) = Cat Then d(Tb(i, colNoDossier)) = ""

'post#7'
If Tb(i, colIdPerson) = IdPerson And Tb(i, colCat) = Cat Then d(Tb(i, colNoDossier)) = d(Tb(i, colNoDossier)) + 1

@Dranreb : Impressionnant! Mais je t'avoue que pour si peu je dois ajouter autant de code. Pour le moment, je ne suis pas prêt. Je te l'avais promis de faire un effort pour comprendre tes codes. Je dois surtout comprendre que fait chaque partie et comprendre comment les réutiliser. Hélas, je n'ai pas encore acquis assez de connaissances et d'expériences pour le faire. Bravo! pour ton travail. Avec tous mes remerciements.

@vgendron : Je te remercie d'avoir essayer de m'aider. C'est le geste qui compte.

Encore merci à vous tous.

Excellente journée.
 

Dranreb

XLDnaute Barbatruc
Bonjour
Il y a déjà considérablement plus de code en langage machine dans la bibliothèque Excel !
J'ai une page d'aide qui explique toutes les propriétés, méthodes et évènements du point de vue utilisation. Mais il ne faut pas s'obstiner à vouloir les comprendre de l'intérieur, ça ne sert à rien pour apprendre comment il convient de s'en servir.
Chaque truc il faut juste savoir ce que c'est, pas comment ça marche.
Et personne ne me pose jamais de question non plus.
Le mieux serait peut être que le document d'aide soit rédigé par un utilisateur me le soumettant au fur et à mesure de son élaboration chaque fois qu'il ne sait pas encore quoi mettre …
 
Dernière édition:

Discussions similaires

Réponses
13
Affichages
461

Membres actuellement en ligne

Statistiques des forums

Discussions
315 124
Messages
2 116 472
Membres
112 753
dernier inscrit
PUARAI29