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)) & "x" & 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 - 如果更深的选择案例不匹配标准,请再次避免输入代码