web-dev-qa-db-fra.com

La méthode de sélection de la classe Range a échoué via VBA

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

8
guesthouse123

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.

20
GSerg

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.

12
Dick Kusleika

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
1
yakovmeister