Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Concernant mon précédant fil, j'ai opté pour la solution qui me semblait la plus rapide dans mon cas de figure et que j'arrivais à comprendre.
Mais il semble que non!?!?! Car dés que je sors la macro de son contexte pour l'adapter à mon cas, j'ai un bug!!!
Pourtant j'ai tout décortiqué ligne par ligne, mot par mot, remplacé les variables à la main, avec la fonction "remplacer", j'ai recommencé à zéro plusieurs fois de différentes façon, ... mais rien n'y fait, toujours ce bug : "incompatibilité de type"!!!
Quelqu'un peut m'aider à trouver où se situe mon erreur?
Tout d'abord, un grand merci pour ta réponse ainsi que pour sa rapidité.
En effet, étant donné mes grosses lacunes concernant les tableaux, de moi-même j'aurais utilisé la même méthode que toi.
Mais la méthode des tableaux (avec une colonne) est beaucoup plus rapide! C'est pourquoi je profite de l'occasion pour combler mes lacunes dans ce domaine en essayant de comprendre et adapter cette macro, qui dans son environnement naturelle fonctionne très bien! (cf. fichier ci-joint)
Essaie de supprimer simplement la partie en gras :
Code:
Dim ObjectCltExcel As Object, ObjectCltSifret As Object
Dim [B]BdCltExcel() As Variant, BdCltSifret() As Variant,[/B] n As Long
Dim DerLigneBdExcel As Long
Dim DerLigneBdSifret As Long
Sub MacroAdapté()
Dim DerLigneBdExcel As Long, DerLigneBdSifret As Long
Dim ObjectCltExcel As Object, BdCltExcel, BdCltSifret, n As Long
Application.ScreenUpdating = False
DerLigneBdExcel = Sheets("BD Clt").[A65536].End(xlUp).Row
DerLigneBdSifret = Sheets("SIFRET").[A65536].End(xlUp).Row
Set ObjectCltExcel = CreateObject("Scripting.Dictionary")
BdCltExcel = Sheets("BD Clt").Range("A2:A" & DerLigneBdExcel)
BdCltSifret = Sheets("SIFRET").Range("A5:A" & DerLigneBdSifret)
For n = 1 To UBound(BdCltExcel, 1)
ObjectCltExcel.Item(BdCltExcel(n, 1)) = BdCltExcel(n, 1)
Next
For n = 1 To UBound(BdCltSifret, 1)
If Not ObjectCltExcel.Exists(BdCltSifret(n, 1)) Then
Sheets("SIFRET").Cells(n + 4, 1).Interior.ColorIndex = 6
End If
Next
End Sub
Merci pour ta réponse, mais je vais quand même prendre la solution de Roger2327.
Car avec cette solution je n'ai pas besoin de sélectionner les feuilles, choses qui normalement permet à la macro de tourner plus vite!
Sinon, concernant la macro, je l'ai compliqué légèrement!
Au lieu de colorier la cellule en jaune, une UserForm s'ouvre, demandant toutes les informations du Client : UserFormNouveauClt
Puis la macro les rajoutes dans la base de donnée client Excel.
Ainsi si plus bas, la macro trouve à nouveau ce même client, il ne doit plus redemander les informations!
Donc il faut que dans l'object : ObjectCltExcel, je rajoute cette nouvelle valeur!
Au début je croyais que comme pour la fonction Combobox, je pourrais faire avec object un truc du genre : ComboBoxDélaisPaiement.AddItem, alors j'ai essayé :
Mais la fonction Additem ne semble pas fonctionner avec les Object
Je suis sûr qu'il existe une astuce dans ce sens, toute bête, mais je ne la trouve pas!!!
Vous la connaissez?
Ne voulant pas vous déranger, j'ai voulu faire ainsi :
Code:
Dim ObjectCltExcel As Object, ObjectCltSifret As Object
Dim BdCltExcel() As Variant, BdCltSifret() As Variant, n As Long, m As Long
Dim DerLigneBdExcel As Long, DerLigneBdSifret As Long
DerLigneBdExcel = Sheets("BD Clt").[A65536].End(xlUp).Row
DerLigneBdSifret = Sheets("SIFRET").[A65536].End(xlUp).Row
Set ObjectCltExcel = CreateObject("Scripting.Dictionary")
Set ObjectCltSifret = CreateObject("Scripting.Dictionary")
BdCltExcel = Sheets("BD Clt").Range("A2:A" & DerLigneBdExcel).Value
BdCltSifret = Sheets("SIFRET").Range("A5:A" & DerLigneBdSifret).Value
For n = LBound(BdCltExcel, 1) To UBound(BdCltExcel, 1)
ObjectCltExcel.Item(BdCltExcel(n, 1)) = BdCltExcel(n, 1)
Next n
For n = LBound(BdCltSifret, 1) To UBound(BdCltSifret, 1)
If Not ObjectCltExcel.Exists(BdCltSifret(n, 1)) Then
Nvx_Clt_Nom_SIFRET = Sheets("SIFRET").Cells(n + 4, 1)
UserFormNouveauClt.Show
[COLOR="Green"] ' <début> rajout de la nouvelle valeur dans ObjectCltExcel[/COLOR]
DerLigneBdExcel = DerLigneBdExcel + 1
For m = LBound(BdCltExcel, 1) To UBound(BdCltExcel, 1)
ObjectCltExcel.Item(BdCltExcel(m, 1)) = BdCltExcel(m, 1)
Next m
[COLOR="Green"] ' <fin> rajout de la nouvelle valeur dans ObjectCltExcel[/COLOR]
End If
Next n
End Sub
Vous remarquerez que j'ai :
-> rajouté la partie entre les deux lignes vertes
-> enlevé : Application.ScreenUpdating = False et Application.ScreenUpdating = True, car comme mes données se renseignaient qu'à la fin, mon rajout (entre les deux lignes vertes) ne servait à rien puisque la base de donnée ne se complétait pas entre temps (via la macro dans l'UserForm : UserFormNouveauClt)!
Cela me semblait ok! Mais voila... ça ne fonctionne pas!!! Les valeurs contenue dans ObjectBdExcel ne semble pas changer!
Quelqu'un a une idée?
Remarque : en effet, la partie entre les deux lignes vertes fait doublons avec la partie supérieur : donc je pourrais faire une "sous-macro" pour raccourcir le code, mais encore faudrait-il que cela fonctionne déjà ainsi!
Pour que mon explication soit plus clair, voici ci-joint le cas ci-dessus re-transcrit et adapté au premier fichier envoyé (cf. ci-joint)
Vous remarquerez qu'actuellement, lorsqu'on lance la macro ("macro modifié"), la liste sur l'onglet "Bd Clt", se compléte bien avec les nouvelles valeurs, mais voilà... lorsque la valeur a déjà été rajouté juste avant, elle est de nouveau rajouté.
Bien sûr, je pourrais retraiter ma base en enlevant les doublons, mais je préfère mieux ne pas faire ainsi (méthode trop lourde)!
Si la fonction ObjectCltExcel.AddItem n'existe pas sous cette forme ou une autre et que je n'arrive pas à faire fonctionner la macro ci-dessus, tant pis, au pire des cas j'utiliserais la fonction COUNT.IF
pas tout suivi, loin de là, simplement pour signaler qu'à ma connaissance "additem" n'est pas applicable à un "dictionary", il faut utiliser la méthode "Add", qui comporte 2 arguments, la clé et l'item, voir exemple ci-dessous :
Code:
Dim ObjectCltExcel As Object
Set ObjectCltExcel = CreateObject("Scripting.Dictionary")
ObjectCltExcel.Add Range("A1").Value, Range("A1").Value
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.