Максимально допустимая длина строки VBA, которой можно манипулировать в таком случае, составляет 256.
Я подготовил функцию, способную разбить такую строку на части, меньшие или равные 256. Она вернет массив и базу для его элементов диапазон строится с использованием Union
, и содержимое будет очищено сразу. Пожалуйста, протестируйте следующий код:
Sub testClearContentxBySplitString256()
Dim x As String, arr As Variant, rng As Range, El As Variant
x = "F21, H23:H26, F31, H33:H36, F41, H43:H46, F51, H53:H56, F61, H63:H66, F71, H73:H76, F81, H83:H86, F91, H93:H96, F101, H103:H106, F111, H113:H116, F121, H123:H126, F131, H133:H136, F141, H143:H146, F151, H153:H156, F161, H163:H166, F171, H173:H176, F181, H183:H186, F191, H193:H196, F201, H203:H206, F211, H213:H216, F221, H223:H226, F231, H233:H236, F241, H243:H246, F251, H253:H256, F261, H263:H266, P21, R23:R26, P31, R33:R36, P41, R43:R46, P51, R53:R56, P61, R63:R66, P71, R73:R76, P81, R83:R86, P91, R93:R96, P101, R103:R106, P111, R113:R116, P121, R123:R126, P131, R133:R136, P141, R143:R146, P151, R153:R156, P161, R163:R166, P171, R173:R176, P181, R183:R186, P191, R193:R196, P201, R203:R206, P211, R213:R216, P221, R223:R226, P231, R233:R236, P241, R243:R246, P251, R253:R256, P261, R263:R266"
arr = split256(x)
If Not IsArray(arr) Then
Set rng = Range(arr)
Else
For Each El In arr
If rng Is Nothing Then
Set rng = Range(El)
Else
Set rng = Union(rng, Range(El))
End If
Next
End If
rng.Select 'only fir visual efect. You can comment/delete the line after seeing the selected non contiguous range...
rng.ClearContents
End Sub
и функцию, разделяющую строку:
Function split256(strSplit As String) As Variant
Dim arr As Variant, i As Long, strInterm As String
Dim strRest As String, k As Long, boolLast As Boolean
If Len(strSplit) <= 256 Then
split256 = strSplit: Exit Function
Else
ReDim arr(1 To WorksheetFunction.RoundUp(Len(strSplit) / 256 + 1, 0))
k = 1
Restart:
strInterm = left(IIf(strRest = "", strSplit, strRest), 256)
If Len(strInterm) < 256 Then boolLast = True
If boolLast Then
arr(k) = strInterm
ReDim Preserve arr(k): split256 = arr
Exit Function
Else
arr(k) = left(strInterm, InStrRev(strInterm, ",") - 1): k = k + 1
strRest = Right(IIf(strRest = "", strSplit, strRest), _
Len(IIf(strRest = "", strSplit, strRest)) - InStrRev(strInterm, ",") - 1)
GoTo Restart
End If
End If
End Function