Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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将函数应用于范围内的每个单元格_Vba - Fatal编程技术网

VBA将函数应用于范围内的每个单元格

VBA将函数应用于范围内的每个单元格,vba,Vba,我需要在VBA中编写宏或函数或任何东西,在一系列单元格上应用带参数的函数(例如vlookup)。我认为它可以通过宏来完成,但在那里我不能使用vlookup的参数,所以我不知道怎么做。可能吗 例如: 我想要这个: B1和B1细胞中的vlookup(A1;G1:H50;2;0) B2单元中的vlookup(A2;G1:H50;2;0)等,例如B10 但我只想写一次公式,让其他单元格自动填充 非常感谢。如果我理解正确,这里有一种方法(您必须更改分隔符以匹配您的国家/地区设置,并调整公式的使用位置,我只

我需要在VBA中编写宏或函数或任何东西,在一系列单元格上应用带参数的函数(例如vlookup)。我认为它可以通过宏来完成,但在那里我不能使用vlookup的参数,所以我不知道怎么做。可能吗

例如:

我想要这个: B1和B1细胞中的vlookup(A1;G1:H50;2;0) B2单元中的vlookup(A2;G1:H50;2;0)等,例如B10

但我只想写一次公式,让其他单元格自动填充


非常感谢。

如果我理解正确,这里有一种方法(您必须更改分隔符以匹配您的国家/地区设置,并调整公式的使用位置,我只是将B1:B10作为示例):

这段代码将公式写入sheet1上的B1:B10范围,其效果与将公式放入B1,然后“拖动”到B10的效果相同。这是因为Excel具有内置功能,可以根据范围是否前面有$symbol自动递增公式引用

如果列引用前面有$,则在跨列拖动公式时,它不会递增。如果$位于行引用的前面,则它不会随着公式的下拉而递增

回顾我提出的公式,你可以看到A1会随着公式被拖拽到B2,B3,B4等等而增加。自动增加查找值,分别为单元格A2,A3,A4。查找范围根本没有改变,因为列和行引用前面都有$

如果您运行我给您的代码,您将看到您应该只编写一个公式,但通过内置的自动递增功能更改查找范围的预期结果

--------------------更多基于评论的编辑-------------------- 要执行您想要的操作,您根本不需要VBA(即使您最初请求的是VBA/宏解决方案)。您可以将公式放在单元格中,并将其向下拖动到您希望它向下移动的距离。请查看此链接,看看它是否有助于回答您的问题:


您可以像下面的示例一样使用Application.VLookup:

如果要调用它们,请创建另一个不带参数的子例程,例如,可以通过单击按钮调用该子例程

Sub DoStuff()
    On Error GoTo ErrorHandler
    Dim valueLookup as String
    Dim valueToChange as String
    Dim range as String
    Dim firstColumn as Integer
    Dim lastColumn as Integer

Label1:
    valueLookup = InputBox("Enter the column to lookup")
    valueToChange = InputBox("Enter the column to change")
    range = InputBox("Enter the range of the lookup")
    firstColumn = CInt(InputBox("Enter the first column number to lookup"))
    lastColumn = CInt(InputBox("Enter the last column number to lookup"))
    Call SetValues(valueToChange, valueLookup, range, firstColumn, lastColumn)
    Exit Sub
ErrorHandler:
    MsgBox("One value has an error in it.")
    Resume Label1:
End Sub

但在那里,我不能使用vlookup的参数,也许我错了,因为这是我在VBA中尝试写的第二件事,但我认为在宏中不能使用输入参数,所以它们也不能在宏中使用的函数中使用。例如,对范围应用2除法很容易按宏范围使用,因为不需要参数,但是如果我需要在宏中使用参数,我应该怎么做?是的,我认为你误解了一些概念。您完全可以使用VBA插入公式(宏过程中定义了参数)。宏本身通常不需要参数(但是子程序过程可能需要参数,它们只是在宏菜单中不可用)。所有这些都没关系,但我的问题是,我需要这样做,每次使用不同的参数(需要使用不同的数据),不固定的macro@lulish89你是说像这样?是的,我就是这个意思。我写了一些类似的东西,但我不知道如何在excel中调用这个宏,我仍然不知道它。你能告诉我吗?当我尝试将宏DOSTUF放入VBA时,带有设置值的行被涂成红色,我不知道为什么。尽管如此,当参数值在宏中硬编码时,情况不是这样吗?这是另一个宏,但我看到它们硬编码在这里,不像我要求在excel中设置它们。也许我错了,它以不同的方式工作,但我不知道如何测试它。这不是“InputBox”将这些参数输入宏的方式吗?但我的问题不是这个,而是每次都能使用不同的参数,而不是代码中固定的参数。我很抱歉,如果我的房间里没有干净的话question@lulish89你能举例说明这些论点吗?它们是用vba硬编码的吗,从工作表上的一个范围,等等。你必须提供更多的细节…好的,我试着用vlookup在一个例子中解释它。我需要像ModifiedLookup(A1,$G$1:$H$50,2,0)这样的东西,它在指定的范围(例如B1:B10)上使用上面指定的参数执行vlookup,A1除外(这将根据实际单元格而改变)。我在B1单元写下这个公式,它将在B1单元上执行vlookup(A1,$G$1:$H$50,2,0),在B2单元上执行vlookup(A2,$G$1:$H$50,2,0),在B3单元上执行vlookup(A3,$G$1:$H$50,2,0),等等。所以我需要一个公式,当我将它写到第一个单元时,它将执行10个vlookup。这可以理解吗?@lulish89你至少试过我贴的东西吗?它完全符合你的要求……对不起,这是误解。我问这个问题是因为我不知道使用带参数的宏的可能性。当你用这段代码回答我时,我认为这只是在单元格范围内应用函数的解决方案,但参数是用宏硬编码的,因为你只写了这一部分,没有告诉我如何从excel中给用户指定参数,我也不知道。这就是为什么我没有尝试它的原因,我正准备问你如何用参数编写整个宏来尝试它。
Sub SetValues(columnToChange As String, columnToLookup As String, range As String, startColumn As Integer, endColumn As Integer)
    For number = startColumn To endColumn Step 1
       valueLookup = columnToLookup + CStr(number)
       valueToChange = columnToChange + CStr(number)
       Sheets("yourSheetName").Range(valueToChange).value = Application.VLookup(valueLookup, range, 2, 0)
    Next number

End Sub
Sub DoStuff()
    On Error GoTo ErrorHandler
    Dim valueLookup as String
    Dim valueToChange as String
    Dim range as String
    Dim firstColumn as Integer
    Dim lastColumn as Integer

Label1:
    valueLookup = InputBox("Enter the column to lookup")
    valueToChange = InputBox("Enter the column to change")
    range = InputBox("Enter the range of the lookup")
    firstColumn = CInt(InputBox("Enter the first column number to lookup"))
    lastColumn = CInt(InputBox("Enter the last column number to lookup"))
    Call SetValues(valueToChange, valueLookup, range, firstColumn, lastColumn)
    Exit Sub
ErrorHandler:
    MsgBox("One value has an error in it.")
    Resume Label1:
End Sub