第一次来。一般而言,这对于编码来说还是很新的。只是为了娱乐/尝试学习而这样做。提前感谢帮助。
我正在尝试让我的代码查看CSV单元格并将值拉出到数组中。然后,使用该数组,使用Index(Match())将最后一列中的日期获取到新数组中。然后,我将查看最新日期并将其写入CSV单元格旁边的单元格中。
这是我到目前为止所拥有的:
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
答案 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
事件:)