2010-10-11 10 views
5

To jest kod, nad którym obecnie pracuję i pojawia się ten problem. Jestem początkującym programistą w Excelu i nie wiem, co jest nie tak.Metoda wyboru klasy zakresu nie powiodła się przez VBA

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 

Błąd jest Metoda klasy zasięgiem zawiodły poprzez VBA, błędu 1004. Jakieś pomysły?

Dzięki.

Edit:

Więc po prostu zmienił kod do

Sheets("BxWsn Simulation").Select 
Range("Result").Select 

Wierzę, że to jest to, co masz na myśli przez co aktywny? Jednak nadal otrzymuję metodę "Zakres" obiektu "_Worksheet", błąd 1004

+0

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

+0

Zaktualizowałem swoją odpowiedź. – GSerg

Odpowiedz

12

Wierzę, że masz tutaj the same problem.
Arkusz musi być aktywny, zanim będzie można wybrać jego zakres.

Nie należy również pomijać nazwę arkusza kwalifikator:

Sheets("BxWsn Simulation").Select 
Sheets("BxWsn Simulation").Range("Result").Select 

Albo

With Sheets("BxWsn Simulation") 
    .Select 
    .Range("Result").Select 
End WIth 

która jest taka sama.

+0

Dzięki, że udało się. – guesthouse123

10

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.

+0

+1 ta odpowiedź zasługiwała na jedną. –

+0

@Dick Kusleika, bardzo pouczające, dzięki. – jmaz

1

To zadziałało dla mnie.

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

W ten sposób można ominąć to w łatwy, nieskomplikowany sposób.
Zamiast używać sheet(x).range użyj Activesheet.range("range").select

Powiązane problemy