Excel转换

昨天在百度搜索资料的时候,看到一个关于Excel信息排版转换的提问。于是自己动手用VB写了一个算法。
提问者的大体描述为:
Excel中的原始信息排版如下:
公司名称 123
产品 123
简介
联系方式 123
邮件 123
公司名称 123
产品 123
简介
联系方式 123
邮件 123
。。。。。。

预想的Excel排版如下:
公司名称 产品 简介 联系方式 邮件
123        1213     12    123         12
123        1213     12    123        12
123        1213     12     123        12
123        1213     12     123        12

假设:原始信息中所有信息存放在第一个工作表中,且只有两列,一列为项目名(不可以为空值),另一列为项目值,且每组信息的项目名一样,即列一以(公司名称 产品 简介 联系方式 邮件。。。)的形式重复出现。

分析:首先获取原始Excel文件;然后获取列项目名的数量,确定新的Excel的第一行;接着循环读取原始信息中列2的值存放在新表中

关键代码如下:
Dim objExl As New Excel.Application
Dim lie As Integer
Dim i, j, t, Num As Integer
objExl.Workbooks.Open (dlg.FileName)       '通过读取通用对话框获取的文件名打开Excel原始文件
'在原始文件中创建一个新的工作表,存放转换后的信息
objExl.Worksheets.Add , objExl.Sheets(objExl.Sheets.Count)
Num = objExl.Sheets.Count
objExl.Sheets(Num).Name = "转换后"
objExl.Sheets(1).Select     '选定原始文件
For i = 2 To 20    '假设最多的项目名为20个,实现实际项目名的获取
    If objExl.Cells(i, 1) = objExl.Cells(1, 1) Then
        Exit For
    End If
Next i
lie = i - 1
For i = 1 To lie   '确定了项目名的个数,读取原始表中的项目名依次拷贝到新的工作表中
    objExl.Sheets(1).Cells(i, 1).Copy
    objExl.Sheets(Num).Select
    objExl.Sheets(Num).Cells(1, i).Select
    objExl.ActiveSheet.Paste
    objExl.Sheets(1).Select
Next i
i = 1
j = 1
t = 2   '新的工作表中从第二行起始实现项目值的拷贝
Do While objExl.Sheets(1).Cells(i, 1) <> "" '项目名以空值为结束标志
    objExl.Sheets(1).Cells(i, 2).Copy             
    objExl.Sheets(Num).Select
    objExl.Sheets(Num).Cells(t, j).Select
    objExl.ActiveSheet.Paste
    If (j Mod lie = 0) Then                              '以每一项目组为标志,实现新工作表中的换行操作
        t = t + 1
        j = 0
    End If
    j = j + 1
    i = i + 1
    objExl.Sheets(1).Select
Loop
objExl.Visible = True
objExl.Sheets(Num).Select                       '设置Excel为可见,并选定新工作表,以便用户的查看
objExl.Quit

在此附上生成的小应用程序和供测试的文本。


附:测试文本、小应用程序

posted @ 2008-12-09 10:46  水星人已隐匿  阅读(242)  评论(0编辑  收藏  举报