2010-10-18 21 views
8

Estoy intentando crear un formato condicional en el tiempo de ejecución (huzzah) para un complemento (double huzzah), y he descubierto que aparentemente algunas funciones no se pueden usar como lo harían en un hoja de trabajo normal. (Acabo de recibir un error de llamada al procedimiento no válido 5 cuando trato de crear el CF haciendo referencia a una función de VBA que podría llamar en una celda, aunque está en el complemento y no en el libro de trabajo; puedo crear la CF fine con un built-in en funcionamiento.) La confirmación más clara que he encontrado para esto es here, pero en realidad no explica cuál es el problema; esa es la parte esotérica, me encantaría saber más acerca de lo que puedo esperar con esto.Fórmula de Excel para verificar el contenido de la celda

La parte de rubber-meets-road es: ¿puedo evitar VBA por completo y utilizar una serie de funciones exclusivas de Excel, integradas para verificar si una celda dada contiene una constante (es decir, un valor ingresado por usuario), una fórmula (es decir, algún tipo de cálculo, operación lógica, etc .-- más o menos comienza con an =), o un enlace (es decir, una referencia a una celda en otra hoja de trabajo u otro libro de trabajo)? Sé que Excel tiene esta determinación al alcance de la mano; atestigüe los usos y la velocidad de GoTo/Special. ¿Cómo puede llegar I?

Gracias de antemano por su ayuda.

+0

la célula() función puede ser útil si la constante es una cadena, ver aquí: http://www.informit.com/articles/article.aspx?p=440961 (Use CELL ("tipo", A1), donde A1 es su celda). No estoy seguro de cuál es la diferencia entre una "fórmula" y un "enlace" en su pregunta. –

+0

Sí, sé que la función CELL, gracias, comenzó con eso, pero es (a) lenta en grandes rangos y (b) no lo suficientemente específica. En mi nomenclatura, todos los enlaces son fórmulas, pero no todas las fórmulas son enlaces. Un ejemplo muy simple: Esta es una fórmula: = SUMA (A1: A5) Este es un enlace: = SUMA (A1: A5, Hoja1! B6) – downwitch

+0

¿Qué esperas para referencias indirectas donde la celda real utilizada es quizás no se conoce hasta el tiempo de ejecución (es decir, puede ser lo que usted llama un "enlace" a veces) –

Respuesta

1

Updated for Excel 2013:

Para las versiones de Office 2013 y superior, la función ISFORMULA ¹ está disponible . Combinando esto con la función NOT, la función AND y la función COUNTBLANK, ISBLANK o LEN puede generar una fórmula para determinar si una celda contiene una constante.

Las fórmulas estándar en E2: F2 son,

=ISFORMULA(D2) 
=AND(NOT(ISFORMULA(D2)), LEN(D2)) 

ISFORMULA_update

Si se requiere más información sobre la naturaleza del valor de la celda la TYPE function se puede utilizar para determinar si el contenido de células son una número, texto, booleano, error o matriz.

Cuando se utiliza en conjunto las funciones de hoja de nativos discutidos aquí pueden reproducir los resultados disponibles de VBA de Range.SpecialCells method y sus xlCellTypeConstants o xlCellTypeFormulasxlCellType enumeración.


¹ La función ISFORMULA se introdujo con Excel 2013. No está disponible en las versiones anteriores.

+0

Por fin, un ganador: alguien en MSFT estaba tan frustrado como yo, supongo. He estado usando 2013 por un tiempo y no sabía nada de esto, ¡gracias! – downwitch

0

No estoy seguro si esto es lo que quiere, pero parece hacer lo que está pidiendo, al menos algo de eso.

http://www.ozgrid.com/VBA/special-cells.htm

Es el método range.specialcells.

Devuelve una serie que contiene sólo constantes, o sólo las fórmulas, etc.

Un ejemplo de cómo se muestra a continuación el código sería usado:

Sub CheckForConstants() 
    Dim x As Range 
    Set x = Selection.SpecialCells(xlCellTypeConstants, xlNumbers) 
    MsgBox "address of cells that contain numbers only is " & x.Address 
    Set x = Selection.SpecialCells(xlCellTypeConstants) 
    MsgBox "address of cells that contain constant of any type is " & x.Address 
End Sub 

selecciona un intervalo y luego ejecutar esta macro y devolverá la dirección de aquellas celdas que cumplan con los requisitos.

La primera x busca celdas que solo contengan números. El segundo x busca células que contiene las constantes

El rango en este caso fue la selección, pero se puede ajustar a lo que quiere, es decir Range ("A1: B5"), etc.

Fui volver a la hoja de trabajo y utilizar el método especial goto.

Al parecer, también utiliza el método range.special.

Utilicé la opción de macro de grabación y esto es lo que obtuve.

Selection.SpecialCells(xlCellTypeConstants, 23).Select 
    Range("M7").Select 
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select 
    Range("I6:J16").Select 
    Selection.SpecialCells(xlCellTypeConstants, 1).Select 
    Range("L9").Select 
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst 
    Sheets("CP").Select 
    Application.CutCopyMode = False 
    Range("I21").Select 
    ActiveSheet.DrawingObjects.Select 
    Application.Goto Reference:="GoToSpecialRoutine" 

La función especial Ir a la hoja de trabajo utiliza el método de celdas especiales para algunas de sus funciones.

También usa otros también. En las últimas 5 líneas de códigos cambié la hoja de trabajo y le pedí que fuera a los objetos.

Realmente no les llega a ellos. Simplemente los selecciona.

hoja de cálculo CP contenía objetos y utilizó el código en las últimas 3 líneas para seleccionar todos los objetos en la hoja de trabajo.

La mejor apuesta para ver el código detrás de goto special es grabar una macro y luego usar la función especial/especial en la hoja de trabajo.

Cuando haya terminado, detenga la grabación y vea la macro que grabó.

No conozco ninguna otra característica para seleccionar por tipo de celda, pero solo soy un recién llegado por lo que podría estar allí muy fácilmente y no ser conocido por mí.

+0

Gracias, pero como dice la parte en negrita de la pregunta anterior, la solución debe ser solo de Excel e incorporada, no VBA. Tengo funciones de VBA que determinan estos tipos de contenido de celda (Constante, Fórmula, Fórmula con enlace) bien. La publicación original explica por qué. – downwitch

0

No creo que se puede evitar por completo, pero VBA puede crear una UDF sencilla y usarla dentro de Excel

Ej

Function IsFormula(Check_Cell As Range) 
    IsFormula = Check_Cell.HasFormula 
End Function 

y

Function IsLink(Check_Cell As Range) 

    If InStr(1, Check_Cell.Formula, "!", vbTextCompare) Then 
    IsLink = Check_Cell.HasFormula 
    End If 
End Function 

= ISFORMULA (A1) devolverá TRUE si hay una fórmula en A1 y FALSE, de lo contrario = IsLink (A1) devolverá TRUE si hay una fórmula en A1 que contenga '!' de lo contrario FALSO

Se puede combinar estos y crear una "fórmula" salida de cadena, "Enlace", "Valor"

+0

Gracias, pero como dice la publicación original, no puede llamar a las funciones de VBA (que también he escrito) para el formato condicional de un complemento. – downwitch

+0

No tiene que llamar a una función. Forzar un recálculo de Excel y la UDF debería actualizarse automáticamente. – osknows

+0

¿Cómo ayuda eso? Estoy tratando de establecer formatos condicionales, no poner UDF en las celdas. No puede incrustar un UDF en una llamada de fórmula de formato condicional si el UDF vive en un complemento de Excel. Te recomiendo que lo intentes; produce este error: "No puede usar la referencia a otras hojas de trabajo o libros de trabajo para los criterios de Formato condicional". – downwitch

Cuestiones relacionadas