VBA String compare in Mac

If you use equal comparison with strings, that contain all none ASCII characters in Mac Excel VBA 2011, then it will be always true if the strings have the same length:
Word1=word2 is always returns TRUE if len(word1)=len(word2)
To avoid this used strcomp(word1,word2,vbtextcompare) function stead!

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, _
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, _
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)
        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

 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
     lResult = -1 'not found
        End IferrExit:
    myFindRowPos = lResult
    Set oRg = Nothing
    Exit Function
    lResult = -1
    Resume errExit
End Function

Increase VBA performance

If your macro include code to make many change in sheets, document, jumping in/out of them then you need to consider to turn off screen update to turning performance of your code. Consider following snip-set example. Comment out the red line to see the effect

Sub myMacro ()

    On Error Goto errLabel
    Application.ScreenUpdating = False

    for i =1 to 1000 

        With Sheets("Sheets1")
        End With
        With Sheets("Sheets2")
        End With

    Application.ScreenUpdating = True
    Exit Sub

    MsgBox "System stop processing with error: " & Err.Description, vbOKOnly + vbCritical,"HotIce Soft"
    Resume exitLabel
    Resume Next
End Sub

Quickly goto a row in Excel with VBA

Sub scroll2aRow(Optional lRow As Long = 0)
    On Error Resume Next

    Application.Goto ActiveSheet.Range("A" & lRow), True

End Sub