ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 为何处理不到文件夹内的其他工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-19 11:17 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
各位大神:
        不知道为啥套用了一个代码只能处理文件夹中的一个工作簿,其他的都没反应,求大神帮忙完善一下,谢谢。
        另外如果可以的话,顺便帮忙优化一下代码 : 原始导出的数据都是文本格式,需要将带“日期”字段的格式设置为“YYYY-MM-DD”格式,带数字的列转换为数值格式,“证件号码“及其他文字性的那些列可以忽略处理。

Sub 数据处理()
    Application.ScreenUpdating = False
    Dim FileName As String, ARR, I, CSRQ, GZRQ, RSRQ, ZJHM
    FileName = Dir(ThisWorkbook.Path & "\*.xls*")
        If FileName <> ThisWorkbook.Name Then
            Fn = ThisWorkbook.Path & "\" & FileName
            Workbooks.Open (Fn)
            Worksheets(1).Select
            CSRQ = Range("1:1").Find("出生日期").Column
            Columns(CSRQ).NumberFormatLocal = " YYYY-MM-DD"
            GZRQ = Range("1:1").Find("参加工作日期").Column
            Columns(GZRQ).NumberFormatLocal = " YYYY-MM-DD"
            RSRQ = Range("1:1").Find("入司日期").Column
            Columns(RSRQ).NumberFormatLocal = " YYYY-MM-DD"
            ZJHM = Range("1:1").Find("证件号码").Column
            Columns(ZJHM).NumberFormatLocal = " @"
            ARR = [A1].CurrentRegion
            For I = 2 To Range("A1").End(xlDown).Row
                For J = 1 To Range("A1").End(xlToRight).Column
                    If J <> CSRQ And J <> GZRQ And J <> RSRQ And J <> ZJHM And J <> Range("1:1").Find("部门").Column And J <> Range("1:1").Find("姓名").Column Then
                        ARR(I, J) = Val(Cells(I, J))
                    End If
                Next
            Next
            [A1].Resize(I - 1, J - 1) = ARR

            Workbooks(Fn).Close True
        End If
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub


数据处理2.zip

46.35 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2022-12-19 12:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
要加一个工作簿循环代码的。

数据处理2.zip

42.06 KB, 下载次数: 14

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-19 12:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
            Workbooks(Fn).Close True
        End If
加一句:FileName = Dir

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-19 12:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-19 15:27 | 显示全部楼层
本帖最后由 tmplinshi 于 2022-12-20 16:03 编辑

练习
  1. Sub 数据处理()
  2.     Application.ScreenUpdating = False

  3.     Dim fPath
  4.    
  5.     For Each fPath In FileList(ThisWorkbook.Path & "\*.xls?")
  6.         If fPath <> ThisWorkbook.FullName Then
  7.             ModifyFile CStr(fPath)
  8.         End If
  9.     Next

  10.     Application.CutCopyMode = False
  11.     Application.ScreenUpdating = True
  12. End Sub

  13. Sub ModifyFile(fPath As String)

  14.     With Workbooks.Open(fPath)
  15.         .Sheets(1).Select

  16.         Call 设置单元格格式
  17.         Call 带数字的列转换为数值格式

  18.         .Close True
  19.     End With
  20.    
  21. End Sub

  22. Sub 设置单元格格式()
  23.     Dim str
  24.     For Each str In Array("出生日期", "参加工作日期", "入司日期")
  25.         Range("1:1").Find(str).EntireColumn.NumberFormatLocal = " YYYY-MM-DD"
  26.     Next

  27.     Range("1:1").Find("证件号码").EntireColumn.NumberFormatLocal = " @"
  28. End Sub

  29. Sub 带数字的列转换为数值格式()
  30.     Dim ARR, I, J, skipColumns

  31.     ARR = [A1].CurrentRegion
  32.     Set skipColumns = GetExcludeColumns("出生日期", "参加工作日期", "入司日期", "证件号码", "部门", "姓名")

  33.     For I = 2 To Range("A1").End(xlDown).Row
  34.         For J = 1 To Range("A1").End(xlToRight).Column
  35.             If Not skipColumns.Exists(J) Then
  36.                 ARR(I, J) = Val(Cells(I, J))
  37.             End If
  38.         Next
  39.     Next

  40.     [A1].Resize(I - 1, J - 1) = ARR
  41. End Sub

  42. Function GetExcludeColumns(ParamArray cellKeywords()) As Object
  43.     Dim dict As Object
  44.     Set dict = CreateObject("Scripting.Dictionary")

  45.     Dim str, col
  46.     For Each str In cellKeywords
  47.         col = Range("1:1").Find(str).Column
  48.         dict(col) = ""
  49.     Next
  50.    
  51.     Set GetExcludeColumns = dict
  52. End Function

  53. Function FileList(filePattern As String) As Collection

  54.     Dim coll  As New Collection
  55.     Dim fso   As Object
  56.     Dim fDir  As String
  57.     Dim fName As String
  58.    
  59.     fName = Dir(filePattern)
  60.     If (fName = "") Then Exit Function
  61.    
  62.     Set fso = CreateObject("Scripting.FilesystemObject")
  63.     fDir = fso.GetParentFolderName(filePattern) & ""

  64.     Do
  65.         coll.Add fDir & fName
  66.         fName = Dir()
  67.     Loop Until (fName = "")

  68.     Set FileList = coll
  69.    
  70. End Function
复制代码


注:论坛原因,代码第 79 行有一个反斜杠符号没有显示出来。正确的应该是: 79行反斜杠符号没有显示出来.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-19 19:19 | 显示全部楼层
Sub TEST()
    Dim strFileName$, strPath$, wkb As Workbook, arr, i&
   
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    strPath = ThisWorkbook.Path & "\"
    strFileName = Dir(strPath & "*.xlsx")
   
    Do Until strFileName = ""
           Set wkb = Workbooks.Open(strPath & strFileName)
               dic.RemoveAll
               With wkb.Sheets(1)
                  arr = .[A1].CurrentRegion
                  .[A1].CurrentRegion.Offset(1).Clear
                  .Columns(5).NumberFormatLocal = "@"
                  For i = 1 To UBound(arr, 2)
                     If InStr(arr(1, i), "日期") Then
                        dic(arr(1, i)) = "yyyy/mm/dd"
                     End If
                  Next i
                  With .[A1].CurrentRegion.Resize(UBound(arr), UBound(arr, 2))
                      For i = 1 To UBound(arr, 2)
                          If dic.exists(arr(1, i)) Then .Columns(i).NumberFormatLocal = dic(arr(1, i))
                      Next i
                      .Value = arr
                      .HorizontalAlignment = xlCenter
                      .Borders.LineStyle = xlContinuous
                     .Rows(1).Font.Bold = True
                     .EntireColumn.AutoFit
                     .EntireRow.AutoFit
                  End With
               End With
           wkb.Close True
        strFileName = Dir
    Loop
   
    Set wkb = Nothing
    Application.ScreenUpdating = True
    Beep
End Sub

TA的精华主题

TA的得分主题

发表于 2022-12-19 19:22 | 显示全部楼层
参与一下。。。

数据处理2.rar

38.78 KB, 下载次数: 7

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-3 13:48 | 显示全部楼层
gwjkkkkk 发表于 2022-12-19 19:19
Sub TEST()
    Dim strFileName$, strPath$, wkb As Workbook, arr, i&
   

大神好,假设有些表,没有“日期”字段的,就会出现报错,怎么加一句让它继续执行后面的代码?

TA的精华主题

TA的得分主题

发表于 2023-1-3 14:15 | 显示全部楼层
zdh8083 发表于 2023-1-3 13:48
大神好,假设有些表,没有“日期”字段的,就会出现报错,怎么加一句让它继续执行后面的代码?

加在开头部分:On Error Resume Next

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-3 14:35 | 显示全部楼层
tanglf188 发表于 2023-1-3 14:15
加在开头部分:On Error Resume Next

是不是在没有相应字段的情况下,运行的时间会大幅度增加? 本来几秒搞定的愣是运行了两分多钟。。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 01:49 , Processed in 0.047640 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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