2012-06-08 30 views
16

Póster por primera vez, por lo que si hay algún formato o directrices que no pude cumplir, hágamelo saber para que pueda solucionarlo.VBA error 1004 - seleccione el método de clase de rango fallido

Así que, básicamente, le pido al usuario el directorio de archivos del archivo de Excel, luego configuro algunas variables (originalmente establecidas en público como variables del proyecto, ya que estas se usaban y cambiaban en otros lugares). También agregué las líneas para establecer estas variables a nada (por si acaso, no creo que eso importe). Luego establezco estas variables en el archivo de Excel, el libro de trabajo y las hojas a las que quiero acceder.

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 

lo que he creado dos variables diferentes hoja 'sourceSheets' y 'sourceSheetsSum', el código funciona si uso sourceSheets '', pero el error 1004 se produce si yo uso 'sourceSheetsSum'. También probé el código con la variable 'sourceSheet' eliminada por completo, en caso de que estuviera anulando 'sourceSheetSum' por algún motivo.

Estoy bastante seguro de que el libro de Excel y las hojas existen y se llaman correctamente, ya que ejecuté un código rápido para recorrer todas las hojas del libro de trabajo y mostrar los nombres, que se muestran a continuación.

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

Con la salida de depuración de

Mediciones
Resumen del análisis Ajustes
Análisis

Así que, ¿alguien tiene alguna idea de lo que podría significar este error, o cómo puedo ¿posiblemente vas a encontrar más acerca de qué es realmente el error?

EDIT: Así que decidí agregar un poco a la lista de los nombres de las hojas, no estoy seguro si ayudará en absoluto.

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

El análisis de las impresiones de depuración Resumen, por lo que saben que existe la hoja del libro, y no debería haber ningún problema con un 'error tipográfico' en los nombres.
Sin embargo, el código todavía tiene el mismo error en la misma línea.

deusxmach1na: Creo que quería que yo cambie

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

Set sourceSheet = sourceBook.Sheets("Measurements") 

Para

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

Set sourceSheet = sourceBook.Worksheets("Measurements") 

Pero esto no cambia el error, recuerdo que tuve que similar a eso, y luego lo cambió desde He leído que la variante es como una captura de todo, no realmente tan sólida en qué variante es.

+1

Me gustaría atenuar sus hojas específicamente como hojas de trabajo tal vez y ver qué pasa. 'Dim sourceSheetSum como Worksheet' En realidad, es posible que desee atenuar todo con más especificidad. – deusxmach1na

Respuesta

23

Debe seleccionar la hoja antes de poder seleccionar el rango.

He simplificado el ejemplo para aislar el problema. Pruebe esto:

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 

Reemplace Sheet1 y Sheet2 con sus nombres de hoja.

NOTA IMPORTANTE: El uso de variantes es peligroso y puede provocar errores difíciles de matar.Úselos solo si tiene una razón muy específica para hacerlo.

+0

¡No puedo creer que me hayas vencido por 13 segundos en una pregunta de 2 horas! +1 por la velocidad ;-) – assylias

+0

¡Agradable! ¡El servicio de asistencia de Excel stackoverflow está abierto para los negocios! –

+2

@HeadofCatering ¡Buena llamada! Casi nunca uso Selects y olvidé que primero tiene que seleccionar la hoja. Suspiro, buen ol macro código grabado. – deusxmach1na

7

No se puede seleccionar un rango sin haber seleccionado la hoja es en tratar de seleccionar la hoja primero y ver si todavía obtener el problema:.

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

+1 por responder la misma pregunta casi al mismo tiempo. –

+0

+ 1 por como lo hiciste al mismo tiempo también :) –

3

assylias y Jefe de Restauración ya tienen dado el motivo por el cual el error está ocurriendo.

Ahora con respecto a lo que está haciendo, por lo que entiendo, no es necesario utilizar Select en absoluto

supongo que está haciendo esto desde VBA de PowerPoint? En caso afirmativo, se reescribirá el código como

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

Hola Tengo un problema relacionado (perdón por el secuestro). Estoy refabricando un código y moviéndolo de la hoja a un módulo. Accede a la hoja de trabajo usando '' Worksheets (name) .Range'. Funcionó bien sin un Seleccionar antes de moverlo a un módulo. Ahora necesito agregar una línea 'Worksheet.Select' antes de que funcione para que me dé un '' 1004''. En algunos casos, incluso eso no funciona. Alguna idea de por qué mover el código creó un problema y cómo resolverlo sin agregar la línea un millón de veces. Lo siento, soy un novato de VBA. – DPD

+0

@DPD: Sí ... Ver este enlace;) http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select –

+0

¡Gracias! Eso era exactamente lo que necesitaba. Upovted ambas respuestas. – DPD

0

Eliminando la selección de rango antes de que la copia me funcionara. Gracias por las publicaciones.

Cuestiones relacionadas