2012-06-08 19 views
16

Primo poster, quindi se c'è qualche formattazione o linee guida a cui non sono riuscito ad aderire, per favore fatemelo sapere in modo che possa sistemarlo.Errore VBA 1004 - selezionare il metodo della classe intervallo non riuscito

Quindi, in pratica, sto chiedendo all'utente la directory dei file del file excel, quindi ho impostato alcune variabili (originariamente impostate su public come variabili di progetto, poiché queste venivano utilizzate e modificate in altri luoghi). Ho anche aggiunto le righe per impostare queste variabili su nulla (nel caso, non penso che dovrebbe essere importante). Quindi imposto queste variabili al file excel, alla cartella di lavoro e ai fogli a cui voglio accedere.

Dim filepath as String 
filePath = CStr(fileDialog)    'ask file dir, set to string 
Dim sourceXL As Variant     'these three were orig project variables 
Dim sourceBook As Variant 
Dim sourceSheet As Variant 
Dim sourceSheetSum As Variant 

Set sourceXL = Nothing     'set to nothing in case...? 
Set sourceBook = Nothing 
Set sourceSheet = Nothing 
Set sourceSheetSum = Nothing 

Set sourceXL = Excel.Application   'set to the paths needed 
Set sourceBook = sourceXL.Workbooks.Open(filePath) 
Set sourceSheet = sourceBook.Sheets("Measurements") 
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary") 

Dim measName As Variant     'create variable to access later 
Dim partName As Variant 

sourceSheetSum.Range("C3").Select   'THIS IS THE PROBLEM LINE 

measName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value 
sourceSheetSum.Range("D3").Select 
partName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value 

Così ho creato due differenti variabili Foglio 'sourceSheets' e 'sourceSheetsSum', il codice funziona se io uso 'sourceSheets', ma l'errore 1004 si verifica se io uso 'sourceSheetsSum'. Ho anche provato il codice con la variabile 'sourceSheet' rimossa completamente, nel caso in cui per qualche motivo sostituisse 'sourceSheetSum'.

Sono abbastanza fiducioso che la cartella di lavoro e i fogli Excel esistono e vengono chiamati correttamente, poiché ho eseguito un rapido bit di codice per scorrere tutti i fogli della cartella di lavoro e generare i nomi, riportati di seguito.

For j = 1 To sourceBook.Sheets.Count 
Debug.Print (Sheets(j).name) 
Next j 

Con l'output di debug di

Misure
Analisi Riepilogo impostazioni
Analysis

Così, qualcuno ha qualche idea che cosa questo errore potrebbe significare, o come posso possibilmente andare a trovare di più su ciò che l'errore è in realtà?

MODIFICA: Così ho deciso di aggiungere un po 'alla lista dei nomi dei fogli, non sono sicuro se sarà di aiuto.

For j = 1 To sourceBook.Sheets.Count 
    listSheet(j) = Sheets(j).name 
Next j  
Debug.Print (listSheet(2))  
Set sourceSheetSum = sourceBook.Sheets(listSheet(2)) 

Il debug di stampe Analisi Sintesi, quindi so che il foglio esiste nella cartella di lavoro e non ci dovrebbero essere problemi con un 'errore di battitura' nei nomi.
Il codice ha ancora lo stesso errore sulla stessa linea.

deusxmach1na: Penso che si voleva me di cambiare

Dim sourceXL As Variant     
Dim sourceBook As Variant 
Dim sourceSheet As Variant 
Dim sourceSheetSum As Variant 

Set sourceSheet = sourceBook.Sheets("Measurements") 

Per

Dim sourceXL As Excel.Application 
Dim sourceBook As Excel.Workbook 
Dim sourceSheet As Worksheet 
Dim sourceSheetSum As Worksheet 

Set sourceSheet = sourceBook.Worksheets("Measurements") 

Ma questo non cambia l'errore, mi ricordo che ho avuto è simile a quello, e poi cambiato da quando Ho letto che la variante è come un catch all, non in realtà così solida su quale sia la variante.

+1

Vorrei attenuare i fogli specificatamente come fogli di lavoro e vedere cosa succede. 'Dim sourceSheetSum as Worksheet 'In realtà, si potrebbe voler attenuare tutto con più specificità. – deusxmach1na

risposta

23

È necessario selezionare il foglio prima di poter selezionare l'intervallo.

Ho semplificato l'esempio per isolare il problema. Prova:

Option Explicit 


Sub RangeError() 

    Dim sourceBook As Workbook 
    Dim sourceSheet As Worksheet 
    Dim sourceSheetSum As Worksheet 

    Set sourceBook = ActiveWorkbook 
    Set sourceSheet = sourceBook.Sheets("Sheet1") 
    Set sourceSheetSum = sourceBook.Sheets("Sheet2") 

    sourceSheetSum.Select 

    sourceSheetSum.Range("C3").Select   'THIS IS THE PROBLEM LINE 

End Sub 

Sostituire Sheet1 e Sheet2 con i nomi dei fogli.

NOTA IMPORTANTE: L'utilizzo delle varianti è pericoloso e può portare a bachi difficili da uccidere.Usali solo se hai una ragione molto specifica per farlo.

+0

Non posso credere che tu mi abbia battuto di 13 secondi su una domanda vecchia di 2 ore! +1 per la velocità ;-) – assylias

+0

Bello! L'helpdesk Excel di StackOverflow è aperto per le imprese! –

+2

@HeadofCatering Good Call! Non uso quasi mai Selezioni e ho dimenticato che devi prima selezionare il foglio. Sigh, buon vecchio codice registrato in macro. – deusxmach1na

7

Non è possibile selezionare un intervallo senza aver prima selezionato il foglio è in Provate a selezionare il foglio prima e vedere se è ancora possibile ottenere il problema:.

sourceSheetSum.Select 
sourceSheetSum.Range("C3").Select 
+0

+1 per rispondere alla stessa domanda quasi alla stessa ora. –

+0

+ 1 per come lo hai fatto allo stesso tempo :) –

3

assylias e Responsabile Catering hanno già dato il tuo motivo per cui si sta verificando l'errore.

Ora riguardo a ciò che si sta facendo, da quanto ho capito, non è necessario utilizzare Select affatto

Credo che si sta facendo questo da VBA PowerPoint? Se sì, il tuo codice verrà riscritto come

Dim sourceXL As Object, sourceBook As Object 
Dim sourceSheet As Object, sourceSheetSum As Object 
Dim lRow As Long 
Dim measName As Variant, partName As Variant 
Dim filepath As String 

filepath = CStr(FileDialog) 

'~~> Establish an EXCEL application object 
On Error Resume Next 
Set sourceXL = GetObject(, "Excel.Application") 

'~~> If not found then create new instance 
If Err.Number <> 0 Then 
    Set sourceXL = CreateObject("Excel.Application") 
End If 
Err.Clear 
On Error GoTo 0 

Set sourceBook = sourceXL.Workbooks.Open(filepath) 
Set sourceSheet = sourceBook.Sheets("Measurements") 
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary") 

lRow = sourceSheetSum.Range("C" & sourceSheetSum.Rows.Count).End(xlUp).Row 
measName = sourceSheetSum.Range("C3:C" & lRow) 

lRow = sourceSheetSum.Range("D" & sourceSheetSum.Rows.Count).End(xlUp).Row 
partName = sourceSheetSum.Range("D3:D" & lRow) 
+0

Ciao, ho un problema correlato (mi dispiace per il dirottamento). Sto refactoring del codice e lo spostamento dal foglio a un modulo. Accede al foglio di lavoro usando 'Worksheets (name) .Range'. Ha funzionato bene senza un Select prima di spostarlo su un modulo. Ora ho bisogno di aggiungere una riga 'Worksheet.Select' prima di farlo funzionare altrimenti mi dà un' '1004''. In alcuni casi anche questo non funziona. Qualche idea sul perché lo spostamento del codice abbia creato un problema e come risolverlo senza aggiungere la linea un milione di volte. Scusa, sono un principiante VBA. – DPD

+0

@DPD: Yup ... Vedi questo link;) http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select –

+0

Grazie! Era esattamente ciò di cui avevo bisogno. Upovted entrambe le risposte. – DPD

0

Rimozione della selezione dell'intervallo prima che la copia funzionasse per me. Grazie per i post.

Problemi correlati