View Single Post
 
Old 12-12-2014, 06:55 PM
ptmuldoon ptmuldoon is offline Windows 7 64bit Office 2013
Advanced Beginner
 
Join Date: Sep 2014
Posts: 93
ptmuldoon is on a distinguished road
Default

And in continuing with the above, I have started in working to compare the 2 arrays and match. But again, I think my issue that I need the array of NamedRanges from Excel needs to be a 2 dimensional to someone pass the value of the cell vs its Name?

Currently, the arrays get matched and then returns the name of the bookmark/named range, when I trying to get the value of the namedranged.

The functions Array_UIntersect and IsInArray I did find elsewhere on the web, so can not take any credit for that work. Thanks to the those authors in helping me get this far.

Code:
Sub Test()
    Dim f, xlWorkBook  As Object
    Dim Bm, Nm, NmdValue, NmdRng, Bmk, MatchNames, Match As Variant
    Dim NewPath, MyText, ShtName, Test As String
    Dim i As Integer
    
    'Choose the Excel File
    Set f = Application.FileDialog(msoFileDialogFilePicker)
    f.Title = "Please Select A New File"
    f.AllowMultiSelect = False
    f.Filters.Clear
    f.Filters.Add "Microsoft Excel Files", "*.xls, *.xlsb, *.xlsm, *.xlsx" 'Limit to Excel Files Only

    If f.Show = -1 Then
        NewPath = f.SelectedItems(1)
        Set xlWorkBook = GetObject(f.SelectedItems(1))
    Else 'user clicked cancel
        Exit Sub
    End If

    'Create the Array of NamedRanges of Chosen File
    i = 1
    ReDim NmdRng(1 To 1)
    For Each Nm In xlWorkBook.Names
        Set NmdValue = xlWorkBook.Names(Nm.Name).RefersToRange
        ReDim Preserve NmdRng(i)
        NmdRng(i) = Nm.Name
        i = i + 1
    Next Nm
            
    'Create the Array of BookMarks
    i = 1
    ReDim Bmk(1 To 1)
    For Each Bm In ActiveDocument.Bookmarks
        ReDim Preserve Bmk(i)
        Bmk(i) = Bm.Name
        i = i + 1
    Next Bm
    
    'Create a New Array of Matched Values only
    MatchNames = Array_UIntersect(NmdRng, Bmk)
 
    ' Do Something with the Matches
    If UBound(MatchNames) > 0 Then
       For Each Match In MatchNames
            If Not IsEmpty(Match) Then
                MsgBox "Match was Found with: " & Match
                ActiveDocument.Bookmarks(Match).Range.InsertAfter Match
            End If
       Next Match
    End If
        
    ActiveDocument.Bookmarks.ShowHidden = True
    ActiveWindow.View.ShowBookmarks = False
    
End Sub

Function Array_UIntersect(array1 As Variant, array2 As Variant) As Variant
  Dim tempArray As Variant
  Dim i As Long
 
  ' start with a single element
  ReDim tempArray(0)
 
  ' if element in first array exists in second array, keep it
  For i = LBound(array1) To UBound(array1)
    If IsInArray(array2, array1(i)) Then  ' found!
      ReDim Preserve tempArray(UBound(tempArray) + 1)
      tempArray(UBound(tempArray)) = array1(i)
    End If
  Next i
 
  ' first element is Empty, so shift all elements one position up
  For i = LBound(tempArray) To UBound(tempArray) - 1
      tempArray(i) = tempArray(i + 1)
  Next i
  ' remove last element
  If UBound(tempArray) <> 0 Then
    ReDim Preserve tempArray(LBound(tempArray) To UBound(tempArray) - 1)
  End If
 
  Array_UIntersect = tempArray
End Function

Function IsInArray(arr As Variant, valueToCheck As Variant) As Boolean
   IsInArray = (UBound(Filter(arr, valueToCheck)) > -1)
End Function
Reply With Quote