Prawidłowa odpowiedź na to pytanie to "nie wybieraj". Czasami musisz wybrać lub aktywować, ale w 99% przypadków nie. Jeśli Twój kod wygląda na
Select something
Do something to the selection
Select something else
Do something to the selection
Prawdopodobnie potrzebujesz refaktoryzacji i nie wybieraj.
Błąd, metoda "Zakres" obiektu "_Worksheet" nie powiodła się, błąd 1004, który otrzymujesz, ponieważ arkusz z przyciskiem na nim nie ma zakresu o nazwie "Wynik". Większość (może wszystkie) właściwości, które zwracają obiekt, mają domyślny obiekt nadrzędny. W tym przypadku używasz właściwości Range, aby zwrócić obiekt Range. Ponieważ nie kwalifikujesz właściwości Range, program Excel używa wartości domyślnej.
Domyślny obiekt nadrzędny może być różny w zależności od okoliczności. Jeśli twój kod był w standardowym module, to ActiveSheet byłby domyślnym Parentem, a Excel spróbowałby rozwiązać ActiveSheet.Range ("Result"). Twój kod znajduje się w module klasy arkusza (arkusz z przyciskiem na nim). Gdy używane jest tam odwołanie bez kwalifikacji, domyślnym elementem nadrzędnym jest arkusz dołączony do tego modułu. W tym przypadku są one takie same, ponieważ arkusz musi być aktywny, aby kliknąć przycisk, ale nie zawsze tak jest.
Gdy program Excel podaje błąd, który zawiera tekst, taki jak "_Object" (twój powiedział '_Worksheet'), zawsze odnosi się do domyślnego obiektu nadrzędnego - podkreślenie daje to. Ogólnie rzecz biorąc, sposób naprawy polega na zakwalifikowaniu referencji poprzez wyraźne określenie rodzica. Ale w przypadku wybrania i aktywacji, gdy nie jest to konieczne, lepiej po prostu zreorganizować kod.
Oto jeden sposób napisania kodu bez wybierania ani aktywowania.
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
Kiedy jestem w module klasy, podobnie jak klasy modułu arkusza, że jesteś w pracy, zawsze staram się robić rzeczy z punktu widzenia tej klasy. Używam więc Me.Parent zamiast ActiveWorkbook. Dzięki temu kod jest bardziej przenośny i zapobiega nieoczekiwanym problemom, gdy coś się zmienia.
Jestem pewien, że kod, który masz teraz działa w milisekundach, więc możesz nie dbać o to, ale unikanie wybierania zdecydowanie przyspieszy twój kod i nie musisz ustawiać ScreenUpdating. To może stać się ważne, ponieważ twój kod rośnie lub znajduje się w innej sytuacji.
Lepiej zostawić komentarz do odpowiedzi niż bezgłośnie edytować pytanie; w tym drugim przypadku autor odpowiedzi nie otrzyma żadnych powiadomień o dalszych działaniach. – GSerg
Zaktualizowałem swoją odpowiedź. – GSerg