在Excel中自动连接

时间:2009-02-20 17:07:36

标签: excel concatenation

我有一个巨大的(~950变量)调查回复电子表格,比需要大2-4倍,因为每个项目的个别响应选项都在不同的列中报告。例如,如果问题2在单元格A1中并且具有3个响应选项,则这些选项列在单元格A2-C2,A3-C3等中的问题下方。注意:只有A2-C2等中的一个填充w / data每次观察。

很明显,我可以手动浏览电子表格并使用与此类似的代码连接A2-C2:

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

但是,上述方法需要手动更改代码(问题有2-6个响应选项),并通过所有960个变量的观察值分别复制/粘贴它。因为我想在晚年去世之前完成这项工作,我希望能有一些自动化上述过程的方法。

在每个变量的最后一个响应选项之后,很容易通过并插入一个标识符列(没有数据但是有一些明显的第一行名称),因此代码知道从哪里开始回顾要连接的数据。代码必须知道在它遇到先前连接的结果时停止,并开始当前连接w /后续列。一旦它遇到某一行(比如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 个答案:

答案 0 :(得分:1)

我不是100%确定我理解你的布局,但你可以通过使用& amp;来大大简化连接。如下:

=A4&B4&C4

这将与您的代码具有相同的效果,并且不需要检查空白单元格。

随着信息的出现,我将解决剩下的问题。

编辑:这是我的解决方案。我假设问题在第1行,第一组观察在第2行,所以最后一组观察结果在第56行。

  1. 在单元格A58中输入数字1
  2. 将公式:= IF(ISBLANK(B1),A58,A58 + 1)放入单元格B58
  3. 在您的所有问题中一直填写此公式
  4. 在单元格A59中,输入公式= MATCH(COLUMN(),58:57,5)
  5. 在单元格A60中,输入公式= MATCH(COLUMN(),58:58,1)
  6. 在单元格A61中,输入公式= INDEX(1:1 ,, A59)
  7. 为17个单元格填写所有这三个公式(假设您有17个问题)
  8. 在单元格A62中,输入公式= SUM(间接(地址(行(A2),A $ 59)&“:”& ADDRESS(行(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

答案 1 :(得分:0)

@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   ||

在每个问题的最后一个响应选项之后,当前没有空白列,但是(如初始帖子中所述)我可以轻松地将其中一个输入。

很有责任。

答案 2 :(得分:0)

最快的方式:

  1. 在列D
  2. 之后添加新列
  3. 将'Q1'放入单元格B1
  4. 将以下公式放入:= SUM(B2:D2)
  5. 将公式复制到最后一行
  6. 对所有问题重复上述步骤
  7. 选择所有数据(ctrl - *)
  8. 复制选择
  9. 从上下文菜单中选择“选择性粘贴”,然后选择“值”
  10. 删除原始列
  11. 如果您愿意,可以创建一个自动执行此操作的宏。

    这是宏。这绝不是我最好的编码。你会在15分钟内得到什么。它完成了这项工作,虽然它在完成时崩溃了。 ; o)

    1. 打开Excel工作表
    2. 制作备份副本
    3. 按Alt-F11
    4. 插入新模块
    5. 粘贴以下代码
    6. 将光标放在宏
    7. 按F8单步执行代码
    8. 由于您处于Stack Overflow中,我假设您可以调整宏以进一步调整您的需求。

      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
      

答案 3 :(得分:0)

感谢您提供的信息。除了你的方式,你也可以使用&amp;连接的字符,所以代替:= concatenate(B1,“”,C1,“”,D1)你可以使用:= B1&amp; “”&amp; C1&amp; “”&amp; D1

答案 4 :(得分:0)

旧帖但我使这个函数连接单元格。与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

答案 5 :(得分:0)

或者,如果您只想要一种简单的方法来选择水平范围并使其连接非空白单元格:

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