merci philip et a Marcel mon homonyme
Version imprimable
merci philip et a Marcel mon homonyme
Hé salut Philippe! Merci pour ton concours précieux.
Dorel,
Sur quel ligne de code, le débugger s'arrête-t-il?
De plus
Ne pas confondre Sheets et Worksheets
Sheets = Worksheets + Graphiques
De plus, il est utile de vider une zone de liste déroulante avant de l'alimenter
Code:
1
2
3
4
5
6 With Me.ComboBox2 .Clear For Each ws In wk1.Worksheets .AddItem ws.Name Next ws End With
quand je fais le debogage pas a pas detaillé, il va de ligne ligne en jusqu'a next ws
je met entre balise de code, les lignes qui sont prisesCode:
1
2
3
4
5
6
7
8
9
10
11 Private Sub Userform_Initialize() Set wk1 = ThisWorkbook '<--- AVION Set wk2 = Workbooks("C-CLIENT.xlsm") Dim ws As Worksheet Dim WF As Worksheet With Me.ComboBox2 .Clear For Each ws In wk1.Worksheets .AddItem ws.Name Next ws
Tu dis qu'il y a une erreur.
Quand celle-ci survient, sur quelle ligne le débugger s'arrête-t-il?
Quel est ce message d'erreur?
c'est la même chose que je dis depuis un moment, l'erreur c'est dans le code du bouton qui permet d'ouvrir une nouvelle feuille
à ce niveau If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True,
je vous ai mis le code, je sais pas si vous avez vu
c'est uneCitation:
erreur d'exécution 9 l'indice n'appartient pas à la sélection
(Je n'arrive plus à suivre. :weird:)
Et moi je dis depuis un moment que tu dois reporter dans la discussion le résultat de la fenêtre des variables locales.
Ceci pour la variable "Nom".
Voir le processus décrit plus haut, Voir aussi les liens de l'ami Philippe.
Bonne soirée à toi. Bonne soirée au Forum.
Cette ligne ne se trouve pas dans les derniers codes que tu as postés.
Elle n'est d'ailleurs dans aucun des codes que tu as postés.
A mon avis, la variable i tourne dans une boucle For To dont les limites ne correspondent pas au nombre de feuilles du classeur concerné.
Mais pour en être sûr, il faudrait avoir toute la boucle avec les éventuels With qui l'encadrent.
Marcel je comprends c'est maintenant que la fenetre s'est affichée
Nom, la valeur = ed3 - 2020 et le type est= string
Menhir
la ligne y est
regardez bien svp, c'est juste apres for i
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 Private Sub CommandButton8_Click() Dim Nom As String, i As Byte, Verif As Boolean, myMonth As Integer, myYear As Integer, myDate As Date, ee As String, a As Long myDate = Date ' enregistre la date d'aujourd'hui dans la variable myDate myMonth = (Month(myDate)) ' No du mois précédent myYear = Year(Date) 'No année ee = "" recom: Verif = False Nom = InputBox("Définissez le nom du nouveau svp", "Ajout nouveau ") & "" & (myMonth) & " - " & myYear If Nom = "" Then Exit Sub For i = 1 To Sheets.Count If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True Next If Verif = True Then MsgBox "la feuille " & Nom & " existe déjà, veuillez choisir un autre nom" GoTo recom End If Workbooks("C-CLIENT").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom Application.ScreenUpdating = False Workbooks("C-CLIENT").Sheets(1).Activate Range("A1:P3").Select Selection.Copy Workbooks("C-CLIENT").Sheets(Nom).Activate Range("A1").Select ActiveSheet.Paste 'On copie colle uniquement le format des colonnes Workbooks("C-CLIENT").Sheets(1).Activate Columns("A:P").Select Selection.Copy Workbooks("AVIONS").Sheets(Nom).Activate Range("A1").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.ScreenUpdating = True Unload Me UserForm1.Show End Sub
Elle est dans le code que tu présentes ici mais elle n'est dans aucun de tes codes précédents.
Dans ce code, tu n'indiques pas à VBA à quelle fichier appartient la collection Sheets dont tu demandes le dénombrement.Citation:
Citation:
For i = 1 To Sheets.Count
If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True
Next
Si le classeur actif n'est pas "C-CLIENT", ton Sheets.Count donnera le nombre de feuilles d'un autre classeur, comme je l'ai dit dans mon message précédent.
je comprends exactement mais mes deux classeurs sont ouvert parce que j'ai mis un code qui permet de les ouvrir ensemble automatiquement.
du coup qu'est ce que je suis censé faire ?
For i = 1 To Workbooks("C-CLIENT").Sheets.Count ?
pour que ça donne ce code ci ?
Code:
1
2 If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True Next
Tout à fait.
Voir le post #10.
Tu adaptes avec C-Client
Ce n'est pas la méthodologie la plus fun pour tester l'existence d'une feuille (voir le code proposé plus haut); mais ce sera un premier pas.Code:
1
2
3
4
5
6
7
8
9
10 Verif = False With Workbooks("C-Client") For i = 1 To .Worksheets.Count If .Sheets(i).Name = Nom Then Verif = True Exit For End If Next i End With
Bon ici ça fonctionne lorsque je rentre une feuille existante
mais il y a un encore un probleme au niveau de la deuxieme partie (l'ajout)
on me une erreur a la premiere ligne qui me dit que la methode add de l'objet 'sheets' a échouéeCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Workbooks("C-CLIENT").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom Application.ScreenUpdating = False Workbooks("C-CLIENT").Sheets(1).Activate Range("A1:P3").Select Selection.Copy Workbooks("C-CLIENT").Sheets(Nom).Activate Range("A1").Select ActiveSheet.Paste 'On copie colle uniquement le format des colonnes Workbooks("C-CLIENT").Sheets(1).Activate Columns("A:P").Select Selection.Copy Workbooks("C-CLIENT").Sheets(Nom).Activate Range("A1").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.ScreenUpdating = True Unload Me UserForm1.Show
Tu ne peux pas faire dans la même instruction la création d'une feuille et la modification d'une de ses propriétés.
Sépare ça en deux instructions.
Bonjour comment ça va ?
dois-je mettre entre with aussi ?
il y a une erreur d'execution 9 (l'indice n'appartient pas a la selection) au niveau du Workbooks("C-CLIENT").Sheets(Nom).Activate
peut-etre que je dois vous envoyer mes deux classeurs pour voir de plus presCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 With Workbooks("C-CLIENT").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom Application.ScreenUpdating = False Workbooks("C-CLIENT").Sheets(1).Activate Range("A1:P3").Select Selection.Copy Workbooks("C-CLIENT").Sheets(Nom).Activate Range("A1").Select ActiveSheet.Paste 'On copie colle uniquement le format des colonnes Workbooks("C-CLIENT").Sheets(1).Activate Columns("A:P").Select Selection.Copy Workbooks("C-CLIENT").Sheets(Nom).Activate Range("A1").Select Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.ScreenUpdating = True End With Unload Me UserForm1.Show End Sub
Ca n'est pas indispensable.
Parce qu'il n'y a pas dans le classeur "C-CLIENT" de feuille ayant pour nom le contenu de la variable Nom.Citation:
il y a une erreur d'execution 9 (l'indice n'appartient pas a la selection) au niveau du Workbooks("C-CLIENT").Sheets(Nom).Activate
Beaucoup de participants à ce forum n'ouvrent pas les classeurs joints, surtout ceux pouvant contenir des macros.Citation:
peut-etre que je dois vous envoyer mes deux classeurs pour voir de plus pres
Par contre, tu pourrais peut-être participer un peu plus activement à la résolution de ton problème... :?
Oui il n'y a au paravant pas, mais c'est ce qu'on rentre. et on fait une copie dans la nouvelle feuille qui est nommée par le "nom" en question.
par contre je ne sais pas comment m'y prendre
j'ai plus bas dans le userform initialize une erreur quand je fais le debogage pas a pas détaillé
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Private Sub Userform_Initialize() Set wk1 = ThisWorkbook '<--- AVION Set wk2 = Workbooks("C-CLIENT.xlsm") Dim ws As Worksheet Dim WF As Worksheet For Each ws In wk1.Worksheets Me.ComboBox2.AddItem ws.Name Next ws For Each WF In wk2.Sheets Me.ComboBox1.AddItem WF.Name Next WF End Sub
tres bien recu mais la separation, je ne sais comment vu que le tout se trouve dans le bouton qui doit me permet d'ouvrir une nouvelle feuille
Salut.
Il ne sert à rien de commencer une deuxième discussion sur le même sujet. Ca laisse sous-entendre aux gens qui ont la patience (et c'est un euphémisme) de t'aider dans celle-ci que leurs efforts ne servent à rien.
Tu dis être un novice en VBA. Je pense qu'un apprenti maçon ne s'essaie par à la construction d'une cathédrale pour son premier travail. De même, tu t'attaques à un gros morceau (traiter par code des manipulations sur deux classeurs à la fois) alors que tu ne sais pas pas coder ( ce n'est pas une critique, c'est un constat, on est tous passés par la case débutants). De plus, Excel n'est a priori pas l'outil pour gérer ce genre de choses.
Peut-être devrais-tu commencer par traiter tout dans un même classeur. Je doute que les infos soient si nombreuses qu'il soit nécessaire de splitter sur plusieurs classeurs. Si c'était le cas, cela confirmerait qu'Excel n'est pas le bon outil.
Si tu veux programmer, tu dois suivre les règles de la programmation, et ce dès le début de ton apprentissage, sinon tu vas droit dans le mur et tu produiras un code qui ne peut qu'être pourri.
Règles de base:
- Ecrire ce que l'on a devant soi, où on veut aller et entre les deux, les étapes pour réaliser l'objectif;
- Voir si l'on se sent capable de réaliser chaque étape du travail. Es-tu armé en VBA pour réaliser chaque étape de ton objectif? Et juste avant cette question, une autre tout aussi importante: Es-tu armé en EXCEL pour réaliser ce travail si tu devais le faire à la main?
Je pense honnêtement que pour la seconde règle, la réponse est non. Ce n'est pas un jugement de valeur... Au passage, programmer, même du VBA pour Excel, c'est normalement un métier auquel on se forme et certains, dont moi, en ont fait leur business. Cela veut dire qu'au delà de quelques lignes de code pour bidouiller, il va falloir apprendre, et je pense que ce que tu souhaites réaliser demande des apprentissages et doit s'appuyer sur des prérequis que tu ne possèdes pas. Il serait à mon avis judicieux de réduire la voilure et de t'attaquer à moins gros morceau ;)
Néanmoins, si tu souhaites persister dans ce que j'appellerais un mauvais choix, il faut:
- découper chaque étape en petites procédures et fonctions qui ont une seule responsabilité, facilement testables, utilisables par la suite comme des briques de légo;
- Eviter de mettre des valeurs en dur dans ton code;
- Associer les petites procédures/fonctions entre elles comme tu le ferais pour construire en maison en Légos;
- ...
- ...
- ...
Nous sommes à une quarantaine de messages dans cette discussion qui ne peut clairement mener à rien. Dans cent messages, nous en serons toujours à te demander ce qu'il y a dans telle variable, quel est le classeur actif, etc, etc...
Je ne vois pas ce qu'on peut faire de plus... :?