ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lbwrong

[求助] 只差最后一步了,我以后可以不用通宵了,帮帮我吧

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-6 21:01 | 显示全部楼层
楼主,可以考虑建立超链接,显示不显示公式意义不是很大

TA的精华主题

TA的得分主题

发表于 2025-4-7 10:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如果只要数值, 不要公式 可以看看:
https://club.excelhome.net/thread-1409141-1-1.html

TA的精华主题

TA的得分主题

发表于 2025-4-7 16:09 | 显示全部楼层
Sub ExtractDataFromMultipleXLS()
    Dim fileDialog As fileDialog
    Dim filePath As Variant
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim targetWs As Worksheet
    Dim dataRange As Range
    Dim colOffset As Integer
    Dim fileName As String
    Dim sheetName As String
    Dim foundSheet As Boolean
   
    ' 设置目标工作表为当前活动工作表
    Set targetWs = ActiveSheet
    colOffset = 0
   
    ' 获取要提取的工作表名
    sheetName = InputBox("请输入要提取数据的工作表名", "输入工作表名")
    If sheetName = "" Then
        MsgBox "未输入有效的工作表名,操作取消。"
        Exit Sub
    End If
   
    ' 将输入的工作表名转换为大写
    sheetName = UCase(sheetName)
   
    ' 创建文件选择对话框
    Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
    With fileDialog
        .Title = "选择 XLS 文件"
        .Filters.Clear
        .Filters.Add "Excel 文件", "*.xls*"
        .AllowMultiSelect = True
        
        ' 显示文件选择对话框
        If .Show = -1 Then
            ' 遍历所选的每个文件
            For Each filePath In .SelectedItems
                ' 打开所选的工作簿
                Set wb = Workbooks.Open(filePath)
                ' 获取工作簿名(不含扩展名)
                fileName = Left(wb.Name, InStrRev(wb.Name, ".") - 1)
               
                foundSheet = False
                ' 遍历工作簿中的所有工作表
                For Each ws In wb.Sheets
                    ' 将当前工作表名转换为大写并比较
                    If UCase(ws.Name) = sheetName Then
                        ' 设置要复制的数据范围
                        Set dataRange = ws.Range("C3:C40")
                        
                        ' 在目标工作表中复制数据
                        dataRange.Copy targetWs.Cells(3, 3 + colOffset)
                        
                        ' 在目标工作表的第一行写入工作表名
                        targetWs.Cells(1, 3 + colOffset).Value = ws.Name
                        ' 在目标工作表的第二行写入文件名
                        targetWs.Cells(2, 3 + colOffset).Value = fileName
                        
                        ' 列偏移量增加,以便下一个工作表的数据放在下一列
                        colOffset = colOffset + dataRange.Columns.Count
                        foundSheet = True
                        Exit For
                    End If
                Next ws
               
                If Not foundSheet Then
                    MsgBox "在文件 " & wb.Name & " 中未找到名为 " & sheetName & " 的工作表。", vbExclamation
                End If
               
                ' 关闭打开的工作簿,不保存更改
                wb.Close SaveChanges:=False
            Next filePath
        End If
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2025-4-7 16:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你看看能不能满足

汇总表.zip

12.74 KB, 下载次数: 16

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-7 16:26 | 显示全部楼层
楼主09年发的贴,估计现在用不上了,沉太久了。

TA的精华主题

TA的得分主题

发表于 2025-4-7 21:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
qdchyq 发表于 2025-4-7 16:14
你看看能不能满足

数据源B3向下的名称,能自动提取各源表不重复的到汇总表、然后在合并C列吗

TA的精华主题

TA的得分主题

发表于 2025-4-9 20:19 | 显示全部楼层
本帖最后由 qdchyq 于 2025-4-9 20:28 编辑

jjmysjg 发表于 2025-4-7 21:28
数据源B3向下的名称,能自动提取各源表不重复的到汇总表、然后在合并C列吗


Sub ExtractAndSumData2222()
    Dim folderPath As String
    Dim fileName As String
    Dim summaryWb As Workbook
    Dim summaryWs As Worksheet
    Dim sourceWb As Workbook
    Dim sourceWs As Worksheet
    Dim i As Long, j As Long, col As Long
    Dim matchValue As Variant
    Dim tempDict As Object
    Dim allNamesDict As Object
    Dim key As Variant
    Dim rowCount As Long
   
    ' 设置汇总表工作簿和工作表
    Set summaryWb = ThisWorkbook
    Set summaryWs = summaryWb.ActiveSheet
   
    ' 选择文件夹
    With Application.fileDialog(msoFileDialogFolderPicker)
        .Title = "选择包含 Excel 文件的文件夹"
        If .Show = -1 Then
            folderPath = .SelectedItems(1)
        Else
            MsgBox "未选择文件夹,操作取消。"
            Exit Sub
        End If
    End With
   
    ' 添加文件夹路径分隔符
    If Right(folderPath, 1) <> "\" Then
        folderPath = folderPath & "\"
    End If
   
    ' 创建一个字典用于存储所有出现过的名称
    Set allNamesDict = CreateObject("Scripting.Dictionary")
   
    ' 获取文件夹中的第一个 Excel 文件
    fileName = Dir(folderPath & "*.xls*")
   
    ' 遍历文件夹中的所有 Excel 文件
    Do While fileName <> ""
        ' 排除汇总工作簿
        If fileName <> summaryWb.Name Then
            ' 打开工作簿
            Set sourceWb = Workbooks.Open(folderPath & fileName)
            
            ' 遍历工作簿中的所有工作表
            For Each sourceWs In sourceWb.Sheets
                ' 遍历当前工作表 B3:B38 区域
                For j = 3 To 38
                    matchValue = sourceWs.Cells(j, 2).Value
                    If matchValue <> "" And Not allNamesDict.Exists(matchValue) Then
                        allNamesDict.Add matchValue, 1
                    End If
                Next j
            Next sourceWs
            
            ' 关闭工作簿,不保存更改
            sourceWb.Close SaveChanges:=False
        End If
        ' 获取下一个 Excel 文件
        fileName = Dir
    Loop
   
    ' 将所有不重复的名称写入汇总表 B3:B38
    rowCount = 3
    For Each key In allNamesDict.Keys
        summaryWs.Cells(rowCount, 2).Value = key
        rowCount = rowCount + 1
        If rowCount > 38 Then Exit For
    Next key
   
    col = 3 ' 从 C 列开始写入数据
    fileName = Dir(folderPath & "*.xls*") ' 重新开始遍历文件
   
    ' 再次遍历文件夹中的所有 Excel 文件进行求和操作
    Do While fileName <> ""
        ' 排除汇总工作簿
        If fileName <> summaryWb.Name Then
            ' 打开工作簿
            Set sourceWb = Workbooks.Open(folderPath & fileName)
            
            ' 创建一个字典用于存储每个名称对应的总和
            Set tempDict = CreateObject("Scripting.Dictionary")
            
            ' 遍历工作簿中的所有工作表
            For Each sourceWs In sourceWb.Sheets
                ' 遍历当前工作表 B3:B38 区域
                For j = 3 To 40
                    matchValue = sourceWs.Cells(j, 2).Value
                    If Not tempDict.Exists(matchValue) Then
                        tempDict.Add matchValue, sourceWs.Cells(j, 3).Value
                    Else
                        tempDict(matchValue) = tempDict(matchValue) + sourceWs.Cells(j, 3).Value
                    End If
                Next j
            Next sourceWs
            
            ' 将汇总值写入汇总表对应列
            For i = 3 To 40
                matchValue = summaryWs.Cells(i, 2).Value
                If tempDict.Exists(matchValue) Then
                    summaryWs.Cells(i, col).Value = tempDict(matchValue)
                End If
            Next i
            
            ' 写入文件名到第二行
            summaryWs.Cells(2, col).Value = Replace(fileName, ".xlsx", "")
            summaryWs.Cells(2, col).Value = Replace(summaryWs.Cells(2, col).Value, ".xls", "")
            
            col = col + 1 ' 移动到下一列
            
            ' 关闭工作簿,不保存更改
            sourceWb.Close SaveChanges:=False
        End If
        ' 获取下一个 Excel 文件
        fileName = Dir
    Loop
End Sub
   

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-9 22:07 | 显示全部楼层
本帖最后由 jjmysjg 于 2025-4-9 22:17 编辑
qdchyq 发表于 2025-4-9 20:19
jjmysjg 发表于 2025-4-7 21:28
数据源B3向下的名称,能自动提取各源表不重复的到汇总表、然后在合并C列吗 ...

谢谢大侠!
数据源的B列修改名,汇总名称没有变化。
要求:提取数据源B3向下的不重复名称到汇总表

TA的精华主题

TA的得分主题

发表于 2025-4-10 15:04 | 显示全部楼层
参与下,请测试,不需要提前在标题行写上工作簿的名称,代码自动完成。

汇总表.7z

55.98 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2025-4-10 15:56 | 显示全部楼层
313667354 发表于 2025-4-10 15:04
参与下,请测试,不需要提前在标题行写上工作簿的名称,代码自动完成。

汇总表B列的名称,能自动从数据源筛选进来吗
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-14 22:09 , Processed in 0.025079 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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