Revenir sur le classeur precedent

Bonjour à toutes et à tous,

Je coince sur un code pour revenir sur le classeur précèdent.

Je m'explique, j'ai 2 classeurs test, dans le classeur "Test 1 " j'ai créé un code pour copier le résultat de certaines cellules, pour cela je copie sur "test1" et je colle sur "Test2", répété 2 fois de suite.

Ces 2 classeurs sont censés représenter 1 devis et une facture, le devis (test 1) est enregistré avec pour nom, le contenu d'une cellule, il m'est donc impossible de faire une macro avec 2 noms de classeur fixe, d'où la recherche pour revenir sur un classeur (X).

j'ai essayé le code suivant, mais il bloque sur le premier retour au classeur qui contient la macro (Test 1).

Voici ce code :

[codeSub Macro4()

'

' Macro4 Macro

'

Dim monfichier As String

'

'Je mémorise mon fichier X (test1) en vue d'un retour après collage

monfichier = ActiveWorkbook.Name

'Je sélectionne ma plage à copier'

Range("A5:A6").Select

Selection.Copy

'Je me rends sur le classeur Test 2 censé représenter le classeur facture'

Windows("test2.xlsm").Activate

'Je colle les valeurs de ma sélection en L3 '

Range("L3").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

'Je reviens une première fois sur mon fichier test 1

Workbooks("monfichier").Activate 'C'est sur ce code que cela bloque

'Je mémorise mon fichier X (test1) en vue d'un second retour

monfichier = ActiveWorkbook.Name

'Je sélectionne ma plage à copier'

Range("C6").Select

Application.CutCopyMode = False

Selection.Copy

'Je me rends sur le classeur Test 2 censé représenter le classeur facture'

Windows("test2.xlsm").Activate

'Je colle les valeurs de ma sélection en L6 '

Range("L6").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

'Je reviens une seconde fois sur mon fichier test 1

Workbooks("monfichier").Activate

End Sub][/code]

Est-ce que quelqu'un pourrait m'aiguiller sur le problème de ce code, je suis preneur, si possible avec les raisons pour lesquelles il ne fonctionne pas, ce serait sympa.

Merci d'avance à vous pour votre aide.

Cordialement

Dubdub22

Bonjour,

Pas le temps de lire ton code, tu le mettras sous balises Code la prochaine fois ! (et tu l'indenteras pour qu'il soit lisible).

Ton classeur Test2 ne devient la classeur actif que s'il est ouvert par la macro de Test1 !

Autrement il n'a aucune raison de devenir actif ensuite, ou c'est que ton code est mauvais !

De toute façon, si tu termines ta macro de Test1 par :

ThisWorkbook.Activate

tu reviendras sur Test1 !

Bonjour à tous,

monfichier est une variable

A tester en supprimant les guillemets

Workbooks("monfichier").Activate

=>

Workbooks(monfichier).Activate

Ce type de code n'est toutefois pas très propre : activer, désactiver, etc. On ne sait plus où on est

Bouben

Bonjour à tous les 2,

Merci à toi bouben, c'était bien les guillemets, je te remercie bien.

Pour ce qui est de la propreté je suis d'accord avec toi, mais je n'ai trouvé que cela, et comme il ne me faut que 2 allés retour.

C'est pour ne pas me perdre que je note chaque action dans mon code, et je ne me suis pas trop perdu

Mais je suis d'accord avec toi, que si le code était plus long ce ne serait pas top.

Merci à toi.

En revanche en ce qui concerne MFerrand, je te remercie également, bien que ta réponse que je trouve un peu agressive ne m'a pas apporté de solution.

En ce qui concerne la mise du code entre balise, je pense que soit tu n'avais pas tes lunettes lors de la lecture de celui-ci, ou alors il y avait de la buée sur celles-ci.

En effet si tu regardes bien tu verras la première balise juste après :

Voici ce code :

[codeSub Macro4()

'

' Macro4 Macro

'

Dim monfichier As String

Et la balise code de fin à cet endroit :

'Je reviens une seconde fois sur mon fichier test 1

Workbooks("monfichier").Activate

End Sub][/code]

L'amabilité n'a jamais fait de mal à personne.

Merci quand même

Cordialement à vous deux

Dubdub22

Bonsoir,

Après avoir bien nettoyé mes lunette, je confirme la remarque de MFerrand

Pour l'affichage du code il manque une balise ]

Donc non lisible ...

Là, c'est mieux :

Cdlt

Bouben

Sub Macro4()
'
' Macro4 Macro
'
Dim monfichier As String
'

'Je mémorise mon fichier X (test1) en vue d'un retour après collage
monfichier = ActiveWorkbook.Name

'Je sélectionne ma plage à copier'
Range("A5:A6").Select
Selection.Copy

'Je me rends sur le classeur Test 2 censé représenter le classeur facture'
Windows("test2.xlsm").Activate

'Je colle les valeurs de ma sélection en L3 '
Range("L3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

'Je reviens une première fois sur mon fichier test 1
Workbooks("monfichier").Activate 'C'est sur ce code que cela bloque

'Je mémorise mon fichier X (test1) en vue d'un second retour
monfichier = ActiveWorkbook.Name

'Je sélectionne ma plage à copier'
Range("C6").Select
Application.CutCopyMode = False
Selection.Copy

'Je me rends sur le classeur Test 2 censé représenter le classeur facture'
Windows("test2.xlsm").Activate

'Je colle les valeurs de ma sélection en L6 '
Range("L6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

'Je reviens une seconde fois sur mon fichier test 1
Workbooks("monfichier").Activate

End Sub

bonsoir a tous

grace a Bouben on peu lire le code qui est issu de l'enregistreur

voici un exemple pour reduire les lignes

Worksheets("feuil1").Range("C2").Copy
ActiveSheet.Paste Destination:=Worksheets("S1").Range("D7")

En revanche en ce qui concerne MFerrand, je te remercie également, bien que ta réponse que je trouve un peu agressive ne m'a pas apporté de solution.

Ça c'est parce que tu ne l'as pas testée ! (après rectification de l'erreur de syntaxe soulevée par Bouben, bien sûr)

Je la rappelle :

De toute façon, si tu termines ta macro de Test1 par :

ThisWorkbook.Activate

tu reviendras sur Test1 !

Ce qui était destiné à te faire comprendre que Microsoft met à ta disposition dans VBA une propriété de l'objet Application : ThisWorkbook, qui pointe toujours sans coup férir le classeur conteneur du code en train de s'exécuter, et que donc tu peux utiliser à tout moment et à coup sûr pour revenir sur ce classeur.

Mais dans ce qui précédait j'avais laissé entendre (clairement je pense) que je ne considérais pas cela comme la bonne solution. La bonne solution étant de ne pas se déplacer !

Par ailleurs, me présenter un code hors balises, non indenté, et qui plus est enregistré, ce que je considère comme un torchon pas à prendre avec des pincettes, je ne me trouves alors pas dans un climat d'énergie positive... !

Les deux premiers conseils que je donne volontiers, c'est :

  • oublier l'enregistreur, le code est toujours mauvais, au profit d'un apprentissage minimal des base de VBA... (avec l'enregistreur on est sur de l'enregistrement de manipulations manuelles dans Excel, et pas vraiment sur de la programmation)
  • indenter, correctement et systématiquement, le code, un code bien indenté se lit, et on sait ce qu'on lit en le lisant, on y détecte beaucoupe plus facilement anomalies et erreurs, et parfois même on peut mettre le doigt sur un problème avant de commencer à lire, au premier coup d'oeil, dès lors qu'il s'agit d'éléments manquants dans la structuration de blocs d'instruction...

Maintenant que Bouben a déjà fait le boulot pour rétablir ton code sous balises, je peux me permettre dans un premier temps de te le retourner, après avoir effacé tes commentaires, pour y placer mes commentaires rageurs !

Sub Macro4()
'
' Macro4 Macro
'
Dim monfichier As String
'

'
monfichier = ActiveWorkbook.Name 'inutile Microsoft y pensé !

'
Range("A5:A6").Select 'expression non qualifiée
Selection.Copy  'sélection inutile

'
Windows("test2.xlsm").Activate 'inutile d'y aller, VBA fait très bien sans
'et l'objet window n'est pas le mieux pour opérer...

'
Range("L3").Select 'encore du select !!!
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False '3 paramètres inutiles sur 4 (par défaut)
'et les arguments étant dans l'ordre, on peut éliminer le nom (passage par position)

'
Workbooks("monfichier").Activate 'une variable ne se met pas entre guillemets
'et fallait pas partir !

'
monfichier = ActiveWorkbook.Name 'encore ! la variable n'a pas disparue

'
Range("C6").Select 'on s'épuise en sélection
Application.CutCopyMode = False 'toujours à supprimer lorsque l'enregistreur le met !
'c'est quand l'enregistreur ne le met pas que l'on doit se demander si l'on en a besoin !
Selection.Copy '....!

'
Windows("test2.xlsm").Activate 'c'est répétitif !

'
Range("L6").Select 'voir précédemment
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False 'voir précédemment

'
Workbooks("monfichier").Activate 'et voir précédemment

End Sub

Maintenant, 2e opération, quand on prend la peine de traiter, et de traiter complètement pour l'épurer du code enregistré, on peut obtenir tout à fait autre chose.

L'opération consiste à éliminer le code inutile, à le restructurer en dotant les expressions de qualificateurs d'objet. Intervenant sur deux objets simultanément, on introduira une variable pour l'un tout en mettant l'autre sous bloc With.

Pour s'adapter au plus près à l'opération, c'est la feuille cible du classeur cible qu'on mettra sous variable objet, la feuille source du classeur source étant mise sous bloc With.

Sub Macro4()
    Dim ws As Worksheet
    Set ws = Workbooks("Test2.xlsm").Worksheets(1) 'à confirmer ?
    With ActiveSheet 'Je préférerais ThisWorkbook.Worksheets(??)
        .Range("A5:A6").Copy
        ws.Range("L3").PasteSpecial xlPasteValues
        .Range("C6").Copy
        ws.Range("L6").PasteSpecial xlPasteValues
        Application.CutCopyMode = False 'utile uniquement si C6 est affichée à l'écran !
    End With
End Sub

On a singulièrement raccourci le code, mais on reste dans une opération de copier-coller alors qu'il s'agit de valeurs. On peut donc éviter le copier-coller et faire autrement : ce qu'on ne peut pas faire en manuel et que donc l'on ne pourra jamais enregistrer.

Sub Macro4()
    Dim ws As Worksheet
    Set ws = Workbooks("Test2.xlsm").Worksheets(1) 'à confirmer ?
    With ActiveSheet 'Je préférerais ThisWorkbook.Worksheets(??)
        ws.Range("L3:L4").Value = .Range("A5:A6").Value
        ws.Range("L6") = .Range("C6")
    End With
End Sub

On a encore gagné quelques lignes, mais ce n'est pas le plus important ! On donne des instructions et VBA fait, sans courir à droite et à gauche inutilement.

Cordialement.

Bonsoir MFerrand

Je reviens sur le poste, bien que le code que j'avais essayé fonctionne très bien depuis que bouben a trouvé l'erreur que j'avais faite.

Je reviens dessus, parce que j'ai essayé tes deux codes, et ils s'affichent tous deux en rouge, et de plus lorsque je les lance, ils bloquent tous les deux sur la Dim ws As Worksheet

Si tu as une réponse, cela m'intéresse.

Perso je suis autodidacte et c'est pas à mon âge que je vais me lancer dans un apprentissage, mais malgré tout j'aime bien comprendre ce que je fais.

Cordialement

Dubdub22

Bonsoir,

Sur la déclaration, je ne vois pas de possibilité d'erreur (à moins d'écorcher le mot Worksheet)...

Si tu peux me faire passer un fichier qui bloque ainsi, je pourrais examiner ce qu'il en est. Le problème vient forcément d'ailleurs, mais si pas d'indice donné par le type d'erreur, il faut aller le chercher.

Bonjour MFerrand

J'ai copié / collé les 2 codes sur le message que tu as mis et sur les 2 j'ai la même réponse lorsque je déclenche la macro, c'est à dire :

Erreur de compilation

Erreur de syntaxe

Et c'est la déclaration de variable qui est bleuie

Quant au code lui il s'est écrit en rouge dès le départ depuis Sub Macro4 jusqu'au End Sub

J'ai voulu te faire une copie d'écran, mais à priori le message ne le prend pas en compte

Cordialement

Dubdu22

Erreur de compilation avec le texte qui se met en rouge, c'est peut-être que le code collé a été esquinté quelque part dans l'opération. Ma boule de cristal ne me permet pas de voir ce que tu as fait.

Rechercher des sujets similaires à "revenir classeur precedent"