| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3005 人关注过本帖
标题:excel工作表合并问题,求解决
只看楼主 加入收藏
自强不西
Rank: 2
等 级:论坛游民
帖 子:147
专家分:26
注 册:2019-3-29
收藏
得分:0 
以下是引用吹水佬在2021-12-11 15:47:12的发言:

感觉用Copy较快
Private Sub CommandButton1_Click()
    Dim sh As Worksheet, nRows As Long, nRowCount As Long, nColCount As Long
    On Error Resume Next
    If Not Worksheets("合并表") Is Nothing Then
        Application.DisplayAlerts = False
        Worksheets("合并表").Delete
    End If
    Set sh = Worksheets.Add
    sh.Name = "合并表"
    nRows = 1
    For i = 1 To Sheets.Count
        If Sheets(i).Name <> "合并表" Then
            nRowCount = Sheets(i).UsedRange.Rows.Count
            nColCount = Sheets(i).UsedRange.Columns.Count
            Sheets(i).Cells(1, 1).Resize(nRowCount, nColCount).Copy sh.Cells(nRows, 1)
            nRows = nRows + nRowCount
        End If
    Next i
End Sub

感谢版主!这段程序对于一个工作簿中多个工作表的合并确认非常快。如果是多个相同格式的工作簿中的多个工作表的合并,麻烦版主看看有没有好的处理办法。
2022-01-09 16:04
自强不西
Rank: 2
等 级:论坛游民
帖 子:147
专家分:26
注 册:2019-3-29
收藏
得分:0 
具体的数据如下,麻烦版主给看下。
汇总数据.rar (2.09 MB)
2022-01-09 16:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏(1)
得分:0 
回复 12楼 自强不西
汇总数据.rar (3.75 MB)

程序代码:
    Dim sh As Worksheet
    Set sh = Sheets(1)
    sh.UsedRange.ClearContents

    Dim mPath
    mPath = ThisWorkbook.Path & "\"
    
    Dim fs As Object, wb As Workbook
    Dim f_name, e_name, nRow, nRows, nRowCount, nColCount
    nRows = 1
    Set fs = CreateObject("Scripting.FileSystemObject")
    For Each file In fs.GetFolder(mPath).Files
        f_name = Split(file.Name, ".")(0)
        e_name = Right(file.Name, Len(file.Name) - Len(f_name))
        If e_name = ".xlsx" Then
            Set wb = Workbooks.Open(file.Path)
            For Each sht In wb.Sheets
                nRowCount = sht.UsedRange.Rows.Count
                nColCount = sht.UsedRange.Columns.Count
                nRow = 1
                If nRows <> 1 And sht.Name = wb.Sheets(1).Name Then
                    nRow = 2
                    nRowCount = nRowCount - 1
                End If
                sht.Cells(nRow, 1).Resize(nRowCount, nColCount).Copy sh.Cells(nRows, 1)
                nRows = nRows + nRowCount
            Next
            wb.Close
        End If
    Next

2022-01-10 00:08
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:0 
程序代码:
 PUBLIC mypath
  cCurrentProcedure = SYS(16,1)
  nPathStart = AT(":",cCurrentProcedure)- 1
  nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
  mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
  SET DEFAULT TO (mypath)
*-----------------------------------------------------
M_File=getfile('xlsx')  
IF EMPTY(M_File)
  RETURN 
ENDIF 
SELECT 0
USE jlml_zdlh alia zdlh   &&& jlml_zdlh.dbf 是一张EXCEL表字段名与DBF表字段名相对应的表
REPLACE szlh with 0 all
SELECT 0
USE jlml_sjk alia bmk
ZAP
myexcel=createobject('excel.application')  
IF !VARTYPE(myexcel)$"Oo"      &&& 如果用户的电脑上未装EXCEL软件,则结束运行。
    MESSAGEBOX("建立EXCEL文件失败,请检查OFFICE是否正常!",48,"提醒:")
    RETURN 
ENDIF
myexcel.visible=.T.                                && 对象可见
bookexcel=myexcel.workbooks.open(M_File)            && 打开指定文件
o_SheetName=myexcel.application.ActiveSheet.Name    && 获取当前激活工作表的名称
o_UsedRange =bookexcel.worksheets(o_SheetName).UsedRange     && 返回工作表中可使用的区域,UsedRange表的属性
o_rows=o_UsedRange.rows.count  
o_cols=o_UsedRange.columns.count  
*--开始检测要导入的数据在EXCEL中各字段所在列的位置
FOR kg=1 to o_cols   
  dyg=bookexcel.worksheets(o_SheetName).cells(3,kg).text   &&& 标题在第3行
  SELECT zdlh
  LOCATE for ALLTRIM(zdlh.ebzdmc)==dyg
  IF FOUND()
    REPLACE zdlh.szlh with kg    &&& 检测到所在列号,进行记录
  ENDIF      
ENDFOR   
   SELECT zdlh
   GO top
   SCAN
     IF szlh=0            &&& 如果有记录的值未改写,会导致后面的语句执行出错,所以这里要结束程序
       myexcel.workbooks.close    && 关闭工作区
       myexcel.quit               && 关闭excel       
       RELEASE myexcel           &&& 释放对象变量,以完全结束EXCEL的进程
       MESSAGEBOX('缺少数据列(“ '+ALLTRIM(zdlh.ebzdmc)+' ”),导致出错,请检查!!!',48,'警告:')     
       RETURN 
     ENDIF 
   ENDSCAN 
   *--检测结束。增加了这个检测,就提高了程序的智能化     
   *--------------------------------------------


 FOR jj=1 TO 31         &&& 根据汇总月份的天数修改   31也可以用变量 
   myexcel.sheets(jj).activate           &&& 按日期依次设置为活动工作表
   o_SheetName=myexcel.application.ActiveSheet.Name    && 获取当前激活工作表的名称
   o_UsedRange =bookexcel.worksheets(o_SheetName).UsedRange     && 返回工作表中可使用的区域,UsedRange表的属性
   o_rows=o_UsedRange.rows.count                        && 汇总行 
   SELECT bmk
   IF o_rows<=1
     =MESSAGEBOX("待导入数据行数太少,请检查!",0+16,"提示")
   ELSE
     FOR i=4 TO o_rows
       WAIT WINDOW '共有'+ALLTRIM(STR(o_rows-3))+'条记录,正在导入第'+ALLTRIM(STR(i-3))+'条记录...' NOWAIT
       SELECT bmk
       APPEND BLANK 
       SELECT zdlh
       GO top
       SCAN
         cfname='bmk.'+ALLTRIM(zdlh.dbzdmc)
         IF zdlh.lx='txt'
           REPLACE (cfname) with myExcel.cells(i,zdlh.szlh).text
         ELSE 
           REPLACE (cfname) with myExcel.cells(i,zdlh.szlh).value
         ENDIF 
         SELECT zdlh
       ENDSCAN 
     ENDFOR 
   ENDIF

 ENDFOR 

 
myexcel.workbooks.close    && 关闭工作区
myexcel.quit               && 关闭excel
RELEASE myexcel           &&& 释放对象变量,以完全结束EXCEL的进程
SELECT bmk
COPY TO jlmlhz

RETURN 


以上代码是我每月的数据转移到DBF的代码。楼主可以借鉴!

我统计销售数据,每天一表,存在同一工作簿上,每天发总经理。
一个月满了,换一个工作簿,这样总经理在一月最后一个工作簿上可以看整月的。



只求每天有一丁点儿的进步就可以了
2022-01-10 08:07
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏(1)
得分:0 
回复 13楼 吹水佬
修改了一下
程序代码:
Private Sub CommandButton1_Click()
    Dim sh As Worksheet
    Set sh = Sheets(1)
    sh.UsedRange.ClearContents  '清除合并表所有数据

    Dim mPath
    mPath = ThisWorkbook.Path & "\"  '工作簿当前目录
    
    Dim wb As Workbook, fname As String
    Dim nRow, nRows, nRowCount, nColCount
    nRows = 1
    '遍历当前目录所有 xlsx 文件
    fname = Dir(mPath & "*.xlsx")
    Do While Len(fname) <> 0
        Set wb = Workbooks.Open(mPath & fname)  '打开工作簿
        For Each sht In wb.Sheets               '遍历工作簿所有工作表
            nRowCount = sht.UsedRange.Rows.Count
            nColCount = sht.UsedRange.Columns.Count
            nRow = 1
            '如果不是第一个工作簿的第一个工作表,不取第一行(栏目)
            If (nRows <> 1) And (sht Is wb.Sheets(1)) Then
                nRow = 2
                nRowCount = nRowCount - 1
            End If
            sht.Cells(nRow, 1).Resize(nRowCount, nColCount).Copy sh.Cells(nRows, 1)
            nRows = nRows + nRowCount
        Next
        wb.Close
        fname = Dir()
    Loop
End Sub

2022-01-10 11:07
ls_y041
Rank: 2
等 级:论坛游民
威 望:2
帖 子:173
专家分:56
注 册:2005-9-29
收藏
得分:0 
回复 14楼 wengjl
您写的字段对应表是如何设置的,想学习一下,这个方法感觉比较好当表的字段有变化时,直接修改对应的字段,就不用再重复写了,只是修改字段对应表就方便了。
2022-01-10 18:10
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:0 
jlml_zdlh.rar (424 Bytes)

只求每天有一丁点儿的进步就可以了
2022-01-11 10:53
自强不西
Rank: 2
等 级:论坛游民
帖 子:147
专家分:26
注 册:2019-3-29
收藏
得分:0 
谢谢各位楼主!
2023-09-07 13:23
快速回复:excel工作表合并问题,求解决
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022231 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved