1. Remove Application.ScreenUpdating = False
from inside the loop.
2. Avoid the use of .Text
. You may want to see What is the difference between .text, .value, and .value2?
3. Avoid use of .Activate, ActiveWorkbook, ActiveCell
etc. You may want to see How to avoid using Select in Excel VBA. Declare and work with objects directly.
4. Find the Last Row in the range and use a For
loop to traverse through the range. That would be much easier.
5. Since you are handling events, use proper error handling
Does this help? (Untested)
Option Explicit
Sub msg_click()
Dim ws As Worksheet
Dim prevStateScreenUpdating As Boolean
Dim lRow As Long
Dim i As Long
On Error GoTo Whoa
'~~> Store previous state
prevStateScreenUpdating = Application.ScreenUpdating
'~~> Change it to false
Application.ScreenUpdating = False
'~~> Set this to the relevant sheet
Set ws = Sheet1
With ws
'~~> Find last row in Col A
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
'~~> Loop through the range
For i = 3 To lRow
ThisWorkbook.FollowHyperlink Address:="https://wa.me/" & _
.Range("A" & i).Value2 & _
"?text=" & _
.Range("I" & i).Value2
'~~> Wait for 3 seconds. Change as applicable
Wait 3
SendKeys "~"
Next i
End With
LetContinue:
'~~> Reset user settings
Application.ScreenUpdating = prevStateScreenUpdating
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetContinue
End Sub
Private Sub Wait(ByVal nSec As Long)
nSec = nSec + Timer
While nSec > Timer
DoEvents
Wend
End Sub