乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表-excel下标

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表-excel下标

作者:乔山办公网日期:

返回目录:excel表格制作

前景提要()

上一节我们学习了将单个工作薄几个字段不同的工作表的内容汇总在一个工作表的方法,在上节的操作中,我们主要是通过通过InputBox来实现工作表字段的选择的,InputBox来实现输入的话,有一个很明显的好处就是我们并不需要通过手动输入的方式来确认字段,避免了出错的可能性,但是随着使用的不断深入,我们会发现InputBox又有一个弊端,来看看

假设我现在想要将三个学科VBA,python,java都汇总在一个工作表中,但是每个表只有两个学习,如果用InputBox选择的话,没有办法实现跨表区域选择

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

实际上只选择了一个B班的java这一列,那么如果我们跨工作表来选择指定列的话,要如何来实现呢?

场景模拟

既然我们前面已经尝试了没有办法通过InputBox来实现跨工作表选择列的方式了,那么我们这里只能选择通过手动输入的方式来进行了,每个标头的名字中间用split函数进行分割,形成一个新的数组来替代我们之前使用过的arr,来看看代码

代码区

Sub testadd()
Dim sth As Worksheet, new_sth As Worksheet, arr, rng As Range, arrsth, arrT
s = Application.InputBox("请输入要合并的标头,用英文逗号隔开", "标头的确定", , , , , , 3)
arr = Split(s, ",")
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "汇总表"
Set new_sth = ActiveSheet
k = 0
For Each sth In Worksheets
If sth.Name <> "汇总表" Then
k = k + 1
If k = 1 Then
arrsth = sth.UsedRange.Rows(1)
l2 = sth.Cells(Rows.Count, 1).End(xlUp).Row
For i = 0 To UBound(arr)
On Error Resume Next
num = WorksheetFunction.Match(arr(i), arrsth, 0)
If Err.Number = 0 Then
l = new_sth.Cells(1, Columns.Count).End(xlToLeft).Column
If l = 1 And new_sth.Cells(1, 1) = "" Then
sth.UsedRange.Columns(num).Copy new_sth.Cells(1, 1)
Else
sth.UsedRange.Columns(num).Copy new_sth.Cells(1, l + 1)
End If
End If
Next i
Else
arrsth = sth.UsedRange.Rows(1)
l2 = Cells(1, Columns.Count).End(xlToLeft).Column
l3 = new_sth.Cells(Rows.Count, 1).End(xlUp).Row
For i = 0 To UBound(arr)
On Error Resume Next
num = WorksheetFunction.Match(arr(i), arrsth, 0)
If Err.Number = 0 Then
arrT = new_sth.Range(Cells(1, 1), Cells(1, l3))
On Error Resume Next
num2 = WorksheetFunction.Match(arr(i), arrT, 0)
If Err.Number <> 0 Then
new_sth.Cells(1, l2 + 1) = arr(i)
sth.UsedRange.Columns(num).Offset(1, 0).Copy new_sth.Cells(l3 + 1, l2 + 1)
Else
sth.UsedRange.Columns(num).Offset(1, 0).Copy new_sth.Cells(l3 + 1, num2)
End If
End If
Next i
End If
End If
Next sth
End Sub

我们来看看实际执行的效果

假设我们这里合并VBA,python,java这三名学科的成绩,来看看执行步骤

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

这里会提示我们手工输入标头,并且用英文版的逗号隔开

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

这里我们输入三名学科,同时加上学生的姓名

来看看最终的结果

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

合并是合并了,但是好像少来一个python的成绩啊,为什么呢?

我们来仔细看看python这个标头

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

原来每个python旁边因为输入的习惯问题,都会有一个空格,好吧,这里我们输入的没有空格,所以我们需要加上空格来看看

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

增加一个空格

好了效果就出来了。

ExcelVBA工作薄 7.11玩转不规则数据合并 字段不在同一个工作表

代码分析

这里我们因为数据的原因,我们这里选择手工输入标头的方式来进行,大家也看到了关键点,标头一定要输对,不能少空格,多空格之类的

这里我们依然用InputBox来实现输入,相对于上节InputBox就不能直接选择单元格了,只能输入指定的标头名称,并用英文逗号隔开,

然后我们就可以用split()函数来进行拆分,形成一个新的数组,代替上节课的rng,复制给arr

后面的裸机就和上节的基本一样了,不过需要稍微修改下,因为我们此时的arr是一个一维数组,所以最大下标这里就需要做出变动

For i = 0 To UBound(arr)

同时进行二次判断的时候,也需要在逻辑上稍微调整下

比方说这一段

 If Err.Number <> 0 Then
new_sth.Cells(1, l2 + 1) = arr(i)
sth.UsedRange.Columns(num).Offset(1, 0).Copy new_sth.Cells(l3 + 1, l2 + 1)
Else
sth.UsedRange.Columns(num).Offset(1, 0).Copy new_sth.Cells(l3 + 1, num2)
End If

如果标头在汇总表中不存在的话,我们这里就需要在最右侧新增标头了,而不能向上节一样,直接利用数组的定位来进行中增加了。

l2 = Cells(1, Columns.Count).End(xlToLeft).Column

后米的逻辑基本上和上节一样,大家自己调试下就可以了。

=======================================================

今天和大家分享更加复杂的不规则的数据处理模式,其实小编并不喜欢处理这样的个性化的数据模式,因为无法保证代码的通用性,上面的代码,小编也是调试了几次之后才敢发出来的,如果大家在使用的过程中,还碰到了问题,可以私信小编,小编尽量帮忙解答,毕竟个性化的数据模式,通用性比较难满足

好了~明晚19:00,准时再见。

相关阅读

关键词不能为空
极力推荐
  • Excel单元格内如何换行-excel换行

  • excel换行,在同一单元格输入内容较多时,需要将内容分两行或多行显示,可是按enter键换行时,会直接调到下一个单元格,有没有什么办法实现换行呢。

ppt怎么做_excel表格制作_office365_word文档_365办公网