• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 164
  • Last Modified:

Sweep a defined area replacing certain values with data contained within an array


What I am trying to do is define a two dimension array,

dim mydata (1 to 5, 1 to 2) as string


Then, when a certain defined range within the sheet is changed, it does a check to see if any of the cells equal mydata(1,-) contain [version] and if they do it replaces them with mydata(,2)

So in this if I type into C3 "[update]" it will become v1.4.3 straight away.

This is my current code, which did work until I tried adding arrays in...

Private Sub Worksheet_Change(ByVal Target As Range)
Dim mydata(1 To 5, 1 To 2) As String
mydata(1, 1) = "[version]"
mydata(1, 2) = "v1.4.3"
    For lp = 1 To 40
        For lp2 = 1 To 40
            For lp3 = 1 To 5
                If Sheets("Sheet1").Cells(lp, lp2) = mydata(lp3, 1) Then
                    Sheets("Sheet1").Cells(lp, lp2) = mydata(lp3, 2)
                End If
End Sub

As you can see I am using a for loop to check 40 x 40 cells, other than fixing the above so it works please :)  Is there a better way to scan 40x40 cells and change values based on criteria from array?

1 Solution
Assuming that the users are changing the values of the cells (rather than formulas), you should restrict the operation of the macro to those cells that are changed within the 40 x 40 cell grid of interest. Having done that, you can use VLOOKUP to return the new value.

Note that you need to fully populate the mydata array within the sub.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range, targ As Range
Dim mydata As Variant, v As Variant
Set targ = Range("A1:AN40")     'Watch these cells for user-initiated changes
Set targ = Intersect(targ, Target)
If targ Is Nothing Then Exit Sub

    'Add additional Array blocks within the outer array for other rows in mydata array
mydata = Array(Array("[version]", "v1.4.3"), Array("[version1]", "v1.4.3a"))
For Each cel In targ.Cells
    Set v = Nothing
    v = Application.VLookup(cel.Value, mydata, 2, False)
    If Not IsError(v) Then
        Application.EnableEvents = False
        cel.Value = v
        Application.EnableEvents = True
    End If
End Sub

Open in new window

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now