Macro utilisant 2 classeurs

Bonjour ,

actuellement en stage et débutant en vba j'aurai besoin d'une grosse aide sur un problème qui me prend la tête depuis 2 jours, je sens que la réponse et simple mais je ne la trouve pas:

-2classeurs

-si A1 de classeur1 (mais doit aller jusque A250) = une des valeurs de la colonne F(donc il faudrait pouvoir parcourir toute cette colonne) de classeur 2 alors on copie la valeur AF de classeur 2 à la ligne correspondante de A mais en E de classeur1 (donc en E1 ici)

Voila 2 jours que je cherche partout après échec de ma part à le réaliser moi même la principale difficulté étant la référence a un autre classeur et le parcours de tout une colonne pour trouver la valeur correspondant a une cellule d'un autre classeur.

En vous remerciant de me faire profiter de votre savoir faire.

Bonjour,

A partir du classeur qui contient ta macro, celle-ci doit ouvrir l'autre classeur lorsque tu la lances...

Qu'est-ce qui te coince ?

Ferrand

tout d'abord merci pour une réponse si rapide,

non pas nécessairement mais ce n'est pas dérangeant s'il doit être ouvert

en faite je n'ai pas encore une l'occasion de bosser sur des macros qui impliquent plusieurs classeurs a la fois donc niveau syntaxe Jai du mal j'ai trouvé pas mal d'éléments de réponse mais je n'arrive pas à les faire coïncider, la ou je coince c'est sur la condition if ou je dois faire appel a l'autre classeur encore je peux trouver la syntaxe mais j'ai eu une erreur 9 est -ce du justement au fait que je n'ai pas préalablement ouvert le fichier? et aussi je n'arrive pas à mettre en forme la comparaison de chaque élément de ma colonne A à tous les élément de F de mon autre classeur à leur attribuer inviduellement sur la meme ligne en E(classeur1) la valeur de AF(classeur 2) par exemble si en A j'ai amerique je souhaite parcourir F de mon classeur 2 et si je tombe sur amerique aller chercher la valeur AF de cette même ligne et la coller en E de mon classeur 1 j'aimerai bien fournir les doc mais je ne suis pas sur d'en avoir le droit

Merci de me suivre en tout cas !

petite précision mes noms de classeurs comportent des espaces le bug 9 peut il etre du à ça?

If Application.Workbooks("GF TM Aero format.xlsx").Worksheets("RateSheet").Range("F" & i).Value = Application.Workbooks("AeroTM Origin destination charges format.xlsm").Worksheets("PricingSheet").Range("A" & j).Value Then

ici j'ai une erreur a cause de la refernece a A de mon AeroTM je ne comprends pas pourtant le fichier est bien ouvert

Si tu appelles un élément non présent dans l'application, c'est souvent une erreur 9, elle concerne les dépassements d'indices mais s'applique à tous les index permettant d'individualiser un objet dans une collection, et donc aux noms quand ces dernier sont utilisés. Tu as cherché un nom de classeur non ouvert dans l'application...

Pour le reste, sans avoir regardé dans le détail, c'est un système de boucles qui devrait te permettre de résoudre la question. Décompose pas à pas la méthode pour réaliser manuellement, une fois circonscrit la première opération de la chaîne, tu la fais se répéter jusqu'à la fin. Sans classeur modèle, difficile de donner des indications concrètes.

A+

Ferrand

j'indique ici ma macro je pense que certains éléments sont inutiles ici mais j'essaye tout ce que je peux pour résoudre ce problème de bug 9, bien à vous .

Sub Macro3()

NameWorkbook = ActiveWorkbook.Name

Workbooks.Open Filename:=ThisWorkbook.Path & "\GF TM Aero format.xlsx", Local:=True

Windows(NameWorkbook).Activate

Windows("GF TM Aero format.xlsx").Activate

Worksheets("RateSheet").Select

For j = 6 To 250

For i = 5 To 994

If Application.Workbooks("GF TM Aero format.xlsm").Worksheets("RateSheet").Range("F" & i).Value = Application.Workbooks("AeroTM Origin destination charges format.xlsm").Worksheets("Pricingformat").Range("A" & j).Value Then

Application.Workbooks("AeroTM Origin destination charges format.xlsm").Worksheets("Pricingformat").Range("E" & j).Value = Application.Workbooks("GF TM Aero format.xlsx").Worksheets("RateSheet").Range("AF" & i).Value

j = j + 1

End If

Next i

Next j

End Sub

Re,

Ya de quoi épurer :

Sub Macro3()

Dim WsRS as Worksheet, i As Integer, j As integer 'mieux de déclarer ses variables

'NameWorkbook = ActiveWorkbook.Name

Workbooks.Open Filename:=ThisWorkbook.Path & "\GF TM Aero format.xlsx" ', Local:=True

Set WsRS = ActiveWorkbook.Worksheets("RateSheet")

' tu n'as pas besoin du nom de ton ThisWorkbook, et une variable feuille pour la feuille

' classeur de recherche évitera de patauger dans des lignes à rallonge

'Windows(NameWorkbook).Activate

'Windows("GF TM Aero format.xlsx").Activate

'Worksheets("RateSheet").Select

' inutile, sauf si tu trouves que VBA va trop vite et qu'il faut le ralentir !!!

With ThisWorkbook.Worksheets("Pricingformat")

' ça évitera de le répéter, et VBA ne stocke l'info qu'une fois

For j = 6 To 250

For i = 5 To 994

'If Application.Workbooks("GF TM Aero format.xlsm").Worksheets("RateSheet").Range("F" & i).Value = Application.Workbooks'("AeroTM Origin destination charges format.xlsm").Worksheets("Pricingformat").Range("A" & j).Value Then

' Application.Workbooks("AeroTM Origin destination charges format.xlsm").Worksheets("Pricingformat").Range("E" & j).Value = 'Application.Workbooks("GF TM Aero format.xlsx").Worksheets("RateSheet").Range("AF" & i).Value

' j = j + 1

'End If

If WsRS.Cells(i, 6).Value = .Cells(j, 1).Value Then .Cells(j, 5).Value = WsRS.Cells(i, 32).Value

'c'est déjà plus léger !

Next i

Next j

End With

End Sub

Si je n'ai pas inversé les classeurs...

Bonne continuation

Ferrand

Je reviens pour restituer la partie utile. Tout à l'heure j'ai modifié directement dans le post, et cela m'a permis de vérifier (sauf erreur d'interprétation et confusion entre les classeurs et les cellules testées mais tu pourras vérifier et rectifier facilement).

Avec indentation (j'ai l'impression que ça se perd, pourtant qu'est-ce qu'on lit mieux le code quand c'est indenté !)

Sub Macro3()
    Dim WsRS As Worksheet, i As Integer, j As Integer
    Workbooks.Open ThisWorkbook.Path & "\GF TM Aero format.xlsx"
    Set WsRS = ActiveWorkbook.Worksheets("RateSheet")
    With ThisWorkbook.Worksheets("Pricingformat")
        For j = 6 To 250
            For i = 5 To 994
                If WsRS.Cells(i, 6).Value = .Cells(j, 1).Value Then _
                 .Cells(j, 5).Value = WsRS.Cells(i, 32).Value
            Next i
        Next j
    End With
End Sub

En déclaration tu peux aussi écrire i% et j% pour déclarer des variables de type Integer, cela peut être utile (surtout si tu as un nombre conséquent de variables à déclarer.

Lorsque tu ouvres un classeur il devient le classeur actif, tu peux donc le récupérer avec ActiveWorkbook.

NB: si le classeur est déjà ouvert tu auras un message... pour l'éviter tu peux inhiber avec

Application.DisplayAlerts = False et rétablir à True ensuite.

Les arguments nommés ont une utilité lorsqu'il y en a beaucoup et que tu n'en utilises que peu et vers la fin de la liste (ou pour tes besoins lorsqu'il y aurait ambiguïté d'interprétation à la lecture). Sinon cela allonge seulement les lignes de code pour le même résultat.

Lorsque tu utilises des boucles avec des indices numériques, Cells(ligne, colonne) est plus pratique d'utilisation.

Cordialement

Ferrand

tout d'abord un grand merci MFerrand, je n'ai pas encore tester cette macro et je prendrai tout le temps de bien la comprendre par respect pour ton investissement, en tout cas respect pour la réactivité sur ce site je prendrai le temps de devenir meilleur en vba (la route est longue) afin de pouvoir renvoyer l'appareil à un prochain galérien.

Cordialement

Galérienbis

Rechercher des sujets similaires à "macro utilisant classeurs"