Use Find object to manipulate all appearances of a text of a document

Using Find method of Select object is very effective way to change all appearance of a text in a document. For example you may want to capitalize all the first case after ” in the document. Below is pseudo code to demo it:

Sub convertToUppercases() 
   'Goto start of the document 
    Selection.HomeKey Unit:=wdStory 
    switchCases False 
End Sub 
Sub convertToLowercases() 
    'Goto start of the document 
     Selection.HomeKey Unit:=wdStory 
     switchCases True 
End Sub 

Sub switchCases(ByVal bToLowerCase As Boolean) 
    Dim sText As String 
    Dim lCount As Long 
    Selection.Find.ClearFormatting 'Clear current find  
    With Selection.Find  
        .Text = <put some text need to be found here>   
        .Replacement.Text = ""   
        .Forward = True   
        .Wrap = wdFindContinue   
        .Format = True   
        .MatchCase = False   
        .MatchWholeWord = False   
        .MatchAllWordForms = False   
        .MatchSoundsLike = False   
        .MatchWildcards = True   
    End With    
    Do    
        Selection.Find.Execute     
        If Selection.Find.Found Then     
            if bToLowerCase then     
                <put the code need to be done here>     
            else     
                <put the code need to be done here>     
            end if     
        end if     
    Loop Until Not Selection.Find.Found     
End Sub

Add links to cells with VBA

Sub addLinks()

‘ Converts each cell text of a selected range into a working hyperlink
For Each xCell In Selection
ActiveSheet.Hyperlinks.Add Anchor:=xCell, Address:=xCell.Formula
Next xCell

End Sub


Use Find method against Cells collection to detemine the last used Row, Column in Excel

Function lastUsedRow() As Long
On Error Resume Next
Dim lLastRow As Integer
lLastRow = Cells.Find(What:=”*”, after:=Range(“A1″), SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If lLastRow = 0 Then
lLastRow = 1
End If
lastUsedRow = lLastRow

End Function

Function lastUsedCol() As Long
On Error Resume Next
Dim lLastCol As Integer
lLastCol = Cells.Find(What:=”*”, after:=Range(“A1”), SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
If lLastCol = 0 Then
lLastCol = 1
End If
lastUsedCol = lLastCol

End Function


Prompt for a file name using VBA

Function prompt4FileName(Optional sFolder As String = vbNullString, Optional sDefaultName As String = "Untitled") As String
    Dim sMacScript As String
    Dim sFileName As String

    If sFolder = vbNullString Then 'Get user document folder
        sFolder = userDocumentFolder()
    End If
    If isMac Then
        sMacScript = "set sFile to (choose file name with prompt ""Name this file"" default name """ & _
        sDefaultName & vbLf & _
        """ default location the path to documents folder)" & vbLf & _
        "return sFile"
        sFileName = MacScript(sMacScript)
    Else
        sFileName = Application.GetSaveAsFilename(sDefaultName, "Excel Files,*.xls,Excel macro enable files,*.xlsm,All Files,*.*", , "Name this file", "Save as")    End If
    prompt4FileName = sFileName
End Function

Looking for a row using Find method against the Selection object

Function myFindRowPos(sText As Variant, oSheet As Worksheet, _
  Optional SearchDirection As XlSearchDirection = xlNext, _
  Optional SearchOrder As XlSearchOrder = xlByRows, _
  Optional sFindRange As String = "A1:A10000", _
  Optional LookAt As XlLookAt = xlWhole) As Long

  Dim lResult As Long, oRg As Range

  On Error GoTo errLabel
  oSheet.Activate
  oSheet.Range(sFindRange).Select

 Set oRg = Selection.Find(What:=sText, after:=ActiveCell, LookIn:=xlValues, LookAt:= _ LookAt, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ False)   If Not oRg Is Nothing Then
     lResult = oRg.Row
  Else
     lResult = -1 'not found
        End IferrExit:
    myFindRowPos = lResult
    Set oRg = Nothing
    Exit Function
errLabel:
    lResult = -1
    Resume errExit
End Function

Use an Open File dialog in VBA with both Mac and Windows

Function myGetOpenFileName(Optional sPath As String) As String
Dim sFile As String
Dim sMacScript As String

    If isMac Then
        If sPath = vbNullString Then
            sPath = "the path to documents folder"
        Else
            sPath = " alias """ & sPath & """"
        End If
        sMacScript = "set sFile to (choose file of type ({" & _
            """com.microsoft.Excel.xls"", ""org.openxmlformats.spreadsheetml.sheet""," & _
            """public.comma-separated-values-text"", ""public.text"", ""public.csv""," & _                   """org.openxmlformats.spreadsheetml.sheet.macroenabled""}) with prompt " & _
            """Select a file to import"" default location " & sPath & ") as string" _
            & vbLf & _
            "return sFile"
         Debug.Print sMacScript
        sFile = MacScript(sMacScript)

    Else 'windows

        sFile = Application.GetOpenFilename("CSV files,*.csv,Excel 2007 files,*.xlsx", 1, _
            "Select file to import from", "&Import", False)

    End If

    myGetOpenFileName = sFileEnd Function

Writing VBA for both Windows and Macintosh

Microsoft has brought VBA back for Mac world with its latest Office. But there are many differences between two version. To write macros that run smoothly on both systems you need to began with system recognition. Follow snip-set let you do it

Function isMac() As Boolean

   If Application.OperatingSystem Like "*Mac*" Then
      isMac = True
   Else
      isMac = False
   End If

End Function

Sub myMacro ()

   if isMac() then
      'code for Mac here
   else
      'code for Win here
   end ifEnd Sub