繁体   English   中英

在Excel VBA中使用单元格值(文本)作为公式的一部分

[英]Use a cell value (text) as a part of a formula in Excel VBA

我在看似简单的Excel VBA中执行宏时遇到问题,但我找不到答案。

我想要根据具体单元格的值更改公式; 该单元格位于C7中,并且可以具有文本OR或文本AND。 公式的一部分是(作为CritEUs和CritSKUs String变量):

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

因此,我想根据C7中的值更改OR / AND,我尝试使用INDIRECT,但我认为它仅适用于数字以及以下内容(即Worksheet变量):

Dim Pattern As String

Pattern = W.Range("C7").Value

If CritEUs = "NO" " & Pattern & " CritSKUs = "NO" Then 

但是Excel不接受我这个选项。

难道这不可能吗?

我将非常感谢您的帮助!

我希望在另一个if语句中处理此问题,然后将下一个if语句嵌套在其中,如下所示:

Sub Example()

Dim Pattern As String

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

即使我非常喜欢 Gareth的解决方案,也可以通过使用Application.Evaluate()方法来完成所需的操作(即评估条件)。 这将是:

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

...其中字符串是表达式,例如=AND(whatever = "NO", whateverelse = "NO")=OR(whatever = "NO", whateverelse = "NO") (取决于变量的值无论系统语言是什么,都可以由MS Excel应用程序评估的Pattern )。

但是正如我所说,我个人更喜欢Gareth建议的嵌套if块,因为它可以使您更清楚地知道正在做什么,并且如果用户插入无效的逻辑运算符或仅犯了拼写错误,它就不会崩溃。 如果您不希望/无法稍微重新设计代码,则应考虑使用此选项。

配方说明-询问者需要

Evaluate()Application对象的一种方法,意味着MS Excel对象。 此方法非常简单:

input: string
output: evaluation of the string

实际上,它与在单元格中键入公式时完全一样,用于“评估”用户插入的字符串。 如果键入单元格“ = 3 + 4”,则基本上是键入Application.Evaluate("3+4") 这将返回7 ,因为它是您提供的字符串评估的结果。

这个内置的功能非常强大,因为它使用一个非常统一的系统(MS Excel的一个)来解析和评估Excel可以评估的任何字符串 此外,评估始终以英语进行(您可以使用英语功能IF但不能使用意大利语SE ,也不能使用德语WENN或法语SI因为该方法的评估就好像您的Excel是英语的独立于系统一样。

另一方面, Chr(34)只是返回字符""在VBA中很难使用该字符,因为通常需要将字符串分开(例如a = "first" & "second" 。但是,您需要此字符在要评估的字符串中,因此我只用Chr(34)调用它,以避免混淆编译器。

摘要:

字符串是这样建立的:

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

存在...

Pattern = AND or OR
Chr(34) = "

...我们正在构建的字符串将是这种类型(只是可能的结果):

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

因此,一旦我们构建了此字符串,就将其传递给Evaluate方法:就像我们将=AND("NO"="NO","YES"="NO")写入Excel单元格一样。 结果是什么? 显然,它取决于您的变量,但是在这种情况下,它将是FALSE ,因此将不会输入If - Then块,因为返回值为false。 否则,将被输入。

这不是一个“错误”的方法,但是正如我所说的那样,它只有两个可能的缺点:

1)它需要数据验证,因为如果将废话传递到变量PatternEvaluate方法将失败; 在Gareth的解决方案中,只会评估ANDOR ,否则代码将跳过->更加稳定;

2)这不是100%直观的:尽管Gareth的解决方案可以解释给一个10岁的孩子(因为这很容易理解),但是这一步(如我们刚刚所做的那样)需要更深入的分析以正确理解其功能。 IE:您需要一行代码来编写它,但是您/将来将要使用它的其他人将需要5至10分钟的时间和一杯咖啡来理解该语句要检查的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM