Position dans Target Array using For Each (Excel VBA)

J'essaie de piéger les modifications qu'un user effectue sur une feuille.

J'ai ma configuration d'événement de la feuille de travail, mais le problème est de savoir si le Target.Range est plus grand qu'une seule cellule?

Fondamentalement, je dois évaluer chaque changement de cellule pour tester la validité à l'aide d'une fonction. Mon problème est le Target.Range peut être n'importe quelle taille, bien sûr, et la fonction de test de validité examine les cellules environnantes.

J'essayais de piéger les adresses des cellules changées en utilisant quelque chose comme ceci:

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 

De cette façon, je peux piéger l'adresse des cellules, puis utiliser aCell.Row ou aCell.Column, etc., mais cela échoue si le Target.Range est plus grand que 2 colonnes puisque l'indice i augmente plus rapidement qu'il ne le devrait.

Est-il possible de find la position de "aCell" dans la gamme Target car elle est boukeye par For Each? Ou est-ce qu'il vaut mieux faire confiance à cela. Chacun va toujours 1,1 1,2 1,3 2,1 2,2, etc.?

Des methods meilleures? Peut-être copyr simplement l'adresse de chaque aCell dans un tableau 1D qui est égal aux lignes * colonnes de la Target.Range de cette façon, les index i / j ne sont pas pertinents et ensuite traiter ce tableau 1D au lieu d'un tableau 2D?

Merci, BT

Vous findez plus d'informations sur ce que vous devez faire avec les arrays et la façon dont vous le faites. Mais quant à ce que vous avez publié … Quelque chose comme vous l'avez suggéré, en utilisant des arrays 1D, devrait faire l'affaire:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim DiffAddys() As Ssortingng, 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 

Ou vous pouvez mettre aCell.Address et aCell.Value2 dans une seule masortingce 2D.

Merci à tous pour les suggestions. Je viens d'aller de l'avant et j'ai pris mes propres conseils et suis allé avec le tableau 1D pour stocker les adresses des cellules changées.

 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