Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Aide Scripting.Dictionary

cathodique

XLDnaute Barbatruc
Bonjour la communauté,

Je sollicite votre aide. Je vous précise que mes connaissances en VBA sont des plus limités. J'ai donc récupéré, un code de Robert qui fonctionne bien. Il me permet de récupèrer des données d'une feuille source vers des feuilles de destination sans doublons (source colonne B vers Destination colonne A). Je voudrais compléter ce transfert comme ceci: source colonnes F et G vers Destination colonnes B et C. Je vous remercie d'avance. Avec les exemples de Boisgontier, j'ai bien compris la logique du code avec l'objet scripting.dictionary et suis parvenu à réaliser des formulaires avec bombobox, listbox et textbox en cascade. Par contre, là je nage vraiment.
Code:
Sub essai3()
Dim bd As Object '(onglet BD)
Dim dico As Object '(DICtiOnnaire)
Dim dl As Integer '(Dernière Ligne)
Dim pl As Range 'PLage)
Dim cel As Range '(CELlule)
Dim temp As Variant '(tableau TEMPoraire)
Dim i As Integer '(Incrément)
Dim dics As Object 'DICtionnaireS)
Dim o As Object '(Onglet)
Dim teo As Variant '(tableau TEmporaire Outils)
Dim x As Integer 'variable x
Dim y As Integer 'variable y
Dim dercol As Integer '(Dernière colonne)

Set bd = Sheets("Consultation") 'définit l'onglet bd
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'dernière ligne éditée dl de la colonne 1 (=A) de l'onglet bd
Set pl = bd.Range("B8:B" & dl) 'définit la plage pl

For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon dans le tableau temp

For i = 0 To UBound(temp) 'boucle 1 : sur toutes les valeurs uniques du tableau temp
    Set o = Sheets(temp(i)) 'définit l'onglet o
    o.UsedRange.Clear 'efface les anciennes données
    o.UsedRange.MergeCells = False
    
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i) 'filtre automatique sur la colonne 2 (=B) avec la valeur   temp(i) comme critère

    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
        For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        dics(cel.Value) = "" 'alimente le dictionnaire dics
    Next cel 'prochaine cellule de la boucle 2
    
    o.Range("A8").Resize(dics.Count) = Application.Transpose(dics.keys) 'renvoie en colonne à partir de A2 la liste des outils sans doublons
     
    bd.Range("A1").AutoFilter 'annule le filtre automatique
Next i 'prochaine valeur de la boucle 1
End Sub

Je vous remercie beaucoup.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Aide Scripting.Dictionary

Bonsoir cathodique, hola Robert,

Je m'immisce dans ce fil car le "Sripting.Dictionary" m'a l'air d'un truc "macanudo" dans bien des situations, même si ce n'est toujours pas très clair dans mon esprit...
(une petite leçon particulière peut-être...).
Dans la pj de votre post #6 vous dites que vous ne parvenez pas à récupérer le nom d'un onglet dans une formule.
Un exemple de fonction (récupérable dans une formule) le permettant :

VB:
Function NomOnglet(plage As Range) As String
'Récupère le nom de l'onglet de la feuille où se trouve
'la cellule ou la plage de cellules "plage"
On Error Resume Next
   NomOnglet = plage.Parent.Name
On Error GoTo 0
End Function

Bonne soirée
 

Pièces jointes

  • Dictionary-Transfert-ter.xlsm
    40.2 KB · Affichages: 56

cathodique

XLDnaute Barbatruc
Re : Aide Scripting.Dictionary

Bonsoir Robert,

Trop modeste. Allez! je rectifie le tir, je voulais dire que par rapport à moi, tu maîtrise mieux que moi le VBA et tu as beaucoup de mérite. J'ai galéré des jours durant sans y parvenir. Bravo!

Dès que j'ai reçu ton code, je l’exécute en mode pas à pas pour bien le comprendre et ce, malgré qu'il soit bien commenté. Je t'en félicite car très peu de gens le font surtout sur les forums.

J'ai déjà fait des tests pour insérer mes formules sans succès. Je les ai insérées dans la dernière boucle mais je sens que ça ne va être simple car sur la même ligne de destination, une colonne (potentiel) prend sa valeur de la colonne I de la feuille source et la colonne (courant) de la colonne J.

Je voudrais ton avis, est-ce que tu penses que c'est réalisable ou dois-je monter une macro indépendante et faire un "Call" et fin de procédure?

Je remercie beaucoup, la modestie est une grande qualité, c'est tout à ton honneur.

Bonne soirée!
 

cathodique

XLDnaute Barbatruc
Re : Aide Scripting.Dictionary

Bonsoir Magic_Doctor,

Pas la peine de t'excuser, on est sur un forum et personnellement j'accepte toutes interventions constructives. Ta fonction, je la mets dans ma "tire-lire", tout peu servir un jour ou l'autre. Et t'en remercie beaucoup.

J'ai trouvé ces formules sur le net:
pour afficher le nom de l'onglet dans une cellule:
=STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;20)

pour le nom du classeur:
'=STXT(CELLULE("nomfichier");TROUVE("[";CELLULE("nomfichier"))+1;TROUVE("]";CELLULE("nomfichier"))-TROUVE("[";CELLULE("nomfichier"))-1)

pour le chemin complet du classeur:
'=CELLULE("nomfichier")

Je te remercie beaucoup. Bonne soirée!
 

cathodique

XLDnaute Barbatruc
Re : Aide Scripting.Dictionary

Rebonsoir Magic_Doctor,

Je viens de consulter le fichier. Ce n'est pas l'insertion du nom de l'onglet dans une cellule dont il s'agit.
Je suis débutant en VBA. J'ai donc fait appel à de l'aide sur le forum. Robert m'a demandé de joindre un fichier pour mieux comprendre ce que je voulais obtenir. Donc, sur la feuille "résultat_Olc", j'ai mis ces formules pour récupérer des données de la feuille "Consultation" et dans une partie de celle-ci, elles font références au nom de l'onglet. Comme, je ne sais si c'est faisable sur Excel, j'ai fait un changement de référence en mettant le nom de l'onglet rapidement dans une cellule. je sais qu'en VBA c'est réalisable.

Le but maintenant et d’insérer ces formules dans le code VBA.

Je te remercie.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Aide Scripting.Dictionary

Dans la feuille "Olc" sélectionnez, par exemple, la cellule A1. Donnez-lui un nom, par exemple, "OngletOlc".
Dans une procédure VBA si vous écrivez : x = NomOnglet(OngletOlc), x prendra la valeur "Olc"
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…