VBA案例选择多个条件

Posted

技术标签:

【中文标题】VBA案例选择多个条件【英文标题】:VBA Case Select Multiple Conditions 【发布时间】:2014-01-23 21:33:19 【问题描述】:

VBA 新手。我正在尝试建立一个Dimensions的值(从Excel电子表格中的两个不同的单元格中提取,其中一个可能大于另一个,我总是希望首先使用较小的数字)其中输出(一个将被连接的字符串来自其他函数的字符串)可能是以下之一:

4868(没有 x 分隔整数值) 48x60.5(用 x 分隔整数和实数) 36.5x60(x 分隔实数和整数) 24.75x72.125(x 分隔实数和整数)

变量类型在 VBA 中定义为 Single(不是 Double)。这是我的代码:

Function getDimDisplay(h As Single, w As Single) As String

Dim strResult As String
Dim iH As Integer
Dim iW As Integer
Dim strH As Variant
Dim strW As Variant

iH = CInt(h)
iW = CInt(w)

Select Case h
    Case (h >= w And iH = h And iW = w)
        strH = CStr(iH)
        strW = CStr(iW)
        strResult = strW & strH
    Case (h >= w And iH <> h And iW = w)
        strH = CStr(h)
        strW = CStr(iW)
        strResult = strW & "x" & strH
    Case (w >= h And iH = h And iW <> w)
        strH = CStr(iH)
        strW = CStr(w)
        strResult = strH & "x" & strW
    Case (w >= h And iH <> h And iW <> w)
        strH = CStr(h)
        strW = CStr(w)
        strResult = strH & "x" & strW
End Select

getDimDisplay = strResult

End Function

它会编译,但不会返回任何输出。什么给了?

【问题讨论】:

哎呀,刚刚意识到最后一个case语句是实数和实数。大脑打嗝.... 那么...你的问题解决了吗?如果是,请删除帖子或自己回答(请参阅屏幕底部的按钮)。 仍在修修补补.....它适用于大多数情况,但不是全部。 【参考方案1】:

您的变量“h”不是布尔值。但是,您在选择情况下调用它以匹配真或假的条件。

将“选择案例 h”更改为“选择案例为真”。其他一切都会好的。

Select Case True

Case (h >= w And iH = h And iW = w)
    strH = CStr(iH)
    strW = CStr(iW)
    strResult = strW & strH
Case (h >= w And iH <> h And iW = w)
    strH = CStr(h)
    strW = CStr(iW)
    strResult = strW & "x" & strH
Case (w >= h And iH = h And iW <> w)
    strH = CStr(iH)
    strW = CStr(w)
    strResult = strH & "x" & strW
Case (w >= h And iH <> h And iW <> w)
    strH = CStr(h)
    strW = CStr(w)
    strResult = strH & "x" & strW

End Select

【讨论】:

【参考方案2】:

Select Case 不能这样工作。它将呈现的项目 (h) 与为个别案例陈述计算的值进行比较。

你所有的 case 语句都计算为布尔值、真或假。无论h等于什么,都不是!对于这段代码,您需要一个 if then else if 结构。

【讨论】:

if/then 语法让我更接近目标。有关小数点后数字(特别是零)的处理,请参见上面的 cmets。【参考方案3】:

为了完整起见,最接近您正在寻找的结构的是这种类型的东西:

Select Case h
Case Is >= w And Is = iH
    If w = iW Then
    '   do stuff
    Else
    '   do other stuff
    End If
Case Is <= w And Is = iH
    If w <> iW Then
    '   do stuff
    End If
Case Is > -w And Is <> iH
    If w <> iW Then
    '   do stuff
    End If
End Select

【讨论】:

如上所述,“And”不能与 VBA 中的 Case 语句一起使用。 @variant 这不准确,经过一些测试后我发现“And”总是可以使用,除了右边的“Is”语句【参考方案4】:

在选择情况下,不能使用“and”运算符,而必须使用逗号“,”

Select Case h
Case Is >= w , Is = iH
    If w = iW Then
    '   do stuff
    Else
    '   do other stuff
    End If
Case Is <= w , Is = iH
    If w <> iW Then
    '   do stuff
    End If
Case Is > -w , Is <> iH
    If w <> iW Then
    '   do stuff
    End If
End Select

请看下面的例子更清楚

http://gadoth.com/excel-vba-series-post-9-select-case/

【讨论】:

这是错误的:选择案例中的逗号是 OR,而不是 AND。 这个答案是非常错误的。您可以在 Select Case 中使用“And”,而逗号不等同于“And”。就像您之后有一个带有相同代码的额外案例(它有点像“或”)。更多详情请查看excelmacromastery.com/vba-select-case。【参考方案5】:

试试这个:

Function getDimDisplay(h As Single, w As Single) As String
Dim iH%:    iH = CInt(h)
Dim iW%:    iW = CInt(w)

If h >= w And iH = h And iW = w Then
    getDimDisplay = CStr(iW) & CStr(iH)
Else
    If h >= w And iH <> h And iW = w Then
        getDimDisplay = CStr(iW) & "x" & CStr(h)
    Else
        If w >= h And iH = h And iW <> w Then
            getDimDisplay = CStr(iH) & "x" & CStr(w)
        Else
            If w >= h And iH <> h And iW <> w Then
                getDimDisplay = CStr(h) & "x" & CStr(w)
            End If
        End If
    End If
End If
End Function

【讨论】:

很抱歉花了这么长时间才回复这是否可行。我有大约六个铁杆在火中,这(虽然对我很重要)对老板来说并不重要,所以它滑到了优先级列表的底部。但是,鼓声,它适用于大多数情况。不幸的是,它不适用于其他人。具有讽刺意味的是,似乎没有押韵的原因。给我一个关于使用 % 定义变量的线索吗? 从我的电子表格中定义变量的地方,小数点后全为零,这似乎令人窒息。换句话说,48.50000 被准确地截断为 48.5;但是,48.00000 根本不会产生任何结果。 使用圆形函数来消除像 getDimDisplay = CStr(round(h,10)) &amp; "x" &amp; CStr(round(w,10)) 这样的零。 dim iH%dim iH as Integer 完全相同,只是缩短了版本。阅读更多here 我实际上在其他情况下使用了round,但是由于这里没有错误的余地,所以它不合适。我的问题与正确数量的比较选项有关。在我的原始示例中,我有四个不同的场景,而本来应该有八个。一旦我解决了这个问题,世界上一切都很好。 :)【参考方案6】:

修复了我看到的一些数字未正确处理的错误。我错过了一个比较场景 - 对于每个 h>=w 或 w>=h 情况,应该进行四个比较而不是三个。耶!谢谢各位!这是工作代码:

Function getDimDisplay(h As Single, w As Single) As String

Dim iH%:    iH = CInt(h)
Dim iW%:    iW = CInt(w)

If h >= w And iH = h And iW = w Then
    getDimDisplay = CStr(w) & CStr(h)
Else
    If h >= w And iH <> h And iW = w Then
        getDimDisplay = CStr(w) & "x" & CStr(iH)
    Else
        If h >= w And iH = h And iW <> w Then
            getDimDisplay = CStr(w) & "x" & CStr(iH)
        Else
            If h >= w And iH <> h And iW <> w Then
                getDimDisplay = CStr(w) & "x" & CStr(h)
            Else
                If w >= h And iH = h And iW = w Then
                    getDimDisplay = CStr(iH) & CStr(iW)
                Else
                    If w >= h And iH <> h And iW = w Then
                        getDimDisplay = CStr(h) & "x" & CStr(iW)
                    Else
                        If w >= h And iH = h And iW <> w Then
                            getDimDisplay = CStr(iH) & "x" & CStr(w)
                        Else
                            If w >= h And iH <> h And iW <> w Then
                                getDimDisplay = CStr(h) & "x" & CStr(w)
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End If
End If    
End Function

【讨论】:

以上是关于VBA案例选择多个条件的主要内容,如果未能解决你的问题,请参考以下文章

VBA for Excel - 如果更深的选择案例不匹配标准,请再次避免输入代码

选择具有多个“喜欢”条件的案例

Excel vba 多个条件查询应该怎么做,可以用find方法吗?

VBA - 具有多个条件的 SumIf

VBA/宏根据多个条件复制随机行

Excel VBA 在 Excel 2016 中按多个条件进行多行排序