1

我有一个巨大的(约 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 个变量中的每一个变量的所有观察单独复制/粘贴它。因为我想在年老之前完成这项工作,所以我很想有一些方法可以使上述过程自动化。

在每个变量的最后一个响应选项之后插入一个标识符列(没有数据,但有一些明显的第一行名称)很容易,这样代码就知道从哪里开始查找要连接的数据。代码必须知道在遇到先前连接的结果时停止,并开始与后续列的当前连接。一旦它到达某一行(比如说,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   ||

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

4

6 回答 6

1

我不是 100% 确定我理解您的布局,但您可以通过使用 & 大大简化串联,如下所示:

=A4&B4&C4

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

当信息可用时,我将解决剩下的问题。

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

  1. 在单元格 A58 中键入数字 1
  2. 将公式: =IF(ISBLANK(B1),A58,A58+1) 放入单元格 B58
  3. 在你所有的问题中一直填写这个公式
  4. 在单元格 A59 中,输入公式 =MATCH(COLUMN(),58:58,0)
  5. 在单元格 A60 中,输入公式 =MATCH(COLUMN(),58:58,1)
  6. 在单元格 A61 中,输入公式 =INDEX(1:1,,A59)
  7. 为 17 个单元格填写所有这三个公式(假设您有 17 个问题)
  8. 在单元格 A62 中,输入公式 =SUM(INDIRECT(ADDRESS(ROW(A2),A$59)&":"&ADDRESS(ROW(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
于 2009-02-20T17:17:31.857 回答
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   ||

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

非常感谢。

于 2009-02-20T20:57:59.953 回答
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
于 2011-09-28T19:02:45.987 回答
0

最快的方法:

  1. 在 D 列之后添加一个新列
  2. 将“Q1”放入单元格 B1
  3. 将以下公式代入: =SUM(B2:D2)
  4. 将公式复制到最后一行
  5. 对所有问题重复上述步骤
  6. 选择所有数据 (ctrl-*)
  7. 复制选择
  8. 从上下文菜单中选择“选择性粘贴”,然后选择“值”
  9. 删除原始列

如果您愿意,您可以创建一个自动执行此操作的宏。

这是宏。这不是我有史以来最好的编码。你会在 15 分钟内期待什么。它完成了这项工作,尽管完成后它会崩溃。;o)

  1. 打开你的 Excel 工作表
  2. 制作备份副本
  3. 按 Alt-F11
  4. 插入新模块
  5. 粘贴下面的代码
  6. 将光标放在宏内
  7. 按 F8 单步执行代码

由于您在 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
于 2009-02-20T21:09:06.590 回答
0

感谢您提供的信息。除了您的方式之外,您还可以使用 & 字符进行连接,因此您可以使用 =concatenate(B1," ",C1," ",D1) 代替: =B1 & ” ” & C1 & ” ” & D1

于 2009-04-13T05:46:08.900 回答
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
于 2014-04-10T16:35:56.653 回答