Не большой я спец в макросах, но вариант решения написал. [vba]
Код
Sub Macros() Application.ScreenUpdating = False Dim Arr1 As Variant, Arr2 As Variant, Arr3() As Variant Dim i As Long, j As Long, n As Long Dim sRow As Long, sCol As Long, fRow As Long, fCol As Long Set zc = Cells.Find("*") sRow = zc.Row 'номер строки первой заполненной ячейки sCol = zc.Column 'номер столбца первой заполненной ячейки fRow = Range(Left(zc.Address(0, 0), 1) & Rows.Count).End(xlUp).Row 'номер строки последней заполненной ячейки fCol = Range(zc.Address).End(xlToRight).Column 'номер столбца последней заполненной ячейки
For i = sCol To fCol - 1 'цикл для первого столбца в сравнении For j = i + 1 To fCol 'цикл для второго столбца в сравнении Arr1 = Range(Cells(sRow + 1, i), Cells(fRow, i)) 'массив первого столбца в сравнении Arr2 = Range(Cells(sRow + 1, j), Cells(fRow, j)) 'массив второго столбца в сравнении For n = 1 To UBound(Arr1) 'цикл по массивам If Arr1(n, 1) = Arr2(n, 1) And Arr1(n, 1) <> Empty Then Exit For 'сравнение значений массивов ReDim Preserve Arr3(1 To 1, 1 To n) ' создаем массив для объединения On Error Resume Next 'пропускаем ошибку, если пустое значение Arr3(1, n) = 1 * (Arr1(n, 1) & Arr2(n, 1)) 'объединяем массивы If n = UBound(Arr1) Then GoTo finish 'если проверили весь массив, то пара столбцов подобрана. Заканчиваем. Next n Next j Next i finish: Cells(1, fCol + 2) = Cells(1, i) & " и " & Cells(1, j) 'вывод номеров подобранных столбцов Cells(2, fCol + 2).Resize(n, 1) = Application.Transpose(Arr3) 'вывод объединенного массива Application.ScreenUpdating = True End Sub
[/vba] Alt+F8 - Macros - Выполнить Макросы должны быть разрешены.
Не большой я спец в макросах, но вариант решения написал. [vba]
Код
Sub Macros() Application.ScreenUpdating = False Dim Arr1 As Variant, Arr2 As Variant, Arr3() As Variant Dim i As Long, j As Long, n As Long Dim sRow As Long, sCol As Long, fRow As Long, fCol As Long Set zc = Cells.Find("*") sRow = zc.Row 'номер строки первой заполненной ячейки sCol = zc.Column 'номер столбца первой заполненной ячейки fRow = Range(Left(zc.Address(0, 0), 1) & Rows.Count).End(xlUp).Row 'номер строки последней заполненной ячейки fCol = Range(zc.Address).End(xlToRight).Column 'номер столбца последней заполненной ячейки
For i = sCol To fCol - 1 'цикл для первого столбца в сравнении For j = i + 1 To fCol 'цикл для второго столбца в сравнении Arr1 = Range(Cells(sRow + 1, i), Cells(fRow, i)) 'массив первого столбца в сравнении Arr2 = Range(Cells(sRow + 1, j), Cells(fRow, j)) 'массив второго столбца в сравнении For n = 1 To UBound(Arr1) 'цикл по массивам If Arr1(n, 1) = Arr2(n, 1) And Arr1(n, 1) <> Empty Then Exit For 'сравнение значений массивов ReDim Preserve Arr3(1 To 1, 1 To n) ' создаем массив для объединения On Error Resume Next 'пропускаем ошибку, если пустое значение Arr3(1, n) = 1 * (Arr1(n, 1) & Arr2(n, 1)) 'объединяем массивы If n = UBound(Arr1) Then GoTo finish 'если проверили весь массив, то пара столбцов подобрана. Заканчиваем. Next n Next j Next i finish: Cells(1, fCol + 2) = Cells(1, i) & " и " & Cells(1, j) 'вывод номеров подобранных столбцов Cells(2, fCol + 2).Resize(n, 1) = Application.Transpose(Arr3) 'вывод объединенного массива Application.ScreenUpdating = True End Sub
[/vba] Alt+F8 - Macros - Выполнить Макросы должны быть разрешены.AlexM
Доработал макрос для поиска нескольких пар. Убрал ошибочки.
[vba]
Код
Sub Macros() Application.ScreenUpdating = False Dim Arr1 As Variant, Arr2 As Variant, Arr3() ' As Variant Dim i As Long, j As Long, n As Long, m As Long Dim sRow As Long, sCol As Long, fRow As Long, fCol As Long sRow = Cells.Find("*").Row 'номер строки первой заполненной ячейки sCol = Cells.Find("*").Column 'номер столбца первой заполненной ячейки fRow = Cells.Find("*", SearchDirection:=xlPrevious).Row 'номер строки последней заполненной ячейки fCol = Range(Cells.Find("*").Address).End(xlToRight).Column 'номер столбца последней заполненной ячейки m = 1 For i = sCol To fCol - 1 'цикл для первого столбца в сравнении For j = i + 1 To fCol 'цикл для второго столбца в сравнении Arr1 = Range(Cells(sRow + 1, i), Cells(fRow, i)) 'массив первого столбца в сравнении Arr2 = Range(Cells(sRow + 1, j), Cells(fRow, j)) 'массив второго столбца в сравнении For n = 1 To UBound(Arr1) 'цикл по массивам If Arr1(n, 1) = Arr2(n, 1) And Arr1(n, 1) <> Empty Then Exit For 'сравнение значений массивов ReDim Preserve Arr3(UBound(Arr1), 1 To m) ' создаем массив для объединения Arr3(0, m) = Cells(1, i) & " и " & Cells(1, j) On Error Resume Next 'пропускаем ошибку, если пустое значение Arr3(n, m) = 1 * (Arr1(n, 1) & Arr2(n, 1)) 'объединяем массивы If n = UBound(Arr1) Then m = m + 1 'm количество найденных пар Next n Next j Next i Cells(1, fCol + 2).Resize(UBound(Arr1) + 1, m - 1) = Arr3 'вывод объединенного массива Application.ScreenUpdating = True End Sub
[/vba]
PS. мозги обленились писать макросы.
Доработал макрос для поиска нескольких пар. Убрал ошибочки.
[vba]
Код
Sub Macros() Application.ScreenUpdating = False Dim Arr1 As Variant, Arr2 As Variant, Arr3() ' As Variant Dim i As Long, j As Long, n As Long, m As Long Dim sRow As Long, sCol As Long, fRow As Long, fCol As Long sRow = Cells.Find("*").Row 'номер строки первой заполненной ячейки sCol = Cells.Find("*").Column 'номер столбца первой заполненной ячейки fRow = Cells.Find("*", SearchDirection:=xlPrevious).Row 'номер строки последней заполненной ячейки fCol = Range(Cells.Find("*").Address).End(xlToRight).Column 'номер столбца последней заполненной ячейки m = 1 For i = sCol To fCol - 1 'цикл для первого столбца в сравнении For j = i + 1 To fCol 'цикл для второго столбца в сравнении Arr1 = Range(Cells(sRow + 1, i), Cells(fRow, i)) 'массив первого столбца в сравнении Arr2 = Range(Cells(sRow + 1, j), Cells(fRow, j)) 'массив второго столбца в сравнении For n = 1 To UBound(Arr1) 'цикл по массивам If Arr1(n, 1) = Arr2(n, 1) And Arr1(n, 1) <> Empty Then Exit For 'сравнение значений массивов ReDim Preserve Arr3(UBound(Arr1), 1 To m) ' создаем массив для объединения Arr3(0, m) = Cells(1, i) & " и " & Cells(1, j) On Error Resume Next 'пропускаем ошибку, если пустое значение Arr3(n, m) = 1 * (Arr1(n, 1) & Arr2(n, 1)) 'объединяем массивы If n = UBound(Arr1) Then m = m + 1 'm количество найденных пар Next n Next j Next i Cells(1, fCol + 2).Resize(UBound(Arr1) + 1, m - 1) = Arr3 'вывод объединенного массива Application.ScreenUpdating = True End Sub
При объединении двух столбцов по 4 единицы, должен получится столбец с 8 единицами. Было не так. Исправил. Про наложении нескольких столбцов не понятно. В примере 1 и 5, 1 и 10, 1 и 11 1 и 5, 1 и 11 полностью совпадают и вывод единичек не изменится. Если наложить к ним 1 и 10, то количество единичек будет больше восьми. Поясните как быть? При наложении 1 и 5, 1 и 10, 1 и 11 будет 11 единиц
При объединении двух столбцов по 4 единицы, должен получится столбец с 8 единицами. Было не так. Исправил. Про наложении нескольких столбцов не понятно. В примере 1 и 5, 1 и 10, 1 и 11 1 и 5, 1 и 11 полностью совпадают и вывод единичек не изменится. Если наложить к ним 1 и 10, то количество единичек будет больше восьми. Поясните как быть? При наложении 1 и 5, 1 и 10, 1 и 11 будет 11 единицAlexM
в каждом столбце стоит 4 символа, при налаживании 2 не повторяющихся столбцов будет 8 символов, при налаживании 3 неповторяющихся столбцов будет 12 символов, при налаживании 4 неповторяющихся столбцов будет 16 символов и при налаживании 5 неповторяющихся столбцов будет 20 символов, только 4,8,12,16,20 вот такое количество символов может быть в столбцах если не повторяться символы, если нет подходящего столбца они так и остаются пока не появиться новый вариант который сможет объединиться с ним.
в каждом столбце стоит 4 символа, при налаживании 2 не повторяющихся столбцов будет 8 символов, при налаживании 3 неповторяющихся столбцов будет 12 символов, при налаживании 4 неповторяющихся столбцов будет 16 символов и при налаживании 5 неповторяющихся столбцов будет 20 символов, только 4,8,12,16,20 вот такое количество символов может быть в столбцах если не повторяться символы, если нет подходящего столбца они так и остаются пока не появиться новый вариант который сможет объединиться с ним.Swetlana