Автоконкатенация в Excel - PullRequest
1 голос
/ 20 февраля 2009

У меня есть огромная (~ 950 переменных) электронная таблица ответов на опрос, которая в 2-4 раза больше, чем нужно, потому что индивидуальные варианты ответов каждого элемента представлены в отдельных столбцах. Например, если Вопрос 2 находится в ячейке A1 и имеет 3 варианта ответа, они перечислены ниже вопроса в ячейках A2-C2, A3-C3 и т. Д. Примечание. Заполняется только один из A2-C2 и т. Д. С данными для каждое наблюдение.

Кажется очевидным, что я мог бы вручную пройти через электронную таблицу и объединить A2-C2, используя код, подобный следующему:

=CONCATENATE(IF(ISBLANK(A4),"",A4),IF(ISBLANK(B4),"",B4),IF(ISBLANK(C4),"",C4))

Но, вышеупомянутое требует ручного изменения кода (вопросы могут содержать от 2 до 6 вариантов ответа) и копирования / вставки его через все наблюдения для каждой из 960 переменных в отдельности. Поскольку я хотел бы закончить это до смерти от старости, я хотел бы иметь какой-то способ автоматизации вышеуказанного процесса.

Было бы достаточно легко пройти и вставить столбец идентификатора (без данных, но с некоторым очевидным именем 1-й строки) после последней опции ответа каждой переменной, чтобы код знал, с чего начать поиск данных для объединения. Код должен знать, что нужно останавливаться всякий раз, когда он достигает ранее объединенного результата, и начинать текущую конкатенацию с последующим столбцом. Как только он попадает в определенную строку (скажем, 60? У меня всего ~ 55 наблюдений), он может просто найти следующий столбец идентификатора и повторить процесс.

Любые идеи будут очень оценены.

Мне нужно проверить наличие пробелов, чтобы в данных не было лишних пробелов (чтобы облегчить дальнейший анализ).

Надеюсь, что ниже разъяснит ситуацию дальше. Вы правы в своем предыдущем комментарии; за каждым вопросом следуют 55 строк наблюдений. Например:

 | |   Q1   |         |        ||   Q2    |        || 
 |-|--------|---------|--------||---------|--------||
 |1|   1    |         |        ||         |    2   ||
 |2|        |    2    |        ||         |    2   ||
 |3|        |         |    3   ||         |    2   ||
 |4|        |    2    |        ||    1    |        ||
 |5|        |         |    3   ||         |        ||
 |6|   1    |         |        ||         |    2   ||
 |7|   1    |         |        ||    1    |        ||
 |8|        |         |    3   ||    1    |        ||
 |9|        |    2    |        ||         |    2   ||

В настоящее время нет пустого столбца после последнего варианта ответа на каждый вопрос, но (как уже упоминалось в первом посте) я легко могу добавить один.

Ответы [ 6 ]

1 голос
/ 20 февраля 2009

Я не уверен на 100%, что понимаю ваш макет, но вы можете значительно упростить объединение, используя & следующим образом:

=A4&B4&C4

это будет иметь тот же эффект, что и ваш код, и не требует проверки пустых ячеек.

Я займусь остальным вопросом, когда информация станет доступной.

edit: Вот мое решение. Я предполагаю, что вопросы находятся в строке 1, а первый набор наблюдений находится в строке 2, поэтому последний набор наблюдений попадает в строку 56.

  1. введите число 1 в ячейку A58
  2. поместите формулу: = IF (ISBLANK (B1), A58, A58 + 1) в ячейку B58
  3. Заполните эту формулу по всем вопросам.
  4. в ячейку A59 введите формулу = МАТЧ (КОЛОННА (), 58: 58,0)
  5. в ячейку A60 введите формулу = МАТЧ (КОЛОННА (), 58: 58,1)
  6. в ячейку A61 введите формулу = INDEX (1: 1,, A59)
  7. заполните все три эти формулы прямо для 17 ячеек (при условии, что у вас есть 17 вопросов)
  8. в ячейку A62 введите формулу = СУММА (НЕПРЯМОЙ (АДРЕС (строка (A2), A $ 59) & ":" & АДРЕС (строка (A2), A $ 60)))
  9. Заполните эту формулу через 17 ячеек и до 55 ячеек.

Вот как бы выглядело три вопроса:

       |  A  |  B  |  C  |  D  |  E  |  F  |  G  |
  |----|------------------------------------------
  |  1 | Qn1               Qn2         Qn3        
  |  2 |  1                       2     1         
  |  3 |        2                 2           2   
  | .. |
  | 58 |  1     1     1     2     2     3     3
  | 59 |  1     4     6
  | 60 |  3     5     8
  | 61 | Qn1   Qn2   Qn3
  | 62 |  1     2     1
  | 63 |  2     2     2
0 голосов
/ 10 апреля 2014

Или, если вы хотите просто выбрать горизонтальный диапазон и объединить непустые ячейки:

Function CONCIF(rng As Range)

Dim rCell As Range
Dim concat As String
Dim dist As Integer

dist = 0
concat = ""

For Each rCell In rng
    If rCell.Value <> "" Then
        If concat = "" Then
            concat = rCell.Value
        Else
        concat = concat & ", " & rCell.Value
        End If
    End If
Next rCell

CONCIF = concat
End Function
0 голосов
/ 28 сентября 2011

Старый пост, но я сделал эту функцию для объединения ячеек. Работает аналогично SUMIF.

Function CONCIF(rng As Range, criteria As Range, sums As Range)
'Function to concatenate a range of cells if the chosen adjacent cells matches
'the criteria.
'To use:
'  Copy and Paste this into a module in VB Editor
'  In a cell type =CONCIF(rng, criteria, sums) where:
'       rng is the range of cells to match the criteria
'       criteria is the value you would to match
'       sums is the range of cells to concatenate if criteria matches
'  To change what is put between the concatenations, edit the " / " below and put
'  whatever you would like in between the quotes.
'  Enjoy! -RP

Dim rCell As Range
Dim concat As String
Dim dist As Integer

dist = sums.Column - rng.Column
concat = ""

For Each rCell In rng
    If rCell = criteria Then
        If concat = "" Then
            concat = rCell.Offset(0, dist).Value
        Else
            concat = concat & " / " & rCell.Offset(0, dist).Value
        End If
    End If
Next rCell

CONCIF = concat
End Function
0 голосов
/ 13 апреля 2009

Спасибо за информацию. Помимо вашего пути можно использовать символ & для конкатенации, поэтому вместо: = concatenate (B1, ”“, C1, ”“, D1) вы можете использовать: = B1 & ”” & C1 & ”” & D1

0 голосов
/ 21 февраля 2009

Самый быстрый способ:

  1. Добавить новый столбец после столбца D
  2. Поместите 'Q1' в ячейку B1
  3. Введите следующую формулу: = СУММА (B2: D2)
  4. Скопируйте формулу до последней строки
  5. Повторите шаги выше для всех вопросов
  6. Выбрать все данные (ctrl - *)
  7. Скопировать выделение
  8. Выберите «Специальная вставка» из контекстного меню и выберите «Значения»
  9. Удалить исходные столбцы

Если вы хотите, вы можете создать макрос, который делает это автоматически.

Вот макрос. Это моё отнюдь не лучшее, что я когда-либо писал. Что бы вы ожидали через 15 минут. Это делает работу, хотя это терпит крах, когда закончено. о)

  1. Откройте свой лист Excel
  2. Сделать резервную копию
  3. Хит Alt-F11
  4. Вставить новый модуль
  5. Вставьте код ниже
  6. Поместить курсор внутри макроса
  7. Нажмите F8, чтобы пройти код

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

Sub Main()

    Dim ColumnsCount As Integer
    ColumnsCount = Range("A1").CurrentRegion.Columns.Count

    For i = 2 To 20000

        Dim CurrentCell As Range
        Set CurrentCell = Range("A1").Offset(0, i - 1)

        If CurrentCell.Value <> "" Then

            CurrentCell.Select
            Selection.End(xlToRight).Select

            Dim AnswersCount As Integer
            AnswersCount = Selection.Column - CurrentCell.Column

            CurrentCell.Offset(0, AnswersCount).Select
            Selection.EntireColumn.Insert

            Selection.Value = CurrentCell.Value
            i = i + AnswersCount

            Selection.Offset(1, 0).Select
            Selection.FormulaR1C1 = "=SUM(RC[" + CStr(AnswersCount * -1) + "]:RC[-1])"

            Selection.Copy
            Range(Selection, Selection.Offset(100, 0)).Select
            ActiveSheet.Paste

            Selection.EntireColumn.Select
            Application.CutCopyMode = False
            Selection.Copy
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        End If

    Next i

End Sub
0 голосов
/ 20 февраля 2009

@ EJames: Спасибо за предложение и указатель, чтобы выложить пример графически. Мне нужно проверить наличие пробелов, чтобы в данных не было лишних пробелов (чтобы облегчить дальнейший анализ).

Надеюсь, что ниже прояснит ситуацию дальше. Вы правы в своем предыдущем комментарии; за каждым вопросом следуют 55 строк наблюдений. Например:

 | |   Q1   |         |        ||   Q2    |        || 
 |-|--------|---------|--------||---------|--------||
 |1|   1    |         |        ||         |    2   ||
 |2|        |    2    |        ||         |    2   ||
 |3|        |         |    3   ||         |    2   ||
 |4|        |    2    |        ||    1    |        ||
 |5|        |         |    3   ||         |        ||
 |6|   1    |         |        ||         |    2   ||
 |7|   1    |         |        ||    1    |        ||
 |8|        |         |    3   ||    1    |        ||
 |9|        |    2    |        ||         |    2   ||

В настоящее время нет пустого столбца после последнего варианта ответа на каждый вопрос, но (как упоминалось в первоначальном сообщении) я могу легко добавить один.

Очень обязан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...