VBA marche en manuel et pas en auto

M

marieke

Guest
Bonjour,
Je debute en langage VBA et j'ai cree mes premieres formules...
Tout marche impeccable et maintenant, je souhaiterai que mes macro marche a l'ouverture de mon onglet.
Et la, ca me fonctionne plus ....
Ci dessous ma formule :
Range('B4').Select
MsgBox '1...'
Sheets('Suivi livraison papier dept').Select
ActiveWindow.SmallScroll Down:=-57
Range('C5:C52').Select
Selection.Copy
Sheets('suivi').Select
Range('B4').Select
MsgBox '2'
ActiveSheet.Paste
Sheets('Suivi livraison papier dept').Select
Range('B5:B52').Select
Application.CutCopyMode = False
Selection.Copy
Sheets('suivi').Select
Range('C4').Select
MsgBox '3'
ActiveSheet.Paste
En automatique, la formule bloque au n° 1 et je ne vois pas pourquoi.
Si quelqu'un a une solution ( en plus j'suis sure que c'est tout simple !! :woohoo: ) je le remercie par avance de m'aider.
@+
Marieke
VBAtiste girl depuis 1 semaine alors soyez indulgent ! :)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Marieke, le Forum

Je ne vois pas particulièrement de souci dans ton code. En fait je ne saisis pas vraiment ce que tu appelles 'Automatique' et 'Manuel' dans tout ceci ?

Je pense que tu parle de Macro évènementielle ?

Qui se déclencherait au moment où l'on active l'Onglet 'Suivi' par exemple ?

Dans ce Cas, tu click droit sur cet Onglet 'Suivi' et dans le petit menu contextuel, tu choisis 'Visualiser le Code'.

A partir de là tu vas te trouver dans un Private Module de Feuille qui contient differents type de macro évènementielles (regarder les deux Liste déroulantes en top de Module)

Dans ton Cas il suffirait de mettre ce Code :

Private Sub Worksheet_Activate()
MsgBox '1...'
Sheets('Suivi livraison papier dept').Select
Range('C5:C52').Select
Selection.Copy
Sheets('suivi').Select
Range('B4').Select
MsgBox '2'
ActiveSheet.Paste
Sheets('Suivi livraison papier dept').Select
Range('B5:B52').Select
Application.CutCopyMode =
False
Selection.Copy
Sheets('suivi').Select
Range('C4').Select
MsgBox '3'
ActiveSheet.Paste
End Sub


Mais en tant que débutante, je t'accorde tous ces 'Select', mais attention, il faut prendre de bonnes habitudes en les évitant au maximum.

Voici une version 'boostée' :

Private Sub Worksheet_Activate()

MsgBox '1...'
Sheets('Suivi livraison papier dept').Range('C5:C52').Copy _
Destination:=Sheets('suivi').Range('B4')

MsgBox '2'
Sheets('Suivi livraison papier dept').Range('B5:B52').Copy _
Destination:=Sheets('suivi').Range('C4')

MsgBox '3'
End Sub


Et dans la foulée, voici une Version plus 'Star Excel Académix' .-)

Option Explicit 'Oblige à déclarer les Variables

Private Sub Worksheet_Activate()
'Declaration de Variable Objects 'WorkSheet'
Dim WSSource As Worksheet
Dim WSCible As Worksheet

'Inititialisation de ces Variable Objects
Set WSSource = ThisWorkbook.Worksheets('Suivi livraison papier dept')
Set WSCible = ThisWorkbook.Worksheets('Suivi')

'Avec l'Objet WSSource que nous avaons déclaré et initialisé
'on va copier et envoyer à destination de l'autre Objet WSCible
   
With WSSource
        .Range('C5:C52').Copy Destination:=WSCible.Range('B4')
        .Range('B5:B52').Copy Destination:=WSCible.Range('C4')
   
End With
'Fin de Avec l'Objet WSSource


MsgBox 'Operation de Report ' & WSSource.Name & ' vers ' & WSCible.Name & ' Terminée'
End Sub


Welcome to the VBA's World et des nuits blanches en Perpectivers si tu découvres que la Touche [F1] lorsque tu as un mot dans une ligne de code sélectionné te renverra sur l'aide appropriée avec dans la plupart des cas des exemples pratiques...

PS Une chti remarque en VB / VBA on ne parle pas 'de Formules' mais de 'Lignes de Code' ou 'd'Instructions', celà évitera des confusions avec les 'Vraies Formules Excel'.

Bon Courage et découverte
@+Thierry
 
M

Marieke

Guest
Bonjour Thierry et merci pour ta reponse si rapide...
Tout d'abord, je suis impressionnee :eek:
Tu as tout compris mon code et tout traduit ! :whistle:
Je vais te faire un mea culpa, en fait, tout ces select viennent du fait que j'ai fais un copier/coller de macros automatiques...
En gros, je bidouille mais je compte bien devenir de plus en plus performante et reussir a faire des 'lignes de code' digne des tiennes ! lol
Pour en revenir a mon probleme, je vais essayer d'etre plus explicite :
en fait, j'ai plusieurs macro que j'ai cree dans un module et quand je les fais fonctionner toutes separement, il n'y a aucun souci...
Ensuite, je voudrais qu'a l'ouverture de ma feuille, elles s'executent automatiquement.
J'ai donc ete sur microsoft excel objet, selectionne la feuille concernee, clique sur worksheet et activate et ensuite j'ai...betement (enfin pas si betement puisque mon formateur m'avait montre un truc dans ce gout-la !)... insérer le nom de mes macros et c'est la que ca plante :eek:
Voila ce que ca donne :
Private Sub Worksheet_Activate()
papierlivre
photocopiesNB
photocopiescouleurs
copieexterieure
prixtotal
effacerzero
End Sub
Et donc, ca tourne en boucle entre le message d'accueil et le message n°1.

Merci pour ton aide
Marieke
 

Abel

XLDnaute Accro
Bonjour Marieke, Pascal76,

Je me permets de m'insérer.

Marieke, 'Private Sub Worksheet_Activate()' va s'exécuter à chaque fois que la feuille considérée sera activée.

Donc, si une de tes macro fais appelle a la feuille où se trouve 'Private Sub Worksheet_Activate()' tout le contenu va s'exécuter.

On peut dans ce cas là effectivement rapidement tourner en rond.

Passe nous le contenu des macro.


Abel.

Oups !
Ouarf ! Arf ! Arf !
Pardon _Thierry. Où ai-je la tête ...

Message édité par: Abel, à: 18/10/2005 11:47
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Marieke, le Forum

En fait il s'agit là d'interférences toutes simples et très logiques.

En fait j'imagine bien que ces Macros :

papierlivre
photocopiesNB
photocopiescouleurs
copieexterieure
prixtotal
effacerzero

sont très probablement à nouveau constituées de lignes de code comme suit :
Sheets('Suivi').Select

Or si tu as un 'Select' de Sheets... Bien logiquement l'évènement 'Worksheet_Activate' placé dans la Sheets 'Suivi' se déclenchera... Non ?

Voilà d'où viennent tes boucles sans fin.

Par conséquent, il faut coûte que coûte éradiquer tous ces Selects sans pitié.

Voilà pour une première approche.

Un autre approche un peu plus évoluée dans le niveau VBA consisterait à introduire un 'Verrou Boolean' qui sera déclenché au début de la macro évènementielle sur l'action 'WorkSheet_Activate'...


'=============================================================================
'                      En Module 'Standard' (Module1)
'=============================================================================

Public Stop_Any_Event As Boolean 'En Top de Module Standard pour déclaration PUBLIQUE


Sub MacroStandardTest1()
Stop_Any_Event =
True 'Ini Boolean en True

Sheets('Suivi').Select
Range('A1') = 'Test1'

Stop_Any_Event =
False 'Ini Boolean en False
End Sub

Sub MacroStandardTest2()
Stop_Any_Event =
True

Sheets('Suivi').Select
Range('A1') = 'Test2'

Stop_Any_Event =
False
End Sub

'=============================================================================
'                      En Private Module de Feuille
'=============================================================================

Private Sub Worksheet_Activate()

'Test sur la Boolean, on n'execute pas si Boolean True
If Stop_Any_Event = True Then Exit Sub

MacroStandardTest1
'Lancement de macros
MsgBox 'Macro 1 Executée'

MacroStandardTest2
MsgBox 'Macro 2 Executée'


End Sub


Voilà de quoi t'amuser un peu ;)

Bonne Journée
[ol]@+Thierry[/ol]


EDITION !!!

Bonjour Abel, sorry je ne t'avais pas vu !! Et bonjour aussi à Pascal, mais je ne sais pas où tu l'as vu dans ce Fil Abel !!! LOL

Message édité par: _Thierry, à: 18/10/2005 11:50
 

Discussions similaires

Réponses
2
Affichages
946

Statistiques des forums

Discussions
312 338
Messages
2 087 397
Membres
103 535
dernier inscrit
moimeme1