2010-10-11 21 views
5

Questo è il codice con cui sto attualmente lavorando e ho riscontrato questo problema. Sono alle prime armi in Excel e non riesco a capire cosa c'è che non va.Selezionare il metodo della classe Range non riuscito tramite 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 

L'errore viene Seleziona metodo di classe Range non è riuscito via VBA, di errore 1004. Tutte le idee?

Grazie.

Edit:

Così ho solo cambiato il codice per

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

Credo che questo è ciò che si intende per rendendola attiva? Tuttavia sto ancora ricevendo il metodo "Range" dell'oggetto "_Worksheet" non riuscito, errore 1004

+0

E 'meglio lasciare un commento ad una risposta di modificare in silenzio la questione; in quest'ultimo caso, l'autore della risposta non riceverà alcuna notifica sul tuo follow-up. – GSerg

+0

Ho aggiornato la mia risposta. – GSerg

risposta

12

Credo che tu stia avendo the same problem qui.
Il foglio deve essere attivo prima di poter selezionare un intervallo su di esso.

Inoltre, non omettere il qualificatore nome del foglio:

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

Oppure,

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

che è lo stesso.

+0

Grazie a quello ha fatto il trucco. – guesthouse123

10

La risposta corretta a questa domanda è "non selezionare". A volte devi selezionare o attivare, ma il 99% delle volte non lo fai. Se il codice è simile

Select something 
Do something to the selection 
Select something else 
Do something to the selection 

Probabilmente bisogno di refactoring e considerare non la selezione.

Errore, metodo "Intervallo" dell'oggetto "_Worksheet" non riuscito, errore 1004, che si sta ottenendo è perché il foglio con il pulsante su di esso non ha un intervallo denominato "Risultato". La maggior parte (forse tutte) delle proprietà che restituiscono un oggetto hanno un oggetto padre predefinito. In questo caso, stai utilizzando la proprietà Range per restituire un oggetto Range. Poiché non si qualifica la proprietà Range, Excel utilizza il valore predefinito.

L'oggetto padre predefinito può essere diverso in base alle circostanze. Se il codice fosse in un modulo standard, l'ActiveSheet sarebbe il padre predefinito e Excel tenterebbe di risolvere ActiveSheet.Range ("Risultato"). Il codice è nel modulo di classe di un foglio (il foglio con il pulsante su di esso). Quando viene utilizzato il riferimento non qualificato, il padre predefinito è il foglio collegato a quel modulo. In questo caso sono uguali perché il foglio deve essere attivo per fare clic sul pulsante, ma non è sempre così.

Quando Excel restituisce l'errore che include testo come '_Object' (il tuo detto '_Worksheet') si riferisce sempre all'oggetto Parent predefinito, il carattere di sottolineatura lo assegna. Generalmente il modo per risolvere questo è qualificare il riferimento essendo espliciti sul genitore. Ma nel caso di selezionare e attivare quando non è necessario, è meglio rifattorizzare il codice.

Ecco un modo per scrivere il codice senza alcuna selezione o attivazione.

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 

Quando sono in un modulo di classe, come modulo di classe della scheda che si sta lavorando in, cerco sempre di fare le cose in termini di quella classe. Quindi uso Me.Parent invece di ActiveWorkbook. Rende il codice più portabile e previene problemi imprevisti quando le cose cambiano.

Sono sicuro che il codice che hai ora viene eseguito in millisecondi, quindi non ti interessa, ma evitando di selezionare sicuramente accelera il tuo codice e non devi impostare ScreenUpdating. Questo potrebbe diventare importante man mano che il tuo codice cresce o in una situazione diversa.

+0

+1 questa risposta meritava una risposta. –

+0

@Dick Kusleika, molto informativo, grazie. – jmaz

1

Questo ha funzionato per me.

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

Ecco come ci si muove in modo semplice e non complicato.
Invece di usare sheet(x).range uso Activesheet.range("range").select

Problemi correlati