ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2772|回复: 14

[求助] 求老师给看看这个怎么改代码[VBA根据模板提取相关数据后导出新的工作簿文件]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-5 10:57 | 显示全部楼层 |阅读模式
本帖最后由 yygydong 于 2018-7-6 14:36 编辑

这两天一直在爬论坛,找到些有用的模板,可无耐刚接触VBA,对代码的理解有限,借用的代码怎么改都改不对,请老师给看看这个代码怎么改吧,学习中。。。。急等。
导出工作表需求.png

导出后的工作簿内表名按这个效果

导出后的工作簿内表名按这个效果

期望导出生成后的效果

期望导出生成后的效果

对应改后代码出错提示

对应改后代码出错提示

求助导出工作簿.rar

27.05 KB, 下载次数: 1

更新的一些编码,对应7楼代码,可是有个错误提示。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 11:00 | 显示全部楼层
本帖最后由 yygydong 于 2018-7-5 14:24 编辑

希望老师能对代码进行一下注释,好想学习这个,但还只是入门啊。。。
以下是模块代码,不知道改的哪错了,请老师们给解决一下啊。

'Option Explicit

Sub 生成流水账()
    Dim arr As Variant, brr() As Variant, d As Object, theWb As Workbook
    Dim i&, j&, k&, theTempValue As Variant, theNumStr$, theName$, theStr$
    Dim thePath$, theTemplateFullName$, sht As Variant, theRecordsCount&
    Dim theCountryName$, theGroupName$, theSheetsCount&, theOldSheetsInNewWorkbook&

    arr = Sheet4.Cells(1).CurrentRegion
    For i = 5 To UBound(arr) - 1 '冒泡排序(升序)
        For j = 2 To UBound(arr) - 1
            If arr(j, 2) > arr(j + 1, 2) Then
                For k = 1 To UBound(arr, 2)
                    theTempValue = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = theTempValue
                Next k
            End If
        Next j
    Next i

    ReDim brr(1 To 100, 1 To 13) '注:与arr数组的维数无太大关系
    thePath = ThisWorkbook.Path
    If Right(thePath, 1) <> "\" Then thePath = thePath & "\"
    theTemplateFullName = thePath & Sheet5.Name & ".xlt"
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Sheet5.Copy
    With ActiveWorkbook
        .SaveAs Filename:=theTemplateFullName, FileFormat:=xlTemplate
        .Close False
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(arr)
        theName = arr(i, 8) '姓名
        If theName <> "" Then d(theName) = ""
    Next i
    If d.Count = 0 Then GoTo The_Exit
    Application.ScreenUpdating = False
    Application.ShowWindowsInTaskbar = False
    i = 2
    For j = 0 To d.Count - 1
        theName = d.keys()(j)
        theCountryName = ""
        theGroupName = ""
        theNumStr = ""
        theRecordsCount = 0
        Do While arr(i, 2) = theName
            theRecordsCount = theRecordsCount + 1
            If theCountryName = "" Then theCountryName = arr(i, 8)(0) '分包人
            If theNumStr = "" Then theNumStr = arr(i, 1)
            brr(theRecordsCount, 1) = arr(i, 1) '合同名称
            brr(theRecordsCount, 2) = arr(i, 3) '科目
            brr(theRecordsCount, 3) = arr(i, 4) '除税金额
            brr(theRecordsCount, 4) = arr(i, 5) '出生日期
            brr(theRecordsCount, 5) = arr(i, 6) '民族
            brr(theRecordsCount, 6) = arr(i, 7) '文化
            brr(theRecordsCount, 8) = arr(i, 8) '婚姻状况
            brr(theRecordsCount, 9) = arr(i, 9) '支付比例
            brr(theRecordsCount, 10) = arr(i, 11) '收款单位
            i = i + 1
            If i > UBound(arr) Then Exit Do
        Loop
        If theRecordsCount > 0 Then
            theSheetsCount = theSheetsCount + 1
            If Not theWb Is Nothing Then
                Application.DisplayAlerts = False
                With theWb
                    Set sht = .Sheets.Add(after:=.Sheets(.Sheets.Count), Type:=theTemplateFullName)
                End With
                Application.DisplayAlerts = True
            Else
                theOldSheetsInNewWorkbook = Application.SheetsInNewWorkbook
                Application.SheetsInNewWorkbook = 1
                Set theWb = Workbooks.Add
                Application.SheetsInNewWorkbook = theOldSheetsInNewWorkbook
                With theWb
                    Application.DisplayAlerts = False
                    Set sht = .Sheets.Add(after:=.Sheets(.Sheets.Count), Type:=theTemplateFullName)
                    .Worksheets(1).Delete
                    Application.DisplayAlerts = True
                End With
            End If
            With sht
                .Name = theName
                .Cells(2, 4) = theCountryName
                .Cells(2, 7) = theGroupName
                .Cells(2, 13) = theNumStr '户编号
                .Cells(4, 1).Resize(theRecordsCount, UBound(brr, 2)) = brr
            End With
        End If
    Application.ShowWindowsInTaskbar = True
    If theSheetsCount > 0 Then
        theWb.Worksheets(1).Activate
        Application.ScreenUpdating = True
        MsgBox "工作簿文件已生成", vbInformation, "信息"
    Else
        Application.ScreenUpdating = True
        MsgBox "未生成工作簿文件", vbInformation, "信息"
    End If
The_Exit:
    On Error Resume Next
    Kill theTemplateFullName
    On Error GoTo 0
    Set sht = Nothing
    Set d = Nothing
    Set theWb = Nothing
End Sub



TA的精华主题

TA的得分主题

发表于 2018-7-5 11:01 | 显示全部楼层
根据模板工作表,生成工作薄

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 11:04 | 显示全部楼层
LMY123 发表于 2018-7-5 11:01
根据模板工作表,生成工作薄

是的,但与数据源与模板的列数不对应,这个模板只要取其中需要的数据进行汇总。

TA的精华主题

TA的得分主题

发表于 2018-7-5 12:53 来自手机 | 显示全部楼层
yygydong 发表于 2018-7-5 11:04
是的,但与数据源与模板的列数不对应,这个模板只要取其中需要的数据进行汇总。

是的,这种格式的确比较麻烦,一般都是三栏账,借贷余。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-6 13:08 | 显示全部楼层
怎么沉了啊,麻烦知道老师们给看一下,改一下代码啊。先谢谢啦。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-6 14:22 | 显示全部楼层
自己摸索着改了下,可还是不能运行啊,有点晕,麻烦老师们抽出宝贵的时间给看一下哈,先谢谢了。

'Option Explicit

Sub 生成流水账()
    Dim arr As Variant, brr() As Variant, d As Object, theWb As Workbook
    Dim i&, j&, k&, theTempValue As Variant, theNumStr$, theName$, theStr$
    Dim thePath$, theTemplateFullName$, sht As Variant, theRecordsCount&
    Dim theCountryName$, theGroupName$, theSheetsCount&, theOldSheetsInNewWorkbook&

    arr = Sheet4.Cells(1).CurrentRegion
    For i = 5 To UBound(arr) - 1 '冒泡排序(升序)
        For j = 2 To UBound(arr) - 1
            If arr(j, 2) > arr(j + 1, 2) Then
                For k = 1 To UBound(arr, 2)
                    theTempValue = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = theTempValue
                Next k
            End If
        Next j
    Next i

    ReDim brr(5 To 100, 1 To 13) '5至100行,1到13列;数组范围
    thePath = ThisWorkbook.Path
    If Right(thePath, 1) <> "\" Then thePath = thePath & "\"
    theTemplateFullName = thePath & Sheet5.Name & ".xls"
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Sheet5.Copy
    With ActiveWorkbook
        .SaveAs Filename:=theTemplateFullName, FileFormat:=xlTemplate
        .Close False
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    Set d = CreateObject("Scripting.Dictionary")
    For i = 5 To UBound(arr)
        theName = arr(i, 2) '同一分包人
        If theName <> "" Then d(theName) = ""
    Next i
    If d.Count = 0 Then GoTo The_Exit
    Application.ScreenUpdating = False
    Application.ShowWindowsInTaskbar = False
    i = 2
    For j = 0 To d.Count - 1
        theName = d.keys()(j)
        theCountryName = ""
        theGroupName = ""
        theNumStr = ""
        theRecordsCount = 0
        Do While arr(i, 2) = theName
            theRecordsCount = theRecordsCount + 1
            If theCountryName = "" Then theCountryName = Split(arr(i, 1), ":")(0) '项目名称
            If theGroupName = "" Then theGroupName = Replace(Split(arr(i, 1), ":")(1), ":", "") '项目名称内容
            If theNumStr = "" Then theNumStr = arr(i, 2)
            brr(theRecordsCount, 1) = arr(i, 1) '合同名称
            brr(theRecordsCount, 2) = arr(i, 3) '科目
            brr(theRecordsCount, 3) = arr(i, 4) '除税金额
            brr(theRecordsCount, 4) = arr(i, 5) '税金
            brr(theRecordsCount, 5) = arr(i, 5) '支付日期
            brr(theRecordsCount, 6) = arr(i, 6) '支付金额
            brr(theRecordsCount, 7) = arr(i, 7) '支付比例
            brr(theRecordsCount, 8) = arr(i, 10) '收款单位
            brr(theRecordsCount, 9) = arr(i, 12) '备注
            If i > UBound(arr) Then Exit Do
        Loop
        If theRecordsCount > 0 Then
            theSheetsCount = theSheetsCount + 1
            If Not theWb Is Nothing Then
                Application.DisplayAlerts = False
                With theWb
                    Set sht = .Sheets.Add(after:=.Sheets(.Sheets.Count), Type:=theTemplateFullName)
                End With
                Application.DisplayAlerts = True
            Else
                theOldSheetsInNewWorkbook = Application.SheetsInNewWorkbook
                Application.SheetsInNewWorkbook = 1
                Set theWb = Workbooks.Add
                Application.SheetsInNewWorkbook = theOldSheetsInNewWorkbook
                With theWb
                    Application.DisplayAlerts = False
                    Set sht = .Sheets.Add(after:=.Sheets(.Sheets.Count), Type:=theTemplateFullName)
                    .Worksheets(1).Delete
                    Application.DisplayAlerts = True
                End With
            End If
            With sht
                .Name = theName
                .Cells(2, 1) = theCountryName '项目名称位置
                .Cells(2, 2) = theGroupName '项目名称内容位置
                .Cells(2, 7) = theNumStr '分包人内容位置
                .Cells(5, 1).Resize(theRecordsCount, UBound(brr, 2)) = brr '开始写入内容位置
            End With
        End If
    Application.ShowWindowsInTaskbar = True
    If theSheetsCount > 0 Then
        theWb.Worksheets(1).Activate
        Application.ScreenUpdating = True
        MsgBox "工作簿文件已生成", vbInformation, "信息"
    Else
        Application.ScreenUpdating = True
        MsgBox "未生成工作簿文件", vbInformation, "信息"
    End If
The_Exit:
    On Error Resume Next
    Kill theTemplateFullName
    On Error GoTo 0
    Set sht = Nothing
    Set d = Nothing
    Set theWb = Nothing
End Sub



TA的精华主题

TA的得分主题

发表于 2018-7-6 15:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 这个是昵称吗 于 2018-7-6 16:30 编辑

你这个变量又多,变量名又长!对于位这种英文小白完全记不住哪个是哪个!!
本身代码又长!
我试着写了一个你试试能不能达到效果!!

导出工作表.rar

36.81 KB, 下载次数: 6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-6 21:02 | 显示全部楼层
这个是昵称吗 发表于 2018-7-6 15:57
你这个变量又多,变量名又长!对于位这种英文小白完全记不住哪个是哪个!!
本身代码又长!
我试着写了一 ...

谢谢,这个可以,学习啦。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-6 21:49 | 显示全部楼层
这个是昵称吗 发表于 2018-7-6 15:57
你这个变量又多,变量名又长!对于位这种英文小白完全记不住哪个是哪个!!
本身代码又长!
我试着写了一 ...

想追问一下,能不能把所有导出的明细表放在一个工作簿内,并且表内的表格线根据内容进行增减,就是合计行后就不需要网格线,如果表的行数特别多的话,也能自动的加上网格线。谢谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-8 23:47 , Processed in 0.053923 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表