Приветствую. Таблица с числами проверяется на все повторы комбинаций построчно функцией =СЧЁТЕСЛИМН. Необходимо получить таблицу с комбинациями и количеством повторов(таблица справа в примере). С помощью чего можно это сделать? До этого с excelем не работал.
Приветствую. Таблица с числами проверяется на все повторы комбинаций построчно функцией =СЧЁТЕСЛИМН. Необходимо получить таблицу с комбинациями и количеством повторов(таблица справа в примере). С помощью чего можно это сделать? До этого с excelем не работал.YOUGIN
Скорее всего, с помощью макроса. Это такая программа на языке программирования VBA, встроенном в Excel. Формулами тут, если что-то и получится, будет очень громоздко.
Скорее всего, с помощью макроса. Это такая программа на языке программирования VBA, встроенном в Excel. Формулами тут, если что-то и получится, будет очень громоздко.
Спасибо за информацию.С этого начну.Вообще основной массив более 5000 строк, и сами комбинации неизвестны То есть необходимо узнать самые встречающиеся комбинации state1[2.3.4].В этом и сложность.
Спасибо за информацию.С этого начну.Вообще основной массив более 5000 строк, и сами комбинации неизвестны То есть необходимо узнать самые встречающиеся комбинации state1[2.3.4].В этом и сложность.YOUGIN
Накидал свой макрос, не особо оптимизируясь - пусть будет в качестве первого приближения. В колонках W:AA повторяет картину, приведенную в колонках P:T [vba]
Код
Sub io() Dim rngSource As Range Dim rngTarget As Range Dim cell As Range Dim i As Long Dim ncnt As Long
'A&B For Each cell In Range("G2:G15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(2) = rngSource.Cells(cell.row, 2) rngTarget.Cells(5) = cell.Value End If Next
'A&C For Each cell In Range("I2:I15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(3) = rngSource.Cells(cell.row, 3) rngTarget.Cells(5) = cell.Value End If Next
'A&D For Each cell In Range("K2:K15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(4) = rngSource.Cells(cell.row, 4) rngTarget.Cells(5) = cell.Value End If Next
'A&D&B For Each cell In Range("M2:M15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(2) = rngSource.Cells(cell.row, 2) rngTarget.Cells(4) = rngSource.Cells(cell.row, 4) rngTarget.Cells(5) = cell.Value End If Next
'переопределяем диапазон в соответствии со всеми выведенными строками Set rngTarget = rngTarget.Offset(-rngTarget.row + 1).Resize(rngTarget.row)
'чистка повторов - если выше есть точно такая же строка, текущая вычищается '(с использованием функции СЧЁТЕСЛИМН, вычисляющей кол-во выше текущей строки) For i = 3 To rngTarget.Rows.Count ncnt = WorksheetFunction.CountIfs( _ Range(rngTarget.Cells(1, 1), rngTarget.Cells(i - 1, 1)), "=" & rngTarget.Cells(i, 1), _ Range(rngTarget.Cells(1, 2), rngTarget.Cells(i - 1, 2)), "=" & rngTarget.Cells(i, 2), _ Range(rngTarget.Cells(1, 3), rngTarget.Cells(i - 1, 3)), "=" & rngTarget.Cells(i, 3), _ Range(rngTarget.Cells(1, 4), rngTarget.Cells(i - 1, 4)), "=" & rngTarget.Cells(i, 4)) If ncnt > 0 Then rngTarget.Rows(i).ClearContents Next i
'удаление пустых строк (ранее очищенных) - движемся снизу вверх For i = rngTarget.Rows.Count To 3 Step -1 If IsEmpty(rngTarget.Cells(i, 5)) Then rngTarget.Rows(i).Delete Shift:=xlUp End If Next i
End Sub
[/vba]
Накидал свой макрос, не особо оптимизируясь - пусть будет в качестве первого приближения. В колонках W:AA повторяет картину, приведенную в колонках P:T [vba]
Код
Sub io() Dim rngSource As Range Dim rngTarget As Range Dim cell As Range Dim i As Long Dim ncnt As Long
'A&B For Each cell In Range("G2:G15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(2) = rngSource.Cells(cell.row, 2) rngTarget.Cells(5) = cell.Value End If Next
'A&C For Each cell In Range("I2:I15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(3) = rngSource.Cells(cell.row, 3) rngTarget.Cells(5) = cell.Value End If Next
'A&D For Each cell In Range("K2:K15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(4) = rngSource.Cells(cell.row, 4) rngTarget.Cells(5) = cell.Value End If Next
'A&D&B For Each cell In Range("M2:M15") If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) rngTarget.Cells(1) = rngSource.Cells(cell.row, 1) rngTarget.Cells(2) = rngSource.Cells(cell.row, 2) rngTarget.Cells(4) = rngSource.Cells(cell.row, 4) rngTarget.Cells(5) = cell.Value End If Next
'переопределяем диапазон в соответствии со всеми выведенными строками Set rngTarget = rngTarget.Offset(-rngTarget.row + 1).Resize(rngTarget.row)
'чистка повторов - если выше есть точно такая же строка, текущая вычищается '(с использованием функции СЧЁТЕСЛИМН, вычисляющей кол-во выше текущей строки) For i = 3 To rngTarget.Rows.Count ncnt = WorksheetFunction.CountIfs( _ Range(rngTarget.Cells(1, 1), rngTarget.Cells(i - 1, 1)), "=" & rngTarget.Cells(i, 1), _ Range(rngTarget.Cells(1, 2), rngTarget.Cells(i - 1, 2)), "=" & rngTarget.Cells(i, 2), _ Range(rngTarget.Cells(1, 3), rngTarget.Cells(i - 1, 3)), "=" & rngTarget.Cells(i, 3), _ Range(rngTarget.Cells(1, 4), rngTarget.Cells(i - 1, 4)), "=" & rngTarget.Cells(i, 4)) If ncnt > 0 Then rngTarget.Rows(i).ClearContents Next i
'удаление пустых строк (ранее очищенных) - движемся снизу вверх For i = rngTarget.Rows.Count To 3 Step -1 If IsEmpty(rngTarget.Cells(i, 5)) Then rngTarget.Rows(i).Delete Shift:=xlUp End If Next i
Немного оптимизировался - вынес 4 раза повторяющуюся конструкцию чтения комбинаций в отдельную подпрограмму: [vba]
Код
Option Explicit
Dim rngSource As Range Dim rngTarget As Range
'подпрограмма обработки комбинаций типа A&B, A&C и т.д. Sub doCombi(strRangeAddr, arrCols)
Dim cell As Range Dim col As Variant 'Long
For Each cell In Range(strRangeAddr) If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) For Each col In arrCols rngTarget.Cells(col) = rngSource.Cells(cell.row, col) Next col rngTarget.Cells(5) = cell.Value End If Next
End Sub
'ГЛАВНАЯ ПРОГРАММА, которую надо запускать Sub io_v2()
'переопределяем диапазон в соответствии со всеми выведенными строками Set rngTarget = rngTarget.Offset(-rngTarget.row + 1).Resize(rngTarget.row)
'чистка повторов - если выше есть точно такая же строка, текущая вычищается '(с использованием функции СЧЁТЕСЛИМН, вычисляющей кол-во выше текущей строки) For i = 3 To rngTarget.Rows.Count ncnt = WorksheetFunction.CountIfs( _ Range(rngTarget.Cells(1, 1), rngTarget.Cells(i - 1, 1)), "=" & rngTarget.Cells(i, 1), _ Range(rngTarget.Cells(1, 2), rngTarget.Cells(i - 1, 2)), "=" & rngTarget.Cells(i, 2), _ Range(rngTarget.Cells(1, 3), rngTarget.Cells(i - 1, 3)), "=" & rngTarget.Cells(i, 3), _ Range(rngTarget.Cells(1, 4), rngTarget.Cells(i - 1, 4)), "=" & rngTarget.Cells(i, 4)) If ncnt > 0 Then rngTarget.Rows(i).ClearContents Next i
'удаление пустых строк (ранее очищенных) - движемся снизу вверх For i = rngTarget.Rows.Count To 3 Step -1 If IsEmpty(rngTarget.Cells(i, 5)) Then rngTarget.Rows(i).Delete Shift:=xlUp End If Next i
End Sub
[/vba]
YOUGIN, сможете сами загрузить код в свой файл и запустить? Или мне подготовить рабочий файл?
Немного оптимизировался - вынес 4 раза повторяющуюся конструкцию чтения комбинаций в отдельную подпрограмму: [vba]
Код
Option Explicit
Dim rngSource As Range Dim rngTarget As Range
'подпрограмма обработки комбинаций типа A&B, A&C и т.д. Sub doCombi(strRangeAddr, arrCols)
Dim cell As Range Dim col As Variant 'Long
For Each cell In Range(strRangeAddr) If cell.Value > 1 Then Set rngTarget = rngTarget.Offset(1) For Each col In arrCols rngTarget.Cells(col) = rngSource.Cells(cell.row, col) Next col rngTarget.Cells(5) = cell.Value End If Next
End Sub
'ГЛАВНАЯ ПРОГРАММА, которую надо запускать Sub io_v2()
'переопределяем диапазон в соответствии со всеми выведенными строками Set rngTarget = rngTarget.Offset(-rngTarget.row + 1).Resize(rngTarget.row)
'чистка повторов - если выше есть точно такая же строка, текущая вычищается '(с использованием функции СЧЁТЕСЛИМН, вычисляющей кол-во выше текущей строки) For i = 3 To rngTarget.Rows.Count ncnt = WorksheetFunction.CountIfs( _ Range(rngTarget.Cells(1, 1), rngTarget.Cells(i - 1, 1)), "=" & rngTarget.Cells(i, 1), _ Range(rngTarget.Cells(1, 2), rngTarget.Cells(i - 1, 2)), "=" & rngTarget.Cells(i, 2), _ Range(rngTarget.Cells(1, 3), rngTarget.Cells(i - 1, 3)), "=" & rngTarget.Cells(i, 3), _ Range(rngTarget.Cells(1, 4), rngTarget.Cells(i - 1, 4)), "=" & rngTarget.Cells(i, 4)) If ncnt > 0 Then rngTarget.Rows(i).ClearContents Next i
'удаление пустых строк (ранее очищенных) - движемся снизу вверх For i = rngTarget.Rows.Count To 3 Step -1 If IsEmpty(rngTarget.Cells(i, 5)) Then rngTarget.Rows(i).Delete Shift:=xlUp End If Next i
End Sub
[/vba]
YOUGIN, сможете сами загрузить код в свой файл и запустить? Или мне подготовить рабочий файл?Gustav