2010-10-18 5 views
8

J'essaye de créer une mise en forme conditionnelle à l'exécution (huzzah) pour un add-in (double huzzah), et j'ai trouvé que, apparemment, certaines fonctions ne peuvent pas être utilisées comme dans un feuille de calcul normale. (Je reçois juste une erreur d'appel de procédure invalide 5 en essayant de créer le CF en référence à une fonction VBA que je pourrais appeler dans une cellule, même si c'est dans le complément et non le classeur, je peux créer l'amende CF avec un en fonction.) La confirmation la plus claire que j'ai trouvée pour cela est here, mais elle n'explique pas vraiment quel est le problème; c'est la partie ésotérique, j'adorerais en savoir plus sur ce à quoi je peux m'attendre avec ça.Formule Excel pour vérifier le contenu des cellules

La partie caoutchouc-rencontre-route est: puis-je éviter complètement le VBA et utiliser une série de fonctions Excel uniquement, intégrées pour vérifier si une cellule donnée contient une constante (c'est-à-dire une valeur saisie par un user), une formule (c'est-à-dire une sorte de calcul, une opération logique, etc.) commence par un =), ou un lien (c'est-à-dire une référence à une cellule dans une autre feuille de calcul)? Je sais qu'Excel a cette détermination à portée de main; témoin les utilisations et la vitesse de GoTo/Special. Comment est-ce que I pouvez-vous cependant y arriver?

Merci d'avance pour votre aide.

+0

La fonction CELL() pourrait être utile si la constante est une chaîne, voir ici: http://www.informit.com/articles/article.aspx?p=440961 (Utilisez CELL ("type", A1), où A1 est votre cellule.) Je ne sais pas quelle est la différence entre une "formule" et un "lien" dans votre question. –

+0

Oui, je connais la fonction CELL, merci - ça a commencé avec ça, mais c'est (a) lent sur de grandes plages et (b) pas assez spécifique. Dans ma nomenclature, tous les liens sont des formules, mais toutes les formules ne sont pas des liens. Un exemple très simple: Ceci est une formule: = SUM (A1: A5) Ceci est un lien: = SUM (A1: A5, Feuille1! B6) – downwitch

+0

Qu'attendez-vous pour les références indirectes où la cellule réelle utilisée est peut-être pas connu avant l'exécution (ie .. ça peut être ce que vous appelez un "lien" parfois) –

Répondre

1

Updated for Excel 2013:

Pour les versions Office 2013 et plus, la fonction ISFORMULA ¹ est disponible . En combinant cela avec la fonction NOT, la fonction AND et la fonction COUNTBLANK, ISBLANK ou LEN peuvent produire une formule pour déterminer si une cellule contient une constante.

Les formules standard dans E2: F2 sont,

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

ISFORMULA_update

Si de plus amples informations sur la nature de la valeur de la cellule est requise, le TYPE function peut être utilisé pour déterminer si le contenu des cellules sont nombre, texte, booléen, erreur ou tableau.

Lorsqu'il est utilisé de concert les fonctions de feuille de calcul indigènes abordées ici peuvent reproduire les résultats disponibles à partir de VBA de Range.SpecialCells method et ses xlCellTypeConstants ou xlCellTypeFormulas énumération xlCellType.


¹ La fonction ISFORMULA a été introduite avec Excel 2013. Il n'est pas disponible dans les versions antérieures.

+0

Enfin, un gagnant - quelqu'un à MSFT était tout aussi frustré que moi, je suppose. J'utilise 2013 depuis un moment et je ne savais pas à ce sujet, merci! – downwitch

0

Vous ne savez pas si c'est ce que vous voulez, mais il semble faire ce que vous demandez, au moins une partie.

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

C'est la méthode range.specialcells.

Il retourne une gamme qui contient des constantes ou exclusivement des formules, etc.

Un exemple de la façon dont le code serait utilisé est illustré ci-dessous:

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 

vous sélectionnez une plage puis exécuter cette macro et il retournera l'adresse de ces cellules qui répondent aux exigences.

Le premier x recherche les cellules contenant uniquement des nombres. Le deuxième x cherche cellules qui contient toutes les constantes

La gamme dans ce cas était la sélection, mais vous pouvez définir ce que vous voulez, par exemple gamme (« a1: b5 »), etc.

Je suis allé retour à la feuille de calcul et utilisé la méthode spéciale goto.

Apparemment, il utilise également la méthode range.special. J'ai utilisé l'option de macro d'enregistrement et c'est ce que j'ai obtenu.

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 fonction spéciale goto de la feuille de calcul utilise la méthode des cellules spéciales pour certaines de ses fonctions.

Il en utilise également d'autres aussi. Dans les 5 dernières lignes de codes, j'ai changé de feuille de calcul et je lui ai demandé d'aller à des objets.

Ça ne va pas vraiment chez eux. Il les sélectionne juste.

La feuille de travail CP contenait des objets et utilisait le code des 3 dernières lignes pour sélectionner tous les objets de la feuille de calcul.

Le meilleur moyen de voir le code derrière goto est d'enregistrer une macro, puis d'utiliser la fonction goto/special dans la feuille de calcul.

Lorsque vous avez terminé, arrêtez l'enregistrement et affichez la macro que vous avez enregistrée.

Je ne connais pas d'autres fonctionnalités à sélectionner par type de cellule, mais je suis juste un nouveau, donc il pourrait être là très facilement et ne pas être connu par moi.

+0

Merci, mais comme la partie en gras de la question ci-dessus indique, la solution doit être Excel seulement et intégré, pas VBA. J'ai des fonctions VBA qui déterminent ces types de contenu de cellule (Constant, Formula, Formula avec lien) très bien. Le message original explique pourquoi. – downwitch

0

Je ne pense pas que vous pouvez éviter VBA tout à fait, mais vous pouvez créer un simple UDF et l'utiliser dans Excel

Par exemple,

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

et

Function IsLink(Check_Cell As Range) 

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

= ESTFORMULE (A1) retournera TRUE s'il y a une formule dans A1 et FALSE sinon = IsLink (A1) retournera TRUE s'il y a une formule dans A1 contenant '!' sinon FAUX

Vous pouvez combiner ces derniers et créer une sortie de chaîne "formule", "Link", "Value"

+0

Merci, mais comme le message d'origine l'indique, vous ne pouvez pas appeler les fonctions VBA (que j'ai également écrites) pour le formatage conditionnel à partir d'un complément. – downwitch

+0

Vous n'avez pas besoin d'appeler une fonction. Forcer un recalcul Excel et la fonction UDF doit être mise à jour automatiquement. – osknows

+0

Comment cela vous aide-t-il? J'essaye de placer des formats conditionnels, pas de mettre des UDF dans des cellules. Vous ne pouvez pas incorporer une fonction définie par l'utilisateur dans un appel de formule de mise en forme conditionnelle si la fonction UDF réside dans un complément Excel. Je vous exhorte à l'essayer; il génère cette erreur: "Vous ne pouvez pas utiliser de référence à d'autres feuilles de calcul ou classeurs pour les critères de mise en forme conditionnelle." – downwitch

Questions connexes