Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-多次使用相同的if语句_Vba_Excel - Fatal编程技术网

VBA-多次使用相同的if语句

VBA-多次使用相同的if语句,vba,excel,Vba,Excel,我在多个for循环中使用了一个很长的If语句,我想知道是否有办法缩短代码 我知道在其他语言中,可以将if语句存储为函数,并反复调用它,即函数age(),然后调用它age(),但当我尝试在VBA中这样做时,它不起作用 有人有什么想法吗?我正在Excel中使用VBA 谢谢桑德拉 For Each var In pan8 If (pan2.Item(var) <= 15) And (pan3.Item(var) = "F") Then If (p

我在多个for循环中使用了一个很长的If语句,我想知道是否有办法缩短代码

我知道在其他语言中,可以将if语句存储为函数,并反复调用它,即函数age(),然后调用它age(),但当我尝试在VBA中这样做时,它不起作用

有人有什么想法吗?我正在Excel中使用VBA

谢谢桑德拉

For Each var In pan8

        If (pan2.Item(var) <= 15) And (pan3.Item(var) = "F") Then
                If (pan.Item(var) = 21) Then
                    R21F1 = R21F1 + 1
               ElseIf (pan.Item(var) = 22) Then
                    R22F1 = R22F1 + 1
               ElseIf (pan.Item(var) = 23) Then
                    R23F1 = R23F1 + 1
              ElseIf (pan.Item(var) = 24) Then
                    R24F1 = R24F1 + 1
              ElseIf (pan.Item(var) = 25) Then
                   R25F1 = R25F1 + 1
             ElseIf (pan.Item(var) = 26) Then
                   R26F1 = R26F1 + 1
            ElseIf (pan.Item(var) = 27) Then
                   R27F1 = R27F1 + 1
            ElseIf (pan.Item(var) = 28) Then
                   R28F1 = R28F1 + 1
            ElseIf (pan.Item(var) = 29) Then
                   R29F1 = R29F1 + 1
            ElseIf (pan.Item(var) = 31) Then
                    R31F1 = R31F1 + 1
               End If
第8栏中每个变量的


如果(pan2.Item(var),您肯定可以将代码存储在一个函数或另一个子函数中(变量称为
R22F1
R32F1
等,或者您可能指的是
范围(“R22F1”)
?)

请注意,我使用的是“Sub”而不是函数,因为(不管R22F1、R23F1等是什么)您希望自动执行操作而不是返回值。假设它们是代码变量:

Sub Main()
     MyLongProcedure MyParameter
End Sub

Sub MyLongProcedure(ByVal MyParameter As Integer)
     Select Case MyParameter
         Case 21:
             R21F1 = R21F1 + 1
         Case 22:
             R22F1 = R22F1 + 1 
     End Select
End Sub 
请注意,您可以根据需要多次调用“MyLongProcedure”,而无需复制和粘贴代码,只需编写
call MyLongProcedure()
并将要计算的参数传递给它即可执行相应的操作

此外
如果它们是这样命名的范围,看看您计算的数字和示例代码中的变量之间的关系,为什么不写一个
Range(“R”&pan&“F1”)=Range(“R”&pan&“F1”)类型的语句呢+1
无需使用if或select case进行检查?

如果我理解正确,您真正要问的是VBA中调用函数/过程的语法

要在VBA中调用一个过程,只需引用它的名称,不带括号;因此可以像这样调用/执行
Sub Foo()

Foo
如果
Foo
有参数,比如
Sub-Foo(ByVal bar As String)
,则只需在过程名称后添加参数(如果有多个参数,则用逗号分隔):

现在,假设您希望过程返回一个值,并且希望在调用站点使用该值,那么您应该使用一个函数:
function Foo(ByVal bar As String)作为布尔值

并用括号将其称为:

Dim result As Boolean
result = Foo("bar")
如果函数没有参数,则括号是可选的


调用
Sub
时使用括号是非法的语法。

为什么它在VBA中不起作用?你能告诉我们你在做什么吗?伙计。停下来。每当你开始给变量编号时,你都应该考虑循环。我估计你来自函数背景。不幸的是,VBA是一种过程语言,而不是函数语言。你知道吗不能做你想做的事,但还有其他选择。
选择case
和/或循环可能是你需要的,但这里没有足够的上下文来帮助你。什么是pan8和R?F?单元格或范围?你不能使用
设置
。循环可以达到@RubberDuck所述的目的。我的代码有效。它非常长,我正在尝试g来清理它,但它做了我希望它做的。在microsoft word中,它接近100页,但只需要一分钟就可以运行。好的,有一个专门用于此的网站,但我们需要您的,否则它将不在主题中。请在上发布您的代码以供审阅,我将帮助您清理。请注意,如果它被破坏,它将被关闭。请不要不要使用
Call
-只需调用这个过程。
Call
只是VB的一个古老版本的遗物。R22F1是一个变量,稍后我将这些变量放入单元格,然后在下一个循环之前将其重置为零。本质上,for循环是计算符合参数的人数。因此,第一个是15岁以下的女性,她ves在区域21。@retailcoder肯定是对的,我已经有一段时间不再在vb中编码了。从我的示例中删除Call关键字,我将从我的post@Matteo删除
呼叫时
您留下括号破坏了您的代码!为您修复了它..谢谢@chris,抱歉,但没有时间尝试代码和最后一次我给一个宏写了一个调用,叫做调用宏(par)。很抱歉,谢谢你的编辑…今天我学到了一个新东西
Dim result As Boolean
result = Foo("bar")