2012-05-17 88 views
13

Tengo una función VBA dentro de una hoja de cálculo que funciona en otra hoja de cálculo que se abre en una etapa anterior de mi macro. La macro solía funcionar bien, pero recientemente comenzó a causar un error ("No se puede obtener la propiedad RoundDown de la clase WorksheetFunction") cuando se ejecuta.Error de Excel 1004 "No se puede obtener ... propiedad de la clase WorksheetFunction" que aparece de forma incoherente

Creo que entiendo cuál sería el error causado (un problema al ejecutar RoundDown) pero no puedo ver por qué se dispara en mi macro y la parte más rara es que cuando voy al modo de depuración y paso por el código en el VBE el error no se repite (a pesar de que nada obviamente cambia).

¿Alguien tiene una experiencia similar de este tipo de error que ocurre de forma inconsistente y sabe lo que podría hacer para resolverlo?

Soy razonablemente VBA/experto en Excel, pero cualquier sugerencia sobre los pasos posteriores para diagnosticarlo sería apreciada. Me pregunto si hay algún problema con la hoja de cálculo abierta que no está lista pero no veo cómo.

El código está aquí. El error ocurre en la línea marcada con un comentario.

Public Function GetDatesA(sWorkbookname As String, sSheetname As String, sCell As String) As Variant 

    Dim vDateList() As Variant 
    Dim currentCell As Range 
    Dim n As Long 

    Set currentCell = Workbooks(sWorkbookname).Worksheets(sSheetname).Range(sCell) 

    n = 0 

    Do 
     If Trim(currentCell.Value) = "" Then 
      Exit Do 
     Else 
      ReDim Preserve vDateList(0 To 1, 0 To n) 
      vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0) 'error occcurs on this line 
      vDateList(1, n) = currentCell.Column 
      'Debug.Print currentCell.Value 
     End If 
     Set currentCell = currentCell.Offset(0, 1) 
     n = n + 1 
    Loop While currentCell.Column < XL_LAST_COLUMN 

    GetDatesA = vDateList 

End Function 

Otros detalles son:

versión
  • Excel: 2010

  • archivo se abre reside localmente en mi C: conducir; mi macro está en una hoja de cálculo en la red

  • Formato de archivo para ambos archivos es .xls (es decir, Excel 2003) - no tengo la opción de cambiar esta

  • Windows 7 (no es que creo sería pertinente)

dos puntos que he probado ya son:

  • sustituir una función de hoja de cálculo diferente (por ejemplo, Min (currentCell)) y TH también causa el mismo problema

  • Tener el archivo abierto ya parece detener el problema - Me pregunto si hay alguna forma de que el libro de trabajo que se está abriendo (en lugar de mi libro principal con la macro) no sea habilitado para macros y esto está interfiriendo. ¡Pero incluso si esta es la causa, no estoy seguro de cómo solucionarlo!

¿Alguna idea?

+0

Si inserta 'Debug.Print currentCell.Value' justo antes de' vDateList (0, n) = WorksheetFunction.RoundDown (currentCell.Value, 0) ', lo que hacer ¿usted obtiene? ¿Es un número válido? –

+3

También cambie 'WorksheetFunction.RoundDown (currentCell.Value, 0)' a 'Application.WorksheetFunction.RoundDown (currentCell.Value, 0)' –

+0

¡Gracias! Le di una oportunidad. Obtengo una lista de fechas (de hecho números: se muestran como una fecha a menos que multiplique por 1 para obtener el número de Excel correspondiente a la fecha). Definitivamente todos pasan bien si paso por el código pero no lo hago si lo dejo funcionar solo (cuando recupera los mismos valores exactos), por lo que probablemente sea algo acerca de la función WorksheetFunction en lugar de mis datos incorrectos. Ahora estoy trabajando en el uso de "En caso de error ...": parece haber error solo la primera vez, por lo que es posible que primero haga una llamada arbitraria a la función Hoja de cálculo con En reanudar siguiente y luego se apaga después. – Neil

Respuesta

21

Este error se produce a menudo cuando cualquier argumento pasado a la función de la hoja de trabajo no es del tipo correcto o simplemente no tiene sentido.

Por ejemplo, he tenido este problema al llamar a WorksheetFunction.Asin con un argumento mayor que 1. En su caso, supongo que currentCell.Value es un valor no numérico o uno que no corresponde a la configuración de región con respecto a los números.

Sí, el mensaje de error es realmente erróneo.

+0

Solo como referencia, se produce el mismo error al llamar a WorksheetFunction.Ln con valores negativos. –

+0

o cuando se solicita un artículo en la posición 0 en una colección de Excel basada en 1, como hoja. Imágenes (0) – Cel

+0

También ocurre cuando el rango que está tratando de transponer no es "en una sola pieza". Entonces no puedes transponer los rangos que están fracturados –

1

Obtuve el error "No se pudo obtener * propiedad de clase de clase de Worksheet" utilizando las funciones Transpose, MMult, MDterm y MInverse.

Pude hacer que mi código se ejecutara al poner "Opción Base 1" en la sección Declaraciones (antes del código real) del Módulo particular en el Editor.

Excel asume "Opción Base 0" que agregará una fila y columna extra de celdas vacías. Esto causará que ocurra el error y no es inmediatamente obvio de ver.

0

Me he encontrado con esto antes, y para mí fue porque el rango de criterios no tenía sentido, como dijo Andre anteriormente.

Véase el ejemplo siguiente fórmula: .Cells(11, i).Formula = Application.WorksheetFunction.CountIfs(Sheets("Sheet1").Range("AC8:C" & n), "S")

Tener un vistazo a la gama ... no tiene sentido. Modificado el rango "AC8:C"-"AC8:AC" y funcionará perfectamente

Cuestiones relacionadas