【问题标题】:VBA: Using Array FormulaVBA:使用数组公式
【发布时间】:2021-02-01 15:24:26
【问题描述】:

我想在 C 列和 E 列中根据两个条件查找行号。我的数据如下所示:

我已经用谷歌搜索了我的问题,并使用 Match 函数作为数组公式来解决这个问题(当我在 Excel 中使用它时,而不是 VBA),但我不知道如何使它成为一个数组公式VBA。不同的解决方案,无论是使用“[]”还是.Evaluate 都对我不起作用(也许这是我的错误)。那么我将如何修改这段代码以获得我想要的结果:

Sub Test1()
    Dim rowDB As Long
    Dim wsDB As Worksheet
    
    Set wsDB = ActiveSheet
    rowDB = WorksheetFunction.Match(CDate("30.06.2020") & "EX0500-0001", wsDB.Range("C7:C366") & wsDB.Range("E7:E366"))
End Sub

我得到的错误是“错误 13:类型不匹配”,所以我不确定这里是否还有其他问题,或者只是缺少数组公式。

【问题讨论】:

    标签: vba array-formulas


    【解决方案1】:

    我玩了一会儿,发现了几个问题:

    CDate() 似乎不喜欢“30.06.2020”作为输入,并得到一个类型错误。它似乎对“30-06-2020”很满意,所以也许改用该格式,或者只搜索字符串“30.06.2020”?这应该没问题,只要所有的日期格式都是一致的。

    WorksheetFunction.Match() 第二个参数必须是一个连续的范围,而你的不是。另外我认为wsDB.Range("C7:C366") & wsDB.Range("E7:E366") 的表达没有意义;如果要组合范围,请使用 Union() 函数。但这在这里不起作用,因为如上所述范围不是连续的。

    我认为不可能使用 WorksheetFunction.Match() 来搜索多个值,因此您可能需要分别搜索 C 列中的日期和 E 列中的字符串。

    这里有一些 vba,我只为搜索一个值而工作:

    Sub Test4()
        Dim rowDB As Long
        Dim wsDB As Worksheet
    
        Set wsDB = ActiveSheet
        rowDB = WorksheetFunction.Match("30.06.2020", wsDB.Range("C7:C366"))
        Debug.Print rowDB
    End Sub
    

    此外,如果未找到匹配项,则会收到“应用程序定义或对象定义错误”,因此您需要实施一些错误处理。

    【讨论】:

    • 感谢您的帮助。我不确定 VBA 功能,但在 Excel 中,您可以使用具有多个条件的 Match:在我的德语 Excel 版本中,=VERGLEICH(DATWERT("30.06.2020") & "EX0500-0001"; C7:C366 & E7:E366;0) 适用于我,这在英文版中应该是=MATCH(DATVALUE("30.06.2020") & "EX0500-0001", C7:C366 & E7:E366,0)至于通过columsn分开看:那是不是意味着两个For-Each-Loops?两列都有重复的值,例如EX0500-0001 不止一次约会,所以像.Find() 这样的东西不会有帮助,对吧?
    • 我又搞砸了,至于 CDate():由于 windows 的区域日期格式,我似乎收到了类型错误。当我将其更改为 D-M-Y 时,它工作正常。我无法让 excel 公式为我工作,我不知道为什么。至于 vba:使用 For 循环检查 C 列中的每个单元格以查看它是否与日期值匹配,如果找到该行的匹配项,则检查 E 列中的值是否与您的其他值匹配:如果它匹配那么你就完成了,如果不检查 C 列中的下一个单元格,等等......
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多