Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Sub PRDX_MsgDone(ByVal iTime!, Optional ByVal txHead$ = "DONE", Optional ByVal txMacro$, Optional ByVal iType As Byte = 64)
If iTime > 10000 Then iTime = Timer - iTime
If Len(txMacro) Then txMacro = " «" & txMacro & "»"
MsgBox txHead, iType, "TimeWork of Macro" & txMacro & " is: " & Format$(iTime, "0.0 sec")
End Sub
'==================================================================================================
'==================================================================================================
Sub PRDX_Param_App_SU–Calc_KeepAndOff(AC&, ASU As Boolean)
ASU = Application.ScreenUpdating: If ASU Then Application.ScreenUpdating = False
AC = Application.Calculation: If AC <> xlCalculationManual Then Application.Calculation = xlCalculationManual
End Sub
'--------------------------------------------------------------------------------------------------
Sub PRDX_Param_App_SU–Calc_Return(AC&, ASU As Boolean)
If Application.Calculation <> AC Then Application.Calculation = AC
If Application.ScreenUpdating <> ASU Then Application.ScreenUpdating = ASU
End Sub
'==================================================================================================
' принимает лист и строку адресов с этого листа, а заполняет массив макисмально (до 255 символов) "укрупнённых" адресов
Function PRDX_Split_AdrToArrRngs(sh As Worksheet, txAdr$) As Range()
Dim aRng_Res() As Range
Dim l&, n&, i&, p&, m&, s$
l = Len(txAdr): If l < 256 Then ReDim aRng_Res(1): Set aRng_Res(1) = sh.Range(txAdr): GoTo fin
m = l - 256: ReDim aRng_Res(l \ 100)
Do
i = InStrRev(txAdr, ",", p + 256)
n = n + 1: Set aRng_Res(n) = sh.Range(Mid$(txAdr, p + 1, i - p - 1))
p = i
If p > m Then
n = n + 1: Set aRng_Res(n) = sh.Range(Right$(txAdr, l - p))
ReDim Preserve aRng_Res(n): GoTo fin
End If
Loop
fin: PRDX_Split_AdrToArrRngs = aRng_Res
End Function
'==================================================================================================
'==================================================================================================
' Функция объединяет все диапазоны переданного массива в один диапазон, который и возвращает Range
Function PRDX_Rng_UnionArray(aRng() As Range) As Range
Dim u&, n&
Do
For u = 1 To UBound(aRng) Step 30
n = n + 1: Set aRng(n) = PRDX_Rng_UnionSmart(aRng, u)
Next u
ReDim Preserve aRng(n)
If n < 31 Then Set PRDX_Rng_UnionArray = PRDX_Rng_UnionSmart(aRng): Exit Function Else n = 0
Loop
End Function
'--------------------------------------------------------------------------------------------------
' Функция для "умного" объединения диапазонов из переданного массива с помощью Union
' Основной смысл — объединять ДО 30 диапазонов за раз (максимум для Union). Реже вызов Union = выше скорость
' Функция получает массив диапазонов и индекс элемента, с которого нужно начать объединения.
' Функция постарается максимально "забить" Union всеми 30ю аргументами-диапазонами, а, если их меньше, то всеми оставшимися
Function PRDX_Rng_UnionSmart(arrRng() As Range, Optional iStart& = 1) As Range
Dim n&
n = UBound(arrRng) - iStart + 1 ' количество элементов от стартового и до конца массива
If n > 29 Then Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24), arrRng(iStart + 25), arrRng(iStart + 26), arrRng(iStart + 27), arrRng(iStart + 28), arrRng(iStart + 29)): Exit Function
If n < 15 Then
If n < 8 Then
If n < 4 Then
If n < 3 Then
If n = 1 Then
Set PRDX_Rng_UnionSmart = arrRng(iStart): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1)): Exit Function
End If
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2)): Exit Function
End If
Else
If n < 6 Then
If n = 4 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4)): Exit Function
End If
Else
If n = 6 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6)): Exit Function
End If
End If
End If
Else
If n < 12 Then
If n < 10 Then
If n = 8 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8)): Exit Function
End If
Else
If n = 10 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10)): Exit Function
End If
End If
Else
If n < 14 Then
If n = 12 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12)): Exit Function
End If
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13)): Exit Function
End If
End If
End If
Else
If n < 23 Then
If n < 19 Then
If n < 17 Then
If n = 15 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15)): Exit Function
End If
Else
If n = 17 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17)): Exit Function
End If
End If
Else
If n < 21 Then
If n = 19 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19)): Exit Function
End If
Else
If n = 21 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21)): Exit Function
End If
End If
End If
Else
If n < 27 Then
If n < 25 Then
If n = 23 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23)): Exit Function
End If
Else
If n = 25 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24), arrRng(iStart + 25)): Exit Function
End If
End If
Else
If n < 29 Then
If n = 27 Then
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24), arrRng(iStart + 25), arrRng(iStart + 26)): Exit Function
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24), arrRng(iStart + 25), arrRng(iStart + 26), arrRng(iStart + 27)): Exit Function
End If
Else
Set PRDX_Rng_UnionSmart = Union(arrRng(iStart), arrRng(iStart + 1), arrRng(iStart + 2), arrRng(iStart + 3), arrRng(iStart + 4), arrRng(iStart + 5), arrRng(iStart + 6), arrRng(iStart + 7), arrRng(iStart + 8), arrRng(iStart + 9), arrRng(iStart + 10), arrRng(iStart + 11), arrRng(iStart + 12), arrRng(iStart + 13), arrRng(iStart + 14), arrRng(iStart + 15), arrRng(iStart + 16), arrRng(iStart + 17), arrRng(iStart + 18), arrRng(iStart + 19), arrRng(iStart + 20), arrRng(iStart + 21), arrRng(iStart + 22), arrRng(iStart + 23), arrRng(iStart + 24), arrRng(iStart + 25), arrRng(iStart + 26), arrRng(iStart + 27), arrRng(iStart + 28)): Exit Function
End If
End If
End If
End If
Stop: End
End Function
'==================================================================================================
'==================================================================================================
'==================================================================================================
|