VBA : Ubound Lbound

Excel-lent

XLDnaute Barbatruc
Bonjour à tous,

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?

Vous en remerciant par avance.
 

Pièces jointes

  • Test comparaison listes.xls
    37 KB · Affichages: 204
  • Test comparaison listes.xls
    37 KB · Affichages: 204
  • Test comparaison listes.xls
    37 KB · Affichages: 212

jp14

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour

BdCltExcel = Sheets("BD Clt").Range("A2:A" & DerLigneBdExcel) n'est pas un tableau,

Si j'ai bien compris, il faut écrire
Dim BdCltExcel As Range
Dim cel As Range

Set BdCltExcel = Sheets("BD Clt").Range("A2:A" & DerLigneBdExcel)

For Each cel In BdCltExcel


Next cel

JP
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour Jp14,

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)

Merci encore
 

Pièces jointes

  • Test comparaison version d'origine.zip
    25 KB · Affichages: 122

Fo_rum

XLDnaute Accro
Re : VBA : Ubound Lbound

Salut

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
 

CBernardT

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour Excel-lent et le forum,


Essayes avec cette syntaxe :

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
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Re...
Code:
[COLOR="DarkSlateGray"][B]
BdCltExcel = Sheets("BD Clt").Range("A2:A" & DerLigneBdExcel).[COLOR="Red"]Value[/COLOR]
BdCltSifret = Sheets("SIFRET").Range("A5:A" & DerLigneBdSifret).[COLOR="Red"]Value[/COLOR][/B][/COLOR]
élimine l'incompatibilité de type.​
ROGER2327
#2081
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour Jp14, le fil,

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é :
Code:
ObjectCltExcel.[B][COLOR="Red"]Add[/COLOR][/B]Item(BdCltExcel(n, 1)) = Sheets("SIFRET").Cells(n + 4, 1)

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!

Merci d'avance à tous pour vos suggestions!
 

Excel-lent

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour à tous,

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

Merci d'avance pour tout
 

Pièces jointes

  • Test comparaison listes.xls
    38.5 KB · Affichages: 151
  • Test comparaison listes.xls
    38.5 KB · Affichages: 146
  • Test comparaison listes.xls
    38.5 KB · Affichages: 154
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : VBA : Ubound Lbound

Bonjour à tous

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

bon après midi
@+
 

Discussions similaires

Statistiques des forums

Discussions
312 194
Messages
2 086 066
Membres
103 110
dernier inscrit
Privé