在Excel中自动连接

我有一个庞大(约950variables)的调查回复电子表格,比需要的大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个variables的每个观察值复制/粘贴它。 因为我想在晚年之前完成这个工作,所以我很想有一些自动化上述过程的方法。

在每个variables的最后一个响应选项之后插入一个标识符列(没有数据,但有一些明显的第一行名称)是很容易的,因此代码知道从哪里开始回顾数据的连接。 代码将不得不知道什么时候停止以前连接的结果,并开始当前串联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 || 

在每个问题的最后一个响应选项之后,目前没有空白的列,但是(如在初始文章中提到的那样)我可以很容易地将其扔进去。

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

 =A4&B4&C4 

这会和你的代码有相同的效果,而且不需要检查空白单元格。

随着信息变得可用,我将解决问题的其余部分。

编辑:这是我的解决scheme。 我假设问题在第一行,第一组观察在第二行,所以最后一组观察落在第56行。

  1. 在单元格A58中键入数字1
  2. 将公式:= IF(ISBLANK(B1),A58,A58 + 1)放入单元格B58中
  3. 在你所有的问题中一直填写这个公式
  4. 在单元格A59中,input公式= MATCH(COLUMN(),58:58,0)
  5. 在单元格A60中,input公式= MATCH(COLUMN(),58:58,1)
  6. 在单元格A61中,input公式= INDEX(1:1,A59)
  7. 填写所有这三个公式适合17个单元格(假设你有17个问题)
  8. 在单元格A62中input公式= SUM(INDIRECT(ADDRESS(ROW(A2),A $ 59)&“:”&ADDRESS(ROW(A2),A $ 60)))
  9. 用17个单元格填充此公式,并减less55个单元格。

以下是如何查找三个问题:

  | 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 

@EJames:感谢您的build议和指针,以graphics方式布置示例。 我需要检查空格,以便在数据中没有额外的空格(以便于将来的分析)。

希望下面将进一步澄清这一情况。 你在之前的评论中是正确的。 每个问题后跟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 || 

在每个问题的最后一个响应选项之后,目前没有空白的列,但是(如在初始文章中提到的那样)我可以很容易地将其扔进去。

多谢。

最快的方法:

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

如果你想要的话,你可以创build一个自动执行此操作的macros。

这是macros。 这是我从来没有意味着我最好的一段编码。 你会在15分钟内预计什么? 它完成这项工作,但完成后崩溃。 ; O)

  1. 打开你的Excel表
  2. 做一个备份副本
  3. 点击Alt-F11
  4. 插入一个新的模块
  5. 粘贴下面的代码
  6. 把光标放在macros里面
  7. 点击F8来浏览代码

由于你在堆栈溢出,我假设你将能够调整macros来进一步定制您的需求。

 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 

感谢这条信息。 除了你的方式之外,还可以使用&字符进行连接,所以不要使用:= concateate(B1,“”,C1,“”,D1),可以使用:= B1&“”&C1&“”&D1

旧post,但我做了这个函数来连接单元格。 与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 

或者,如果您只想简单地select一个水平范围并连接非空白单元格:

 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