Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2011, 18h11   #1
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
Par défaut Selectionner une cellule qui ne fonctionne pas

Bonjour,

J'ai une macro qui efface les données initiales de trois onglets. Ce code devrait fonctionner parfaitement, il est tout bête ! Regardez par vous-même :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Sub Erase_data()
 
'Permet de nettoyer les données originales
 
Application.ScreenUpdating = False
 
    With Sheets("Original TB")
        .UsedRange.EntireColumn.Delete
 
        With .Cells
            .HorizontalAlignment = xlLeft
            .NumberFormat = "General"
 
            With .Font
                .Name = "Arial"
                .Size = 10
                .FontStyle = "Normal"
            End With
 
            With .Borders
                .LineStyle = xlNone
            End With
 
            With .Interior
                .Pattern = xlNone
            End With
 
        End With
 
        .Range("A1").Select
 
    End With
 
    With Sheets("Original Expenses")
        .UsedRange.EntireColumn.Delete
 
        With .Cells
            .HorizontalAlignment = xlLeft
            .NumberFormat = "General"
 
            With .Font
                .Name = "Arial"
                .Size = 10
                .FontStyle = "Normal"
            End With
 
            With .Borders
                .LineStyle = xlNone
            End With
 
            With .Interior
                .Pattern = xlNone
            End With
 
        End With
 
        .Range("A1").Select
 
    End With
 
    With Sheets("Original P&L")
        .UsedRange.EntireColumn.Delete
 
        With .Cells
            .HorizontalAlignment = xlLeft
            .NumberFormat = "General"
 
            With .Font
                .Name = "Arial"
                .Size = 10
                .FontStyle = "Normal"
            End With
 
            With .Borders
                .LineStyle = xlNone
            End With
 
            With .Interior
                .Pattern = xlNone
            End With
 
        End With
 
        .Range("A1").Select
 
    End With
 
Application.ScreenUpdating = True
 
MsgBox "Les données ont été effacées avec succès. Coller les nouvelles données en cellule A1" & vbLf & _
"de cette feuille puis retourner sur le menu principal et cliquer sur le 2nd bouton" & vbLf & _
"pour lancer le traitement des données. !", vbInformation + vbOKOnly, "Initialisation des données à traiter"
 
End Sub
Le code s'exécute parfaitement pour le premier onglet, mais arrivé sur la deuxième feuille, blocage de la macro avec le message suivant : "La méthode Select de la classe Range a échoué"... Ce que je ne comprends pas, c'est que j'ai beau tourné le truc dans tous les sens, il y a quelque chose qui m'échappe... J'ai même été jusqu'à copier tout le début de la procédure qui fonctionne (celui effaçant les données de la première feuille) en changeant juste le nom des onglets avec les noms de mes deux autres feuilles, rien à faire !! Je suis perdu, j'en reste coi .

Je serai ravi de lire les tuyaux et l'aide que vous pourrez m'apporter parce que là je suis au bord de la crise de nerfs
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 20h52   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
deux questions :
  1. Sur qu'elle ligne l'erreur ?
  2. Qu'elle est l'utilité d'un Select ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 06h34   #3
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

C'est normal que tu es une erreur, avant de sélectionner une cellule, il te faut activer la feuille. Donc, avant :
Code :
1
2
 
.Range("A1").Select
il te faut mettre :
comme ceci :
Code :
1
2
3
 
.Activate
.Range("A1").Select
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 08h54   #4
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Citation:
Envoyé par bbil Voir le message
  1. Qu'elle est l'utilité d'un Select ?
Si Theze a mis le doigt sur l'erreur, fondamentalement, je rejoins bbil, sans cette pratique nuisible et inutile, issue souvent de l’enregistreur, le souci n'existerait pas.. (bon au moins ça a mis en avant une source d'erreur ).

Si pour des raisons ergonomiques ou autres, tu as besoin que quand l'utilisateur se rend sur une feuille, ce soit A1 qui soit active, utilises l'évènementiel ad-hoc du classeur :

Code :
1
2
3
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Range("A1").Activate
End Sub
cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 09h21   #5
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
Bonjour à vous tous,

Merci pour toutes vos réponses. Ormonth, tu as mis en plein dans le mille :

Citation:
tu as besoin que quand l'utilisateur se rend sur une feuille, ce soit A1 qui soit active
D'où l'utilisation de mon .Select (j'ai maintenant bien compris qu'ils étaient à éviter et mes macros n'en ont plus, sauf dans ces cas-ci). Je vais donc utiliser le .Activate, que je ne connaissais pas et qui vient enrichir mes faibles connaissances. Je vais abuser de ta patience Ormonth, peux-tu STP m'expliquer ceci :

Code :
Workbook_SheetActivate(ByVal Sh As Object)
Est-ce pour que la macro ne marche que sur le classeur sur lequel dans lequel se trouve le code ? Car c'est quelque chose que je ne sais pas aire mais qui me serait utile

Encore merci pour le tuyau en tout cas
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 09h37   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

vois ce tutoriel :

http://silkyroad.developpez.com/VBA/...asseur/#LII-16

Citation:
Tous les évènements dont le nom commence par Workbook_Sheet ont leur équivalent dans chaque module feuille. Le principe de fonctionnement est identique.
Utiliser la procédure au niveau du module objet ThisWorkbook a pour avantage d'écrire une seule procédure évènementielle pour gérer l'ensemble des onglets dans le classeur.
Sinon dès que tu invoques ThisWorkbook, c'est forcément le classeur qui contient le code actif.

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 09h47   #7
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
Et bien je n'ai plus qu'à te dire une grand merci pour ta patience, tes réponses et le lien vers le tuto que je vais lire avec assiduité
Te souhaitant une excellente journée,
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h20.


 
 
 
 
Partenaires

Hébergement Web