Нужно цифры, которые есть в столбце и считаются путем сжатия исправить в функции следующее 1) соединять в тире только если три и более, в количестве двух и одного не соединять через тире пример 1, 2, 4-7, 11, 12, 22-45 2) убрать в конце лишние пробелы и запятые
Код
Function Sgatie(диапазон As Range) As String
Dim i&, j&, a()
a = диапазон.Value
j = 1: Sgatie = a(1, 1)
For i = 2 To UBound(a, 1)
If a(i, 1) = a(i - 1, 1) + 1 Then
j = j + 1
ElseIf j = 1 Then
Sgatie = Sgatie & ", " & a(i, 1)
Else
j = 1
Sgatie = Sgatie & "-" & a(i - 1, 1) & ", " & a(i, 1)
End If
Next
If j > 1 Then Sgatie = Sgatie & "-" & a(i - 1, 1)
End Function
CrazyRabbit написал: Function Sgatie(диапазон As Range) As String
не полностью решилось
2-3, 5, 8, 10, 12-14, 16, 22, 25-26,
в таких случаях запятая в конце еще висит, если в конце через тире соединено 2, 3, 5, 8, 10, 12-14, 16, 22, 25, 26 здесь будет правильным, это как сделать
Function Sgatie(диапазон As Range) As String
Dim a(), b()
Dim i&, ii&, j&, jj&, x&, y&
'--------------------------------
a = диапазон.Value
For i = 1 To UBound(a)
If a(i, 1) <> "" Then
x = a(i, 1)
y = 0: jj = 0
For ii = i + 1 To UBound(a)
jj = jj + 1
If a(ii, 1) - x = jj Then
y = a(ii, 1)
Else: Exit For
End If
Next
j = j + 1
ReDim Preserve b(1 To j)
If y - x > 1 Then
b(j) = x & "-" & y
i = ii - 1
Else: b(j) = x
End If
End If
Next
Sgatie = Join(b, ", ")
End Function
Function Sgatie(диапазон As Range) As String
Dim i&, j&, a()
a = диапазон.Value
Dim tArr
ReDim tArr(1 To UBound(a, 1), 1 To 3)
For i = 1 To UBound(a, 1)
tArr(i, 1) = a(i, 1)
tArr(i, 2) = a(i, 1)
Next
Output = ""
For i = 1 To UBound(a, 1)
tArr(i, 1) = a(i, 1)
tArr(i, 2) = a(i, 1)
For y = i + 1 To UBound(tArr, 1)
If tArr(i, 2) + 1 = tArr(y, 1) Then
tArr(i, 2) = tArr(y, 1)
tArr(y, 1) = 0
Else
i = y - 1: Exit For
End If
Next y
Next i
For i = 1 To UBound(tArr, 1)
If tArr(i, 1) <> 0 Then
If tArr(i, 1) = tArr(i, 2) Then
Output = Output & tArr(i, 1) & ","
ElseIf tArr(i, 1) = tArr(i, 2) - 1 Then
Output = Output & tArr(i, 1) & "," & tArr(i, 2) & ","
ElseIf tArr(i, 1) < tArr(i, 2) - 1 Then
Output = Output & tArr(i, 1) & "-" & tArr(i, 2) & ","
Else
MsgBox ("Ошибка в формуле")
End If
End If
Next i
If Right(Output, 1) = "," Then
Output = Mid(Output, 1, Len(Output) - 1)
End If
Sgatie = Output
End Function
Zoynels написал: Function Sgatie(диапазон As Range) As String
Вот молодец, решил идеально! Спасибо огромное чуть чуть исправил чтобы выходило с пробелами, так
1-4, 6-11, 13
Код
Function Sgatie(äèàïàçîí As Range) As String
Dim i&, j&, a()
a = äèàïàçîí.Value
Dim tArr
ReDim tArr(1 To UBound(a, 1), 1 To 3)
For i = 1 To UBound(a, 1)
tArr(i, 1) = a(i, 1)
tArr(i, 2) = a(i, 1)
Next
Output = ""
For i = 1 To UBound(a, 1)
tArr(i, 1) = a(i, 1)
tArr(i, 2) = a(i, 1)
For y = i + 1 To UBound(tArr, 1)
If tArr(i, 2) + 1 = tArr(y, 1) Then
tArr(i, 2) = tArr(y, 1)
tArr(y, 1) = 0
Else
i = y - 1: Exit For
End If
Next y
Next i
For i = 1 To UBound(tArr, 1)
If tArr(i, 1) <> 0 Then
If tArr(i, 1) = tArr(i, 2) Then
Output = Output & tArr(i, 1) & ", "
ElseIf tArr(i, 1) = tArr(i, 2) - 1 Then
Output = Output & tArr(i, 1) & ", " & tArr(i, 2) & ", "
ElseIf tArr(i, 1) < tArr(i, 2) - 1 Then
Output = Output & tArr(i, 1) & "-" & tArr(i, 2) & ", "
Else
MsgBox ("Îøèáêà â ôîðìóëå")
End If
End If
Next i
If Right(Output, 1) = " " Then
Output = Mid(Output, 1, Len(Output) - 1)
End If
If Right(Output, 1) = "," Then
Output = Mid(Output, 1, Len(Output) - 1)
End If
Sgatie = Output
End Function
If Right(Output, 1) = " " Then
Output = Mid(Output, 1, Len(Output) - 1)
End If
If Right(Output, 1) = "," Then
Output = Mid(Output, 1, Len(Output) - 1)
End If