Добрый вечер, в своей должности все мануальные и немануальные операции запрограммировал. Что - то сам, что-то с помощью форума. Процентов 20% только на этом форуме. Остальное сам. За что спасибо форуму. Без этих 20% на примерах и реальной помощи я бы не сделал свои 80% самостоятельно по аналогии. Вообщем, стало мне мало. Пошел я к другим... Нашел такую неоптимизированную ситуацию на листе. Понял, что мало во мне еще методов. И я не до конца понимаю, как их можно было бы сочетать, чтобы из варианта 1 в приложенном файле получить вариант2. В зависимости от количества участников изначально данные поля id 3 id 4 делятся на количество участников через запятую. Можно сделать текст по столбцам, потом посчитать счетом по значению количество участников... потом как-то профильтроваться... дальше мысль тухнет. Потому что мне не понятно, как тут цикл применить, за что зацепиться... Хотел бы посмотреть, как это может быть сделано. Если кому-то интересно, конечно...
Добрый вечер, в своей должности все мануальные и немануальные операции запрограммировал. Что - то сам, что-то с помощью форума. Процентов 20% только на этом форуме. Остальное сам. За что спасибо форуму. Без этих 20% на примерах и реальной помощи я бы не сделал свои 80% самостоятельно по аналогии. Вообщем, стало мне мало. Пошел я к другим... Нашел такую неоптимизированную ситуацию на листе. Понял, что мало во мне еще методов. И я не до конца понимаю, как их можно было бы сочетать, чтобы из варианта 1 в приложенном файле получить вариант2. В зависимости от количества участников изначально данные поля id 3 id 4 делятся на количество участников через запятую. Можно сделать текст по столбцам, потом посчитать счетом по значению количество участников... потом как-то профильтроваться... дальше мысль тухнет. Потому что мне не понятно, как тут цикл применить, за что зацепиться... Хотел бы посмотреть, как это может быть сделано. Если кому-то интересно, конечно...ant6729
Sub tt() Dim ar1 r0_ = 2 n_ = Range("A" & Rows.Count).End(xlUp).Row - r0_ + 1 c_ = Cells(1, Columns.Count).End(xlToLeft).Column c1_ = 3 '2 первых столбца не делим ar = Range("A" & r0_).Resize(n_, c_) For i = 1 To n_ If InStr(ar(i, 1), ",") Then ar(i, 1) = Split(ar(i, 1), ", ") 'в ar(i, 1) вставляем массив Split(ar(i, 1), ", ") k_ = k_ + UBound(ar(i, 1)) + 1 Else 'можно всё считать через "UBound(Split...", но InStr вроде быстрее, чем Split k_ = k_ + 1 End If Next i ReDim ar1(1 To k_, 1 To c_) 'цикл выше чтобы не делать много Редимов On Error Resume Next For i = 1 To n_ ub_ = UBound(ar(i, 1)) 'если ar(i, 1) не массив, то даст ошибку If Err Then x_ = x_ + 1 For j = 1 To c_ ar1(x_, j) = ar(i, j) Next j Else For s = 0 To ub_ x_ = x_ + 1 ar1(x_, 1) = ar(i, 1)(s) For j = 2 To c1_ ar1(x_, j) = ar(i, j) Next j For jj = c1_ + 1 To c_ ar1(x_, jj) = ar(i, jj) / (ub_ + 1) Next jj Next s End If Err.Clear Next i With Range("A2").Resize(k_, c_) Range("A2").Resize(1, c_).Copy .PasteSpecial (xlPasteFormats) Application.CutCopyMode = 0 .Value = ar1 End With End Sub
[/vba]
Как-то так получилось
[vba]
Код
Sub tt() Dim ar1 r0_ = 2 n_ = Range("A" & Rows.Count).End(xlUp).Row - r0_ + 1 c_ = Cells(1, Columns.Count).End(xlToLeft).Column c1_ = 3 '2 первых столбца не делим ar = Range("A" & r0_).Resize(n_, c_) For i = 1 To n_ If InStr(ar(i, 1), ",") Then ar(i, 1) = Split(ar(i, 1), ", ") 'в ar(i, 1) вставляем массив Split(ar(i, 1), ", ") k_ = k_ + UBound(ar(i, 1)) + 1 Else 'можно всё считать через "UBound(Split...", но InStr вроде быстрее, чем Split k_ = k_ + 1 End If Next i ReDim ar1(1 To k_, 1 To c_) 'цикл выше чтобы не делать много Редимов On Error Resume Next For i = 1 To n_ ub_ = UBound(ar(i, 1)) 'если ar(i, 1) не массив, то даст ошибку If Err Then x_ = x_ + 1 For j = 1 To c_ ar1(x_, j) = ar(i, j) Next j Else For s = 0 To ub_ x_ = x_ + 1 ar1(x_, 1) = ar(i, 1)(s) For j = 2 To c1_ ar1(x_, j) = ar(i, j) Next j For jj = c1_ + 1 To c_ ar1(x_, jj) = ar(i, jj) / (ub_ + 1) Next jj Next s End If Err.Clear Next i With Range("A2").Resize(k_, c_) Range("A2").Resize(1, c_).Copy .PasteSpecial (xlPasteFormats) Application.CutCopyMode = 0 .Value = ar1 End With End Sub