Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
#If Win64 Then
Private gTimerID As LongPtr, gTimerID2 As LongPtr
#Else
Private gTimerID As Long, gTimerID2 As Long
#End If
Private OrderAuto_OArgs(), OrderAuto_OIndex As Integer
Function S_OrderBranch(ByVal TargetBranch As Range, _
Optional ByVal TargetNames As Range, _
Optional ByVal Separator As String = ".", _
Optional ByVal Finally As Boolean = False) As Variant
On Error Resume Next
KillTimer 0&, gTimerID: gTimerID = 0
S_OrderBranch = ""
Dim K As Integer
K = UBound(OrderAuto_OArgs)
ReDim Preserve OrderAuto_OArgs(1 To K + 1)
OrderAuto_OArgs(K + 1) = VBA.Array(TargetBranch, TargetNames, Separator, Application.Caller, Finally)
gTimerID = SetTimer(0&, 0&, 1, AddressOf S_OrderBranch_callback)
End Function
Private Sub S_OrderBranch_callback()
On Error Resume Next
Call KillTimer(0&, gTimerID): gTimerID = 0
Call KillTimer(0&, gTimerID2): gTimerID2 = 0
On Error GoTo 0
Dim UA As Integer
UA = UBound(OrderAuto_OArgs)
If UA > 0 Then
OrderAuto_OIndex = OrderAuto_OIndex + 1
Dim Args As Variant, A As Variant, R As Long, C As Integer, total(), UB As Long, LR As Long
Args = OrderAuto_OArgs(OrderAuto_OIndex)
Dim R1 As Range, R2 As Range, A1 As Variant, A2 As Variant, tmp As String, K As Long
Set R1 = Args(0): Set R2 = Args(1): A1 = R1.value: A2 = R2.value
UB = R2.Rows.Count
ReDim total(1 To UB, 1 To 1)
LR = R2(Rows.Count - R2.Row, 1).End(3).Row - R2.Row + 1
If LR > UB Then LR = UB
If LR > 0 Then
tmp = A1(1, 1)
If tmp <> "" Then
For R = 2 To LR
If A1(R, 1) <> "" Then
K = 0
tmp = A1(R, 1)
Else
K = K + 1
total(R - 1, 1) = tmp & Args(2) & CStr(K)
If IsNumeric(total(R - 1, 1)) And Right(CStr(K), 1) = 0 Then
total(R - 1, 1) = "'" & total(R - 1, 1)
End If
End If
Next
Args(3)(2, 1).Resize(UB).value = total
End If
End If
If Args(4) Then Args(3).value = ""
If OrderAuto_OIndex >= UA Then
Erase OrderAuto_OArgs: OrderAuto_OIndex = 0
Else
gTimerID = SetTimer(0&, 0&, 1, AddressOf S_OrderBranch_callback2)
End If
End If
End Sub
Private Sub S_OrderBranch_callback2()
S_OrderBranch_callback
End Sub