VBA学习心得2

6. 读取不同数据格式并合并。

很多关于合并不同工作簿的教程都有一个共同之处,就是文件的格式几乎都是相同的,能判断出具体的单元格在第几行第几列,笔者查阅多方资料,不管是网上还是书,都没找到对不同的工作簿格式进行合并,十分失望,所以在此记录,希望帮到需要的朋友。

首先,先放图,不同的格式如下,


图1
图2

可见,无法确定姓名、银行卡等所在列。所以笔者想的方法是先查找到有关姓名等信息,然后定位到单元格的所在行列,再来将信息复制粘贴出来。

笔者第一次尝试用的find方法,部分代码如下

1.find方法通配符查找,Offset 操作进行位移定位,end(xlDown) 相当于Ctrl + ↓ 操作。

col = tws.UsedRange.SpecialCells(xlCellTypeLastCell).column                                                              '当前工作表中所有已使用的单元格区域列

row = tws.UsedRange.SpecialCells(xlCellTypeLastCell).row                                                                '当前工作表中所有已使用的单元格区域行

ws.Cells.Find("*姓*名*").Offset(1, 0).Select

        Range(Selection, Selection.End(xlDown)).Select

        wb_rows = Selection.Rows.Count

        If wb_rows = 0 Then

            ws.Cells.Find("*姓*名*").Offset(1, 0).Select

            Selection.Copy tws.Cells(row + 1, 2)

        Else

            Selection.Copy tws.Cells(row + 1, 2)

        End If

其中,

wb为导入文件的Workbooks,ws为导入文件的Workbooks.sheets;

Offset(1, 0)为定位的单元格的下面一格,相当于做一个位移操作;

Range(Selection, Selection.End(xlDown)) 相当于将定位到的单元格下面一格开始用键盘进行Ctrl + ↓ 全选操作;

wb_rows 记录了上一步所全选的行数,相当于记录导入表的姓名信息行数(有多少人)。

一开始笔者用了几个文件做的一个简单的测试,加了 if 语句是因为发现有的文件就只有一行人员信息,导致End(xlDown)操作后,全选了整个Excel的列,并且将wb_rows变为了0。。再之后的测试,发现定位查找,名称都不一样,连find通配符都没用了。。。笔者就各种查啊,有没有定位能多个关键字的或操作,发现没有。。并且,有的文档使用find方法明明文档中有但是依旧无法查到,有点奇怪,这里笔者没有解决,直接换了第二种操作。。直接用for each循环 + if 判断所有活动的单元格和姓名所在行的交集是否含有关键字。然后用循环复制粘贴,部分代码如下。

2. 强行 if 判断。

For Each title In titles

            If title = "姓名" Then

                For i = 1 To TempRowNum

                    ws.Cells(title.row + i, title.column).Copy

                    tws.Cells(row + i, 2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats

                Next

            End If

Next

这样,遇到一个不一样的使用or操作不停的加关键字就好了^ ^..经过592条数据的测试,发现可以正常使用。

不过还有可以优化的地方,if 判断也许可以使用find方法来,毕竟find方法可以使用通配符,也许可以少些几个关键字,但是可能还需要解决部分文档find方法无法查找定位的问题;使用了 if 和 elseif 来判断,也许可以改为 Select Case 语句。

下两篇直接丢代码。

你可能感兴趣的:(VBA学习心得2)