2 / 2 / 0
Регистрация: 24.11.2012
Сообщений: 32
1

Как сцепить каждую ячейку столбца А с каждой ячейкой ст. B (все комбинации)

17.05.2015, 11:57. Показов 5377. Ответов 21
Метки нет (Все метки)

Уважаемые знатоки Excel, помогите пожалуйста написать функцию для решения такой задачки

Есть исходная табличка такого вида:
----------------------------------------------------
Samsung микрофон цена недорого
Nokia экран купить дешево
Sony динамик замена
батарея ремонт
восстановление
----------------------------------------------------

Суть вопроса - нужно СЦЕПИТЬ каждое значение столбца А + с каждой ячейкой столбца B + с каждой ячейкой столбца С + с каждой ячейкой столбца D.
Т.е. нужно получить все возможные комбинации сочетания этих слов - такого вида:

Samsung микрофон цена недорого
Samsung микрофон цена дешево
Samsung микрофон купить недорого
Samsung микрофон купить дешево
Samsung микрофон заменанедорого
… … … …
Sony батарея восстановление дешево
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2015, 11:57
Ответы с готовыми решениями:

Как можно из выделенного столбца каждую вторую ячейку перенести на столбец вправо и на ячейку вверх?
До вчерашнего дня ни VBA ни excel-ными макросами не интересовался, да и не надо было, а вот...

Найти в строке все комбинации из сдвоенных букв и удалить вторую букву в каждой комбинации
2. Найти в строке все комбинации из сдвоенных букв и удалить вторую букву в каждой комбинации.

Как сделать пустую ячейку в таблице - ячейкой с пробелом
Работаю корректором! и столкнулся с такой проблемой: в пустой яйчейке(полностью пустой) в таблице,...

Сцепить несколько дат в одну ячейку, в столбик?
Здравствуйте, подскажите пожалуйста, как сцепить несколько дат из разных ячеек в одну, чтобы они...

21
Супер-Помогатор
1032 / 618 / 132
Регистрация: 26.12.2013
Сообщений: 1,975
17.05.2015, 12:46 2
А в чем собственно проблема?
Код
=СЦЕПИТЬ(A1;" ";B1" ";.........)
или
Код
=A1&" "&B1&" "&C1
0
2 / 2 / 0
Регистрация: 24.11.2012
Сообщений: 32
17.05.2015, 13:15  [ТС] 3
Я извиняюсь, у меня в первом сообщении разметка таблички "поплыла", итак:
Есть исходная табличка такого вида (см. прикрепленный фал):


Суть вопроса - нужно СЦЕПИТЬ каждое значение столбца А + с каждой ячейкой столбца B + с каждой ячейкой столбца С + с каждой ячейкой столбца D.
Т.е. нужно получить все возможные комбинации сочетания этих слов - такого вида:

Samsung микрофон цена недорого
Samsung микрофон цена дешево
Samsung микрофон купить недорого
Samsung микрофон купить дешево
Samsung микрофон заменанедорого
… … … …
Sony батарея восстановление дешево
Миниатюры
Как сцепить каждую ячейку столбца А с каждой ячейкой ст. B (все комбинации)  
0
Супер-Помогатор
1032 / 618 / 132
Регистрация: 26.12.2013
Сообщений: 1,975
17.05.2015, 13:59 4
Вообще вопрос непонятен. Тебе нужно просто вывести все возможные варианты в разных ячейках? Ну так и меняй в формуле адресацию ячеек. Если тебе нужно выводить разные варианты, как ты описал, в одной ячейке, то должны быть какие-то критерии, т.е. условия, при которых должны выводиться варианты. Вот и озвучь эти условия.
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
17.05.2015, 14:14 5
4 цикла в цикле.
Места то хватит?
А чтоб писать код с проверкой - нужен пример данных в файле. Не лениво его изготовить?
0
2 / 2 / 0
Регистрация: 24.11.2012
Сообщений: 32
17.05.2015, 16:44  [ТС] 6
Файл примера прикрепил.

В результате выполнения кода должно получиться 120 строк

Цитата Сообщение от antal10 Посмотреть сообщение
Вообще вопрос непонятен. Тебе нужно просто вывести все возможные варианты в разных ячейках? Ну так и меняй в формуле адресацию ячеек. Если тебе нужно выводить разные варианты, как ты описал, в одной ячейке, то должны быть какие-то критерии, т.е. условия, при которых должны выводиться варианты. Вот и озвучь эти условия.
Каждой ячейке столбца А, должна быть подставлено каждая ячейка столбца B, которой будет подставлена каждая ячейка столбца С, и наконец тоже со столбцом D
Т.е. в итоге имеем 120 строк, в которых перечислены все возможные варианты сочетаний этих слов.
Вложения
Тип файла: xlsx табл.xlsx (14.8 Кб, 37 просмотров)
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
17.05.2015, 17:06 7
Лучший ответ Сообщение было отмечено join как решение

Решение

Табличку чуть подвинул, чтоб было место для кнопки. В макросе это учитывается.
Вложения
Тип файла: xls таблH.xls (53.5 Кб, 134 просмотров)
1
2 / 2 / 0
Регистрация: 24.11.2012
Сообщений: 32
17.05.2015, 17:35  [ТС] 8
Hugo121, Спасибо огромное. Очень доволен
1
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 16
05.11.2015, 14:36 9
Цитата Сообщение от Hugo121 Посмотреть сообщение
Табличку чуть подвинул, чтоб было место для кнопки. В макросе это учитывается.
Подскажите как в ваш макрос добавить еще 1 столбец (или n столбцов)??
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
05.11.2015, 14:47 10
Глянул код - удивился, это я писал?
Так там ведь всё понятно - как добавить
Добавляйте переменные, строки, меняйте адресацию, расширяйте массив, "4" меняйте на другое число.
0
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 16
05.11.2015, 15:34 11
Согласен, все понятно, но у меня не получается. Выдает ошибку.
Вот код что я изменил

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit
 
Sub tt()
    Dim r1 As Range, r2 As Range, r3 As Range, r4 As Range, r5 As Range, i&
    
    Application.ScreenUpdating = False
    For Each r1 In Range([a3], [a3].End(xlDown)).Cells
        For Each r2 In Range([b3], [b3].End(xlDown)).Cells
            For Each r3 In Range([c3], [c3].End(xlDown)).Cells
                For Each r4 In Range([d3], [d3].End(xlDown)).Cells
                    For Each r5 In Range([e3], [e3].End(xlDown)).Cells
                        i = i + 1
                        Cells(i, 7).Resize(, 5) = Array(r1, r2, r3, r4, r5)
                    Next
                Next
            Next
        Next
    Next
    Application.ScreenUpdating = True
End Sub
Выдает ошибку 1004
0
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 16
05.11.2015, 15:38 12
Hugo121, Согласен, все понятно, но у меня не получается. Выдает ошибку.
Вот код что я изменил
Миниатюры
Как сцепить каждую ячейку столбца А с каждой ячейкой ст. B (все комбинации)  
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
05.11.2015, 15:41 13
Покажите код в файле - сделайте небольшой нерабочий пример
Пока будете делать - думаю разберётесь почему ошибка.
1
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 16
05.11.2015, 15:46 14
Все заработало чудесным образом!
Большое вам спасибо что откликнулись!
Думаю проблема была в том что я не сохранял файл.
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
05.11.2015, 15:47 15
Проверил Ваш вариант на файле таблH.xls из темы, всё работает. Правда конечно нужно добавить в таблицу пятый столбец с данными.
0
6076 / 1320 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
05.11.2015, 17:42 16
Hugo121, olegator13god, а что вы скажете про такой вариант?
Рекурсивное построение декартова произведения
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Const FIRST_ROW_NUM = 3 'Первая строка, с которой начинаются данные для построения декартова произведения.
Sub DecartMultiply(ByVal depth As Long, ByRef dimensions As Long, ByRef ubounds() As Long, ByRef indices() As Long, ByRef arr() As String, ByRef k As Long)
    Dim i As Long, j As Long
    If depth < dimensions - 1 Then
        For i = 0 To ubounds(depth)
            indices(depth) = i
            DecartMultiply depth + 1, dimensions, ubounds, indices, arr, k
        Next i
    Else
        For i = 0 To ubounds(depth)
            arr(k, dimensions - 1) = Cells(FIRST_ROW_NUM + i, dimensions).Value
            For j = dimensions - 2 To 0 Step -1
                arr(k, j) = Cells(FIRST_ROW_NUM + indices(j), j + 1).Value
            Next j
            k = k + 1
        Next i
    End If
End Sub
Sub CreateDecartMultiply()
    Dim i As Long, k As Long, n As Long, dimensions As Long, uboundMax As Long, outputRow As Long, lastRow As Long
    Dim ubounds() As Long, indices() As Long, arr() As String
    dimensions = Range(Cells(FIRST_ROW_NUM, 1), Cells(FIRST_ROW_NUM, 1).End(xlToRight)).Columns.Count
    ReDim ubounds(0 To dimensions - 1) As Long
    ReDim indices(0 To dimensions - 2) As Long
    n = 1
    For i = 0 To dimensions - 1
        If IsEmpty(Cells(FIRST_ROW_NUM + 1, i + 1)) Then ubounds(i) = 0 Else ubounds(i) = Cells(FIRST_ROW_NUM, i + 1).End(xlDown).Row - FIRST_ROW_NUM
        n = n * (ubounds(i) + 1)
        If ubounds(i) > uboundMax Then uboundMax = ubounds(i)
    Next i
    ReDim arr(0 To n - 1, 0 To dimensions - 1) As String
    DecartMultiply 0, dimensions, ubounds, indices, arr, k
    lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    outputRow = FIRST_ROW_NUM + uboundMax + 2
    If (outputRow <= lastRow) Then Range(Rows(outputRow), Rows(lastRow)).Delete
    Cells(outputRow, 1).Resize(n, dimensions).Value = arr
End Sub

Понимаю, что мой код страшненький, зато его не нужно корректировать при добавлении/удалении столбцов.

С уважением,
Аксима
2
15134 / 6408 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
05.11.2015, 18:54 17
join, еще кое-что: https://www.cyberforum.ru/ms-e... 09312.html
0
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 16
07.11.2015, 11:59 18
Цитата Сообщение от Аксима Посмотреть сообщение
Hugo121, olegator13god, а что вы скажете про такой вариант?
Рекурсивное построение декартова произведения
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Const FIRST_ROW_NUM = 3 'Первая строка, с которой начинаются данные для построения декартова произведения.
Sub DecartMultiply(ByVal depth As Long, ByRef dimensions As Long, ByRef ubounds() As Long, ByRef indices() As Long, ByRef arr() As String, ByRef k As Long)
    Dim i As Long, j As Long
    If depth < dimensions - 1 Then
        For i = 0 To ubounds(depth)
            indices(depth) = i
            DecartMultiply depth + 1, dimensions, ubounds, indices, arr, k
        Next i
    Else
        For i = 0 To ubounds(depth)
            arr(k, dimensions - 1) = Cells(FIRST_ROW_NUM + i, dimensions).Value
            For j = dimensions - 2 To 0 Step -1
                arr(k, j) = Cells(FIRST_ROW_NUM + indices(j), j + 1).Value
            Next j
            k = k + 1
        Next i
    End If
End Sub
Sub CreateDecartMultiply()
    Dim i As Long, k As Long, n As Long, dimensions As Long, uboundMax As Long, outputRow As Long, lastRow As Long
    Dim ubounds() As Long, indices() As Long, arr() As String
    dimensions = Range(Cells(FIRST_ROW_NUM, 1), Cells(FIRST_ROW_NUM, 1).End(xlToRight)).Columns.Count
    ReDim ubounds(0 To dimensions - 1) As Long
    ReDim indices(0 To dimensions - 2) As Long
    n = 1
    For i = 0 To dimensions - 1
        If IsEmpty(Cells(FIRST_ROW_NUM + 1, i + 1)) Then ubounds(i) = 0 Else ubounds(i) = Cells(FIRST_ROW_NUM, i + 1).End(xlDown).Row - FIRST_ROW_NUM
        n = n * (ubounds(i) + 1)
        If ubounds(i) > uboundMax Then uboundMax = ubounds(i)
    Next i
    ReDim arr(0 To n - 1, 0 To dimensions - 1) As String
    DecartMultiply 0, dimensions, ubounds, indices, arr, k
    lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    outputRow = FIRST_ROW_NUM + uboundMax + 2
    If (outputRow <= lastRow) Then Range(Rows(outputRow), Rows(lastRow)).Delete
    Cells(outputRow, 1).Resize(n, dimensions).Value = arr
End Sub

Понимаю, что мой код страшненький, зато его не нужно корректировать при добавлении/удалении столбцов.

С уважением,
Аксима
Очень крутой макрос!
Спасибо огромное!
А что бы результат макроса вставлялся в новый лист сделать тяжело ?
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,559
07.11.2015, 15:50 19
Легко.
Visual Basic
1
НовыйЛист.Cells(1, 1).Resize(n, dimensions).Value = arr
Только тогда вся бодяга с lastRow / outputRow уже не нужна, можно исключить.
Про создание нового листа вопроса не было!
1
0 / 0 / 0
Регистрация: 07.07.2016
Сообщений: 1
07.07.2016, 12:26 20
Здравствуйте!
Насколько трудно сделать вывод результатов не в несколько ячеек строки, а в одну?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2016, 12:26
Помогаю со студенческими работами здесь

Объед ячеек столбцов одной строки в ячейку с разделением построчно каждой ячейки столбца
Описание действия: Предположим у нас имеется таблица, состоящая из трех столбцов: id Name Дата...

Если строка больше чем размер ячейки, то объединить ячейку с нижней ячейкой
Нужна помощь в создании макроса Пишу строку символов, если строка больше чем размер ячейки, то...

Как удалить каждую 12 ячейку в выделенном диапазоне?
Друзья пжалста, выручайте!!!!!!

Как в datagridview записать текст (поэлементно) в каждую ячейку
как в таблицу в datagridview, 8 на 8 например, записать текст(поэлементно) в каждую ячейку ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru