Utilisez une valeur de cellule (text) dans le cadre d'une formule dans Excel VBA

J'ai un problème en faisant une macro dans Excel VBA qui semble simple mais je n'ai pas pu find une réponse.

Ce que je veux, c'est de changer une formule en fonction de la valeur d'une cellule en béton; la cellule est située dans C7 et peut avoir le text OU ou le text ET. La partie de la formule est (étant les variables CritEUs et CritSKUs Ssortingng):

If CritEUs = "NO" (OR/AND) CritSKUs = "NO" Then .... (whatever) 

Donc, je souhaite modifier l'OR / ET en fonction de la valeur de C7, j'ai essayé d'utiliser INDIRECT mais je pense que cela fonctionne uniquement avec des nombres, et aussi ce qui suit (étant W la variable de feuille de calcul):

 Dim Pattern As Ssortingng Pattern = W.Range("C7").Value If CritEUs = "NO" " & Pattern & " CritSKUs = "NO" Then 

Mais l'Excel ne m'accepte pas cette option.

Est-ce que ce n'est pas possible?

J'apprécierais vraiment toute aide!

Je chercherais à gérer cela dans une autre déclaration if, puis je nierais la prochaine instruction if like like:

 Sub Example() Dim Pattern As Ssortingng Pattern = W.Range("C7").Value If Pattern = "AND" Then If CritEUs = "NO" And CritSKUs = "NO" Then 'Do Something' End If ElseIf Pattern = "OR" Then If CritEUs = "NO" Or CritSKUs = "NO" Then 'Do Something' End If End If End Sub 

Même si je préfère fortement la solution de Gareth, il y a une astuce pour faire ce que vous voulez (c.-à-d. Pour évaluer l'état) grâce à l'utilisation de la méthode Application.Evaluate() . Ce serait:

 If Application.Evaluate(Pattern & "(" & Chr(34) & CritEUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & "," & Chr(34) & CritSKUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & ")") Then 

… où la string est une expression telle que =AND(whatever = "NO", whateverelse = "NO") ou =OR(whatever = "NO", whateverelse = "NO") (selon la valeur de la variable Pattern ) qui peut être évalué par l'application MS Excel quelle que soit la langue du système.

Mais comme je l'ai dit, je préférerais personnellement un bloc if nested, comme l'a suggéré Gareth, car il est plus clair ce que vous faites et qu'il ne peut pas se bloquer si l'user insère un opérateur logique non valide ou ne fait qu'une erreur d'orthographe; vous devriez considérer cette option si vous ne voulez pas / ne pas remanier légèrement votre code.

FORMULA EXPLICATION – requirejse du requestur

The Evaluate() est une méthode de l'object Application , ce qui signifie de l'object MS Excel . Cette méthode est très simple:

 input: ssortingng output: evaluation of the ssortingng 

Il est en fait utilisé pour "évaluer" une string insérée par l'user exactement comme il le fait lorsque vous tapez une formule dans une cellule . Si vous tapez dans une cellule "= 3 + 4", vous tapez typiquement Application.Evaluate("3+4") . Cela vous rendra 7 , car c'est le résultat de l'évaluation de string que vous avez fournie.

Ce système embedded est très très puissant, car il utilise un système très consolidé (celui de MS Excel) pour parsingr et évaluer toute string que Excel peut évaluer . En outre, l'évaluation est toujours en anglais (vous pouvez utiliser la fonction anglaise IF mais pas le SE italien, ni le WENN allemand ou le SI français car la méthode évalue comme si votre Excel était en anglais pour être indépendant du système.

D'autre part, le Chr(34) returnne simplement le personnage " . Ce caractère est difficile à utiliser dans VBA car il est généralement nécessaire de séparer les strings (p. Ex. A = "first" & "second" . Cependant, vous avez besoin de ce personnage à l'intérieur de la string à évaluer, alors je l'appelle avec Chr(34) pour éviter la confusion du compilateur.

RÉSUMÉ:

La string est en cours de construction comme ceci:

 Pattern & "(" & Chr(34) & CritEUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & "," & Chr(34) & CritSKUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & ")" 

Étant…

 Pattern = AND or OR Chr(34) = " 

… la string que nous construisons sera de ce genre (juste un résultat possible):

 "AND("NO"="NO","YES"="NO")" 

Ainsi, une fois que nous avons construit cette string, nous la passons dans la méthode Evaluate : c'est comme si on écrivait =AND("NO"="NO","YES"="NO") dans une cellule Excel. Quel serait le résultat? De toute évidence, cela dépend de votre variable, mais dans ce cas, il serait FALSE , donc le bloc If - Then ne sera pas entré car la valeur de return est fausse. Sinon, il serait entré.

Ce n'est pas une méthode «fausse», mais comme je disais qu'il n'y a que deux inconvénients possibles:

1) Il a besoin de validation des données, car si vous passez de la merde dans la variable, la méthode Evaluate échouera; Dans la solution de Gareth, à la place, seul AND et OR seront évalués, sinon le code va sauter -> plus de stabilité;

2) Ce n'est pas intuitif à 100%: alors que la solution de Gareth pourrait être expliquée à un enfant de 10 ans (parce qu'il est très très simple de comprendre), il faut (comme nous venons de le faire) une parsing plus approfondie pour comprendre correctement ce qu'il fait . IE: vous avez besoin d'une ligne de code pour l'écrire, mais vous / quelqu'un d'autre qui devra travailler à l'avenir aura besoin de 5 à 10 minutes et une tasse de café pour comprendre ce que la déclaration veut vérifier.