Résolu erreur 1004: échec de la méthode Select de la classe Worksheet

Resmi

XLDnaute Nouveau
Bonjour à tous! :D

Aujourd'hui je reviens vers vous avec un problème récurrent:
J'ai une macro destiné à copier une autre feuille à la fin, et à la renommer avec une valeur entrée dans une cellule. Cette macro fonctionne... Une fois sur cinq environ.
En effet, durant certaines périodes elle fonctionne parfaitement et me permets d'utiliser mon classeur sans problème. En revanche, parfois je récupère régulièrement un message d'erreur 1004:
1031905
Jusque là, je me contentais de redémarrer encore et encore mon document, mais depuis quelques jours elle me revient à chaque utilisation, ce qui devient très gênant. Je vous mets ci-dessous la partie de programme dérangeante:
VB:
Private Sub Button_1_Click()
Dim name As Variant, nb_feuilles As Long

Sheets("modele-other").Copy After:=Sheets(Sheets.Count)
Sheets("newsheet").Select
nb_feuilles = Sheets.Count
  
    name = Range("H4")
With ActiveWorkbook
    Sheets(nb_feuilles).Select
    Sheets(nb_feuilles).name = name
    Sheets(nb_feuilles).Range("B2") = name
End With
userform_oth_nature.Show
Unload userform_actuel
End Sub
J'ai également essayé de cette manière:
VB:
Private Sub Button_1_Click()
Dim name As Variant

Sheets("modele-other").Copy After:=Sheets(Sheets.Count)
Sheets("newsheet").Select
  
    name = Range("H4")
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).name = name
    Sheets(Sheets.Count).Range("B2") = name
userform_oth_nature.Show
Unload userform_actuel
End Sub
Voilà, merci d'avance pour vos réponses!

P.S.: Les noms de sub et de userform mis ici ont été modifiés, ils ne sont pas à prendre en compte
P.P.S.: Je me suis déjà renseigné et ai essayé diverses choses, il me semble donc bon à savoir pour vous (cela vous évitera de perdre du temps) qu'aucune feuille n'est masquée sur ce document.
 
Dernière édition:

Paf

XLDnaute Barbatruc
Bonjour,

Eviter d'utiliser des "noms" VBA comme nom de variable (par ex : name), et penser à bien rattacher les range à la feuille où ils doivent "opérer"

A tester:
VB:
Dim Nom As String

Worksheets("modele-other").Copy After:=Sheets(Worksheets.Count)
Nom = Worksheets("newsheet").Range("H4")
Worksheets(Worksheets.Count).name = Nom
Worksheets(Worksheets.Count).Range("B2") = Nom
.../...
A+
 

Resmi

XLDnaute Nouveau
Bonjour Paf,

Merci beaucoup de votre réponse.
J'ai essayé votre solution, et l'erreur a disparu. La feuille est bel et bien copiée à la suite des autres, puis sélectionnée comme je le souhaite. En revanche, elle n'est pas nommée, restant donc modele-other(2) comme l'implique le fonctionnement par défaut d'Excel.
Mon code devient donc le suivant:

VB:
Private Sub Button_1_Click()
Dim Nom As String

Worksheets("modele-other").Copy After:=Sheets(Worksheets.Count)
Nom = Worksheets("newsheet").Range("H4")
Worksheets(Worksheets.Count).name = Nom
Worksheets(Worksheets.Count).Range("B2") = Nom

userform_oth_nature.Show
Unload userform_actuel
End Sub
J'ai d'ailleurs également essayé en ajoutant un ".Value" à la fin de "Nom = Worksheets("newsheet").Range("H4")" (donnant donc: Nom = Worksheets("newsheet").Range("H4").Value ) pour lui signifier que je souhaite le contenu de la cellule. Malheureusement, rien n'y fait.

Le programme avance clairement puisqu'il charge le userform suivant, mais... Il ne fait pas ce qui est demandé, tout simplement. J'en suis étonné, puisque cela fonctionne très bien sur des macros d'autres classeurs, sans userforms.

Merci d'avance

Resmi
 

Paf

XLDnaute Barbatruc
Chez moi ça fonctionne. La nouvelle feuille est bien nommée selon Worksheets("newsheet").Range("H4") .
Peut-être un problème de version XL ?

Que contient (concrètement) la variable nom
En mode debug ou en rajoutant
Code:
MsgBox Nom
juste après
VB:
Nom = Worksheets("newsheet").Range("H4")
 

Resmi

XLDnaute Nouveau
J'ai essayé avec le MsgBox, et il m'affiche parfaitement ce que j'ai inscrit dans la cellule H4, et que je souhaite comme nom.
Honnêtement je ne comprends pas. Visiblement le nom est bien défini, le programme fonctionne sur d'autres feuilles, il n'y a que sur celle-ci avec le userform que cela n'est pas fonctionnel.

Peut-être un problème de version en effet, je ne sais pas.

Ce classeur est conçu pour tourner sur un PC autre que le mien, j'essayerais donc sur le "définitif", le bug vient peut-être de mon ordinateur.

En tout cas merci beaucoup de votre aide, bonne journée à vous et à bientôt!
 

Mrlr

XLDnaute Nouveau
Bonjour Resmi,
Je travaille actuellement sur un programme similaire. Je stock le nom des cellules dans un tableau à une colonne etensuite je vien sdupliquer une feuille modèle autant de fois qu'il y a de ligne dans mon tableau. J'affecte ensuite le contenu de la ligne 1 de mon tableau à la première feuille que je viens de créer et ainsi de suite.

Voici mon code :

VB:
'''''boucle pour trouver la taille du tableau
    With Worksheets("BDD").Select
    Dim longueur_tableau As Integer
    longueur_tableau = 0                                    'initialisation du compteur
    For i = 2 To 100
        If Cells(i, "a") = 0 Then
        longueur_tableau = longueur_tableau + 0             'Si la case de la colonne A est nulle, alors le compteur ajoute 0 à la valeur intitiale
        Else                   
        longueur_tableau = longueur_tableau + 1             'Si la case de la colonne A n'est pas nulle, alors le compteur ajoute 1 à la valeur intiale
        End If
    Next i
    End With
   
   
'''''Création du tableau où les noms des cellules sont stockés
    Dim tab1()
    ReDim tab1(longueur_tableau, 1)


'''''Boucle d'affectation du contenu des cellules aux noms des feuilles
    For i = 1 To longueur_tableau
        tab1(i, 1) = Worksheets("BDD").Cells(i + 1, "A").Text                             'le i+1 ici me permets de ne pas prendre la première ligne de ma BDD
        Worksheets("Modèle").Copy After:=Sheets(Sheets.Count)                    'feuille modèle que je copie colle et que je renomme par la suite avec la valeur des cellules'
        Worksheets("Modèle (2)").Name = tab1(i, 1)
    Next i
 

Resmi

XLDnaute Nouveau
Bonjour Mrlr,

En effet, c'est un peu ce que je veux faire également, sans les boucles.
Je vois que tu prends la valeur directement de la cellule en spécifiant cette dernière, je vais essayer de faire de même.

Et le fait de l'appeler "Modèle (2)" est d'ailleurs une très bonne idée, à laquelle je n'avais pas pensé! Je soupçonne mon classeur de buguer à cause du "Sheets.Count" de la feuille à sélectionner. Je vais essayer ainsi, merci beaucoup!
 

Mrlr

XLDnaute Nouveau
C'est juste que lorsque je copie colle ma feuille "Modèle" dans ma Macro elle se renomme automatiquement en "Modèle (2)"
 

Resmi

XLDnaute Nouveau
En effet. Mais je prenais par le numéro de la feuille, et non pas par son nom direct, alors que j'ai l'impression qu'Excel préfère cela. Je vais donc tenter, merci encore! ^^
 

Resmi

XLDnaute Nouveau
Re-bonjour le fil!

Alors, j'ai transféré mon fichier, j'ai recommencé presque entièrement mon programme, en réutilisant l'enregistreur de macros. J'ai ainsi réussi. Une petite différence (minime à mes yeux mais pas à ceux d'Excel visiblement...) à débloqué la chose.
C'est l'ajout de la ligne :
VB:
Range("H4").
ActiveCell.FormulaR1C1 = Nom
Au lieu d'un simple "Nom = Range("H4")".
Visiblement, Excel préfère passer par un format R1C1, seules les forces obscures de la programmation savent pourquoi je suppose...

En tout cas voilà, problème résolu, bonne journée à tous!
 
Haut Bas