C'est le code que je travaille actuellement, et je reçois ce problème. Je suis novice chez Excel et je ne peux pas comprendre ce qui ne va pas.
Private Sub cmdRecord_Click()
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as Excel told me.
Selection.Copy
Sheets("Reslt Record").Select
Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Sheets("CuCon Simulator").Select
Application.CutCopyMode = False
Range("Improvement").Select
End Sub
L'erreur correspond à l'échec de la méthode Select de la classe Range via VBA, erreur 1004. Des idées?
Merci.
Modifier:
Alors je viens de changer le code en
Sheets("BxWsn Simulation").Select
Range("Result").Select
Je crois que c’est ce que vous voulez dire en le rendant actif? Cependant, la méthode 'Range' de l’objet '_Worksheet' a échoué, erreur 1004
Je crois que vous rencontrez le même problème ici.
La feuille doit être active pour que vous puissiez y sélectionner une plage.
De plus, n'omettez pas le qualificatif de nom de feuille:
Sheets("BxWsn Simulation").Select
Sheets("BxWsn Simulation").Range("Result").Select
Ou,
With Sheets("BxWsn Simulation")
.Select
.Range("Result").Select
End WIth
qui est le même.
La réponse correcte à cette question particulière est "ne sélectionnez pas". Parfois, vous devez sélectionner ou activer, mais 99% du temps vous ne le faites pas. Si votre code ressemble à
Select something
Do something to the selection
Select something else
Do something to the selection
Vous avez probablement besoin de refactoriser et d'envisager de ne pas sélectionner.
L'erreur, méthode 'Plage' de l'objet '_Worksheet' a échoué, erreur 1004, car la feuille sur laquelle le bouton se trouve ne comporte pas de plage nommée "Résultat". La plupart des propriétés (peut-être toutes) qui renvoient un objet ont un objet Parent par défaut. Dans ce cas, vous utilisez la propriété Range pour renvoyer un objet Range. Comme vous ne qualifiez pas la propriété Range, Excel utilise la valeur par défaut.
L'objet parent par défaut peut être différent en fonction des circonstances. Si votre code était dans un module standard, alors ActiveSheet serait le parent par défaut et Excel essaierait de résoudre ActiveSheet.Range ("Result"). Votre code est dans le module de classe d'une feuille (la feuille avec le bouton dessus). Lorsque la référence non qualifiée y est utilisée, le parent par défaut est la feuille attachée à ce module. Dans ce cas, ils sont identiques car la feuille doit être active pour pouvoir cliquer sur le bouton, mais ce n'est pas toujours le cas.
Lorsque Excel indique que l'erreur inclut un texte tel que "_Object" (le vôtre dit "_Worksheet"), il fait toujours référence à l'objet parent par défaut - le trait de soulignement le trahit. Généralement, la solution consiste à qualifier la référence en expliquant le parent. Mais dans le cas de la sélection et de l'activation lorsque vous n'en avez pas besoin, il est préférable de simplement refactoriser le code.
Voici un moyen d'écrire votre code sans sélection ou activation.
Private Sub cmdRecord_Click()
Dim shSource As Worksheet
Dim shDest As Worksheet
Dim rNext As Range
'Me refers to the sheet whose class module you're in
'Me.Parent refers to the workbook
Set shSource = Me.Parent.Worksheets("BxWsn Simulation")
Set shDest = Me.Parent.Worksheets("Reslt Record")
Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)
shSource.Range("Result").Copy
rNext.PasteSpecial xlPasteFormulasAndNumberFormats
Application.CutCopyMode = False
End Sub
Lorsque je suis dans un module de classe, comme le module de classe de la feuille dans lequel vous travaillez, j'essaie toujours de faire les choses en termes de classe. J'utilise donc Me.Parent au lieu de ActiveWorkbook. Cela rend le code plus portable et évite les problèmes inattendus lorsque les choses changent.
Je suis sûr que le code que vous avez maintenant s'exécute en millisecondes. Vous pouvez donc vous en soucier, mais éviter de le sélectionner accélérera votre code et vous n'aurez pas à définir ScreenUpdating. Cela peut devenir important à mesure que votre code grandit ou dans une situation différente.
Cela a fonctionné pour moi.
RowCounter = Sheets(3).UsedRange.Rows.Count + 1
Sheets(1).Rows(rowNum).EntireRow.Copy
Sheets(3).Activate
Sheets(3).Cells(RowCounter, 1).Select
Sheets(3).Paste
Sheets(1).Activate