在目标数组中使用For Each(Excel VBA)
我试图捕捉用户在工作表上所做的更改。
我有我的worksheet_change事件设置,但问题是如果Target.Range大于单个单元格?
基本上,我需要评估每个单元格更改以使用函数来validation有效性。 我的问题是Target.Range当然可以是任何大小,并且testing有效性的函数会查看周围的单元格。
我试图使用这样的事情来捕获更改的单元格的地址:
i = 1 j = 1 For Each aCell In Target DiffAddys(i, j) = aCell.Address NewValues(i, j) = aCell.Value2 If i < Target.Rows.Count Then i = i + 1 If j < Target.Columns.Count Then j = j + 1 Next
这样,我可以捕获单元格的地址,然后使用aCell.Row或aCell.Column等,但如果Target.Range大于2列,则失败,因为i索引增长得比它应该更快。
无论如何find目标范围内的“aCell”的位置,因为它是由For Each循环的? 或者是最好的信任,对于每一个总是去1,1 1,2 1,3 2,1 2,2等?
任何更好的方法? 也许只是将每个aCell的地址复制到一个等于Target.Range的rows *列的1D数组中,这样i / j索引就无关紧要了 – 然后处理这个1D数组而不是2D数组?
谢谢,BT
更多的信息,你需要做什么与arrays和你如何做会有所帮助。 但至于你发布的内容…像你这样的build议,使用一维数组,应该做的伎俩:
Private Sub Worksheet_Change(ByVal Target As Range) Dim DiffAddys() As String, NewValues() As Variant Application.EnableEvents = False ReDim DiffAddys(Target.Cells.Count) ReDim NewValues(Target.Cells.Count) i = 1 'it is generaly not recommended to start array indexes on 1 For Each aCell In Target.Cells DiffAddys(i) = aCell.Address NewValues(i) = aCell.Value2 i = i + 1 Next aCell Application.EnableEvents = True End Sub
或者你可以把aCell.Address和aCell.Value2放到一个二维数组中。
感谢所有的build议。 我只是继续前进,并采取我自己的build议,并与1Darrays去存储更改单元格的地址。
If Range("aq" & Target.Row).Value <> "p" And Target.Cells.Count <= 1 Then Range("aq" & Target.Row).Value = 1 Application.EnableEvents = True Exit Sub End If Application.ScreenUpdating = False ReDim OldValues(1 To (Target.Rows.Count * Target.Columns.Count)) ReDim NewValues(1 To (Target.Rows.Count * Target.Columns.Count)) ReDim DiffAddys(1 To (Target.Rows.Count * Target.Columns.Count)) i = 1 For Each aCell In Target DiffAddys(i) = aCell.Address NewValues(i) = aCell.Value2 If i < (Target.Rows.Count * Target.Columns.Count) Then i = i + 1 Next Application.Undo 'turn back time For i = 1 To UBound(NewValues, 1) 'rows OldValues(i) = Sheet5.Range(DiffAddys(i)).Value Next i