Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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
Excel 在VBA中使用嵌套公式_Excel_Vba - Fatal编程技术网

Excel 在VBA中使用嵌套公式

Excel 在VBA中使用嵌套公式,excel,vba,Excel,Vba,我正在研究一个需要在excel中使用嵌套公式的问题。例如: 我有一个错误专栏和一个分析专栏 Error Analysis Enter a valid material number Invalid Material 例如错误: 输入有效的物料编号;材料编号1234不适用 存在 订单号XYZ不存在。 VIN编号123不存在。 原产国AB不存在。 我在下一页中有一个关于这些错误的概要和它们的分析,我正在使用VLOOK

我正在研究一个需要在excel中使用嵌套公式的问题。例如:

我有一个错误专栏和一个分析专栏

       Error                            Analysis
Enter a valid material number       Invalid Material 
例如错误:

输入有效的物料编号;材料编号1234不适用 存在 订单号XYZ不存在。 VIN编号123不存在。 原产国AB不存在。 我在下一页中有一个关于这些错误的概要和它们的分析,我正在使用VLOOKUP和FIND来查找已知错误的分析

=VLOOKUP(LEFT(F2, FIND(" ", F2, FIND(" ", F2) + 1) - 1)&"*", 'Sheet2'!A:B, 2, 0)
我在这里要做的是从错误中提取前两个单词,并在它后面附加一个*并在VLOOKUP中使用它

在另一张表中,它类似于Vlookup PO编号*,并对其进行分析。星号是因为我每天都得不到相同的数字。我还知道,提取的错误的前两个单词是唯一的。我知道输入a作为前两个单词的错误不会再次出现

现在我在同一列中得到了错误,所以我想制作一个按钮并编写一个使用上述公式的代码

我试图在网上修改一些代码,但我没有成功。我对VBA一无所知。如果你能为这个提供一个片段,那就太好了。我将尝试复制此过程以满足其他需要

这段代码目前似乎正在运行


这应该行得通。当然,您不需要调试行

Sub PopulateAnalysis()

    Dim rngTableWithErrors As Range
    Dim rngTableWithAnalysis As Range

    Application.ScreenUpdating = False

    'set the range for Table with error, Table1 on sheet 1
    With Sheets(1) 'change to name of the sheet, more reliable than index num.
        Set rngTableWithErrors = .Range("F2:F" & .Cells(.Rows.Count, 6).End(xlUp).Row)
        Debug.Print rngTableWithErrors.Address
    End With

    'set the range for Table with Analysis, Table 2 on sheet 2
    With Sheets(2) 'change to name of the sheet, more reliable than index num.
        Set rngTableWithAnalysis = .Range("A1:B" & .Cells(.Rows.Count, 2).End(xlUp).Row)
        Debug.Print rngTableWithAnalysis.Address
    End With

    'formula for cell G2
    '=VLOOKUP(LEFT(F2;FIND(" ";F2;FIND(" ";F2)+1)- 1)&"*";Sheet2!A1:B23;2; 0)
    rngTableWithErrors.Offset(0, 1).FormulaR1C1 = _
    "=VLOOKUP(LEFT(R[0]C[-1],FIND("" "",R[0]C[-1],FIND("" "",R[0]C[-1])+1)-1)& ""*"",Sheet2!R1C1:R" & rngTableWithAnalysis.Rows.Count & "C2,2, 0)"

    Application.ScreenUpdating = True

    MsgBox "Done"

End Sub
笔记
您可以注意到,我们正在手动设置范围的左上角单元格。使用find方法查找左上角的单元格是我最喜欢的方法,并且从那里开始工作。您永远不知道用户将如何更改工作表,即添加新行、列等。

您不能只使用Vlookup吗?我不明白你提供的公式,你想提取什么?如果错误和分析记录是成对的,您可以使用vlookup,精确匹配。在问题中添加一些产生错误的数据。此外,请展示您生成的代码,并指出您觉得偏离了轨道的地方。注意:如果信息敏感,则可能是虚假数据再现问题。@BranislavKollár-当我在单元格中使用上述公式时,它可以完美地工作。公式提取了前两个单词,并附加了一个*和VLOOKUP在另一张表中查找它,其中保留了重复出现的错误及其分析。我提取前两个单词的原因是因为一个可变的组件,例如在错误文本中间出现的一个数字。例如,输入有效的物料编号;物料编号1234不存在。另一个示例是-VIN号23454无效。第一个单词是我能用的最多的常用文本,可以在另一个表格中查找。@BranislavKollár错误种类不多。因此,上述方法有效。现在,这张纸不是给我的,想要使用它的人可能不理解,或者不想每天打印。因此有必要。那么,请善待我,接受我的回答。谢谢你,很高兴能帮上忙。不过有点小麻烦;在测试时,我发现rngTableWithAnalysis.Rows.Count实际上没有考虑表中最近添加的行。它仍然接受第一次运行时获得的值。是否有办法解决此问题?如果添加的记录在B列中为空,则可能会出现这种情况。因为我们是通过查找此列中最后一个填充的单元格来确定此列中的最后一行。是这样吗?B栏有空白单元格吗?尤其是在范围的底部。不,不是这样的。没有空白单元格。但是,我注意到它没有计算标题。我删除了一些行。这比实际行数少了一行。我猜它不包括标题。如果删除了一些行,则需要修改手动设置范围,即我在注释中提到的左上角的单元格。这里可能有一个问题:…rngTableWithErrors=.RangeF2:F。。。更改2或此处…rngTableWithAnalysis=.RangeA1:B。。。更改1或此处…第2张!R1C1:R&rngTableWithAnalysis.Rows.Count&。。。更换R1。
Sub PopulateAnalysis()

    Dim rngTableWithErrors As Range
    Dim rngTableWithAnalysis As Range

    Application.ScreenUpdating = False

    'set the range for Table with error, Table1 on sheet 1
    With Sheets(1) 'change to name of the sheet, more reliable than index num.
        Set rngTableWithErrors = .Range("F2:F" & .Cells(.Rows.Count, 6).End(xlUp).Row)
        Debug.Print rngTableWithErrors.Address
    End With

    'set the range for Table with Analysis, Table 2 on sheet 2
    With Sheets(2) 'change to name of the sheet, more reliable than index num.
        Set rngTableWithAnalysis = .Range("A1:B" & .Cells(.Rows.Count, 2).End(xlUp).Row)
        Debug.Print rngTableWithAnalysis.Address
    End With

    'formula for cell G2
    '=VLOOKUP(LEFT(F2;FIND(" ";F2;FIND(" ";F2)+1)- 1)&"*";Sheet2!A1:B23;2; 0)
    rngTableWithErrors.Offset(0, 1).FormulaR1C1 = _
    "=VLOOKUP(LEFT(R[0]C[-1],FIND("" "",R[0]C[-1],FIND("" "",R[0]C[-1])+1)-1)& ""*"",Sheet2!R1C1:R" & rngTableWithAnalysis.Rows.Count & "C2,2, 0)"

    Application.ScreenUpdating = True

    MsgBox "Done"

End Sub