VBA Excel中带有单元格公式的Index(Match())

时间:2018-08-08 01:00:05

标签: excel vba excel-vba

第一次来。一般而言,这对于编码来说还是很新的。只是为了娱乐/尝试学习而这样做。提前感谢帮助。

我正在尝试让我的代码查看CSV单元格并将值拉出到数组中。然后,使用该数组,使用Index(Match())将最后一列中的日期获取到新数组中。然后,我将查看最新日期并将其写入CSV单元格旁边的单元格中。

enter image description here

这是我到目前为止所拥有的:

Dim DepArray As Variant, FinArray As Variant, x As Integer, i As Integer, y As Variant, StartDate As Date
    DepArray = Split(Target, ",")
    x = UBound(DepArray)
    'INDEX(MATCH()) to write to new array of finish dates for prior tasks
    For i = 0 To x
        y = Application.WorksheetFunction.Index(Sheets("SH1").Range("A1:E4").Value, Application.Match(DepArray(i), Sheets("SH1").Range("A1:A4").Value, 0), 5)
        FinArray(i) = y
    Next i
    StartDate = Application.WorksheetFunction.Max(FinArray)
    Target.Offset(0, 1).Value = StartDate

我在y = Index(Match())行上收到类型不匹配错误。我想我已经尝试了每种变量类型,将y分别声明为整数和日期。有什么想法吗?

仅供参考,我使用.Value标注是因为在A和E列中,商品编号和日期都是由单元格中的函数输入的。

此外,如果您有清理代码的提示或发现我还没有发现的其他错误,我想学习更好的做法。

谢谢!

更新了代码以帮助检查。我想我正确使用了Match(),因为现在错误显示在MsgBox y(i)行上。我也尝试过将其作为MsgBox y

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B1:B4")) Is Nothing Then
    Dim DepArray As Variant, FinArray As Variant, x As Integer, i As Integer, y As Variant, StartDate As Date
    DepArray = Split(Target, ",")
    MsgBox DepArray(0)
    x = UBound(DepArray)
    MsgBox x
    MsgBox DepArray(x)
    'INDEX(MATCH()) to write to new array of finish dates for prior tasks
    For i = 0 To x
        MsgBox DepArray(i)
        y = Application.Match(DepArray(i), Sheets("Sheet1").Range("A1:A4").Value, 0)
        MsgBox y(i)
        'FinArray(i) = Application.WorksheetFunction.Index(Sheets("Sheet1").Range("A1:E4").Value, Application.Match(DepArray(i), Sheets("Sheet1").Range("A1:A4").Value, 0), 5)

    Next i
    StartDate = Application.WorksheetFunction.Max(FinArray)
    Target.Offset(0, 1).Value = StartDate
End If


End Sub

1 个答案:

答案 0 :(得分:1)

此行将DepArray创建为字符串数组:

DepArray = Split(Target, ",")

因为Split返回一个字符串数组。

稍后,当您这样做时:

y = Application.Match(DepArray(i), Sheets("Sheet1").Range("A1:A4").Value, 0)

Match函数返回1004错误,因为该范围内没有"1"的值,而是1的值!

您可能可以通过强制转换为long / integer来解决:

Dim valueToMatch as Long
valueToMatch = CLng(DepArray(i))
y = Application.Match(valueToMatch, Sheets("Sheet1").Range("A1:A4").Value, 0)

捕获错误通常也是一个好主意,例如:

If IsError(y) Then
    MsgBox "Unable to find " & CStr(valueToMatch)
    ' Exit sub, or go to next iteration, etc.
End If

您还需要在此行之后ReDim FinArray

x = UBound(DepArray)
ReDim FinArray(x)

然后取消注释将值分配给该数组的行,否则它将保留为Empty变体,并且Max(Empty)每次都会返回0:D

此外,由于Application.EnableEvents = False将触发,因此您需要在过程开始时执行Application.EnableEvents = True,然后在过程结束时执行Target.Offset(0, 1).Value = StartDate,以避免可能的无限循环。 Change事件:)