ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lrlxxqxa

越学习,越发现自己的无知。

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-9 12:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

关于遍历文件夹

http://club.excelhome.net/viewth ... p;extra=&page=1
老朽和大灰狼提供的方法。
注意45楼的更新,修正两处:
1、对打开文件夹目录的操作实现记忆功能;
2、对不同文件夹下的同名文件,容错
===================================================
  1. Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  2. Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

  3. Private Sub CommandButton1_Click()
  4.     Set objShell = CreateObject("Shell.Application")
  5.     Set objFolder = objShell.BrowseForFolder(0, "选择文件夹", 0, 0)
  6.     If Not objFolder Is Nothing Then
  7.         If Right(objFolder.self.Path, 1) = "" Then
  8.             TextBox1 = objFolder.self.Path
  9.         Else
  10.             TextBox1 = objFolder.self.Path & ""
  11.         End If
  12.     End If
  13.     Set objFolder = Nothing
  14.     Set objShell = Nothing
  15. End Sub

  16. Private Sub CommandButton2_Click()
  17.     Unload Me
  18. End Sub

  19. Private Sub CommandButton3_Click()
  20.     Call 建立资料目录
  21. End Sub

  22. Private Sub UserForm_Initialize()
  23.     Dim i As Integer
  24.     Dim temp As String * 255

  25.     i = GetPrivateProfileString("LastFindInfo", "Folder", "c:", temp, 255, "ExcelFind.ini")
  26.     TextBox1 = temp
  27. End Sub
  28. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)   '保存上次打开文件夹路径
  29.     Dim i As Integer
  30.     Dim temp As String * 255
  31.     temp = TextBox1
  32.     i = WritePrivateProfileString("LastFindInfo", "Folder", temp, "ExcelFind.ini")
  33. End Sub
  34. Sub 建立资料目录()    '使用双字典,旨在提高速度
  35.     Dim yy()
  36.     Dim xx    '(1 To 1000, 1 To 4)
  37.     Dim MyName, Dic, Did, i, T, F, TT, MyFileName, objShell, objFolder, lj, Ke, sz, Sh, rng As Range, cell As Range
  38.     Dim ObjFso As New FileSystemObject
  39.     'On Error Resume Next
  40.     'Set objShell = CreateObject("Shell.Application")
  41.     'Set objFolder = objShell.BrowseForFolder(0, "选择文件夹", 0, 0)
  42.     'If Not objFolder Is Nothing Then lj = objFolder.self.Path & ""
  43.     'Set objFolder = Nothing
  44.     'Set objShell = Nothing
  45.     lj = TextBox1
  46.     Application.ScreenUpdating = False
  47.     T = Timer
  48.     Set Dic = CreateObject("Scripting.Dictionary")    '创建一个字典对象
  49.     Set Did = CreateObject("Scripting.Dictionary")
  50.     Dic.Add (lj), ""
  51.     i = 0
  52.     Do While i < Dic.Count
  53.         Ke = Dic.keys   '开始遍历字典
  54.         MyName = Dir(Ke(i), vbDirectory)    '查找目录
  55.         Do While MyName <> ""
  56.             If MyName <> "." And MyName <> ".." Then
  57.                 If (GetAttr(Ke(i) & MyName) And vbDirectory) = vbDirectory Then    '如果是次级目录
  58.                     Dic.Add (Ke(i) & MyName & ""), ""  '就往字典中添加这个次级目录名作为一个条目
  59.                 End If
  60.             End If
  61.             MyName = Dir    '继续遍历寻找
  62.         Loop
  63.         i = i + 1
  64.     Loop
  65.     sz = Split(lj, "")
  66.     If UBound(sz) = 1 Then
  67.         ls = Left(lj, 1) & "盘"
  68.     Else
  69.         ls = sz(UBound(sz) - 1)
  70.     End If
  71.     nTotalLine = 0
  72.     p = 1
  73.     i_p = 1
  74.     Did.Add (ls & "文件清单"), ""    '以查找D盘下所有EXCEL文件为例
  75.     For Each Ke In Dic.keys
  76.         'xx(p, 1) = Ke
  77.         'xx(p, 4) = Ke
  78.         ReDim Preserve yy(p)
  79.         yy(p) = Ke & "|" & " " & "|" & " " & "|" & Ke
  80.         p = p + 1
  81.         Did.Add Ke, ""
  82.         MyFileName = Dir(Ke & "*.*")
  83.         Do While MyFileName <> ""
  84.             If Did.Exists(MyFileName) Then
  85.                 Did.Add (Ke & MyFileName), ""
  86.             Else
  87.                 Did.Add (MyFileName), ""
  88.             End If
  89.             '    xx(p, 1) = MyFileName
  90.             '    xx(p, 2) = Round(FileLen(Ke & MyFileName) / 1024, 2) & "K"
  91.             Set ObjFile = ObjFso.GetFile(Ke & MyFileName)
  92.             '    xx(p, 3) = ObjFile.DateLastModified '最后修改日期
  93.             '    xx(p, 4) = Ke & MyFileName
  94.             ReDim Preserve yy(p)
  95.             yy(p) = MyFileName & "|" & Round(FileLen(Ke & MyFileName) / 1024, 2) & "K" & "|" & ObjFile.DateLastModified & "|" & Ke & MyFileName
  96.             p = p + 1
  97.             MyFileName = Dir
  98.         Loop
  99.         '   Did.Add "", ""
  100.         '   p = p + 1
  101.     Next
  102.     For Each Sh In ThisWorkbook.Worksheets
  103.         If Sh.Name = ls & "文件清单" Then
  104.             Sheets(ls & "文件清单").Cells.Delete
  105.             F = True
  106.             Exit For
  107.         Else
  108.             F = False
  109.         End If
  110.     Next
  111.     If Not F Then
  112.         Sheets.Add.Name = ls & "文件清单"
  113.     End If
  114.     'Sheets(ls & "文件清单").[A1].Resize(Did.Count, 1) = WorksheetFunction.Transpose(Did.keys)


  115.     With Sheets(ls & "文件清单")
  116.         .Activate
  117.         .Cells(1, 1) = "路径文件名"
  118.         .Cells(1, 2) = "文件大小"
  119.         .Cells(1, 3) = "时间属性"
  120.         ReDim xx(1 To p - 1, 1 To 4)
  121.         For i = 1 To p - 1
  122.             a = Split(yy(i), "|")
  123.             For j = 0 To 3
  124.                 xx(i_p, j + 1) = a(j)
  125.             Next
  126.             i_p = i_p + 1
  127.         Next
  128.         .Range("a2:c" & i_p) = xx
  129.         j = Did.Count
  130.         Set rng = .Range("a1:c" & j)
  131.         For s = 1 To j - 1
  132.             .Cells(s + 1, 1).Select
  133.             .Cells(s + 1, 1).Hyperlinks.Add Anchor:=Selection, Address:=xx(s, 4)    '.Cells(S, 1)
  134.             rng.EntireColumn.AutoFit
  135.         Next s
  136.     End With
  137.     Set rng = Nothing
  138.     ThisWorkbook.SaveAs ThisWorkbook.Path & "" & ls & "文件清单"
  139.     Application.ScreenUpdating = True
  140.     TT = Timer - T
  141.     MsgBox TT    'Minute(TT) & "分" & Second(TT) & "秒"
  142. End Sub
复制代码

[ 本帖最后由 lrlxxqxa 于 2011-7-9 12:07 编辑 ]

vba遍历文件夹目录by大灰狼.rar

17.88 KB, 下载次数: 30

TA的精华主题

TA的得分主题

发表于 2011-7-20 21:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享 我要好好学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-5 10:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

关于窗体的一点代码知识

http://club.excelhome.net/viewthread.php?tid=285933
虽然API目前看不懂,先过一遍

Option Explicit
'//****************************************************************************************************************************************
'//此模块演示了一个没有边框和标题栏的窗体
'//****************************************************************************************************************************************
'//以下声明API函数
'//查找窗口
Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) _
As Long
'//取得窗口样式位
Private Declare Function GetWindowLong _
    Lib "user32" _
    Alias "GetWindowLongA" ( _
        ByVal Hwnd As Long, _
        ByVal nIndex As Long) _
As Long
'//设置窗口样式位
Private Declare Function SetWindowLong _
    Lib "user32" _
    Alias "SetWindowLongA" ( _
        ByVal Hwnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long) _
As Long
'//重绘窗体标题栏
Private Declare Function DrawMenuBar _
    Lib "user32" ( _
        ByVal Hwnd As Long) _
As Long
'//以下定义常数及变量
Private Const GWL_STYLE = (-16)                         '窗口样式
Private Const WS_CAPTION = &HC00000                  '窗口标题栏
Private Const GWL_EXSTYLE = (-20)                      '窗体拓展样式
Private Const WS_EX_DLGMODALFRAME = &H1&        '窗体边框
Private Hwnd As Long                                    '用于寄存窗体句柄
'//****************************************************************************************************************************************
'//                                               程序
Private Sub UserForm_Initialize()
    Dim Istype As Long
    '//查找本窗口句柄
    Hwnd = FindWindow("ThunderDFrame", Me.Caption)
    '//取得窗口样式位
    Istype = GetWindowLong(Hwnd, GWL_STYLE)
    '//窗体样式位: 原样式无标题
    Istype = Istype And Not WS_CAPTION
    '//重设窗体样式位
    SetWindowLong Hwnd, GWL_STYLE, Istype
    '//取得拓展窗口样式位
    Istype = GetWindowLong(Hwnd, GWL_EXSTYLE)
    '//拓展窗体样式位: 原样式无边框
    Istype = Istype And Not WS_EX_DLGMODALFRAME
    '//重设拓展窗体样式位
    SetWindowLong Hwnd, GWL_EXSTYLE, Istype
    '//重绘窗体标题栏
    DrawMenuBar Hwnd
End Sub
'/--------------------------------------------------------------------------------------------------------------------------------------------------------------------

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-8 11:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
精确设置列宽、行高 单元格适应图片,正方形单元格
http://club.excelhome.net/viewth ... =%D5%FD%B7%BD%D0%CE
[基础应用] 如何设置行高和列宽值得到行高和列宽均为5像素的100个正方格? http://www.exceltip.net/thread-24740-1-1-25594.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-9-2 19:01 | 显示全部楼层
http://club.excelhome.net/forum. ... 327&pid=3689798
选定要保护的工作表,ctrl+A全选所有单元格,ctrl+1打开单元格格式对话框-保护-去掉"锁定"前面的对钩.Alt+11打开VBE窗口,在左上的工程窗口选择要保护的工作表,在右面的代码窗口写代码:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Application.EnableEvents = 0
  3. ActiveSheet.Unprotect Password:="123"
  4. If Target <> "" Then Target.Locked = 1
  5. ActiveSheet.Protect Password:="123"
  6. Application.EnableEvents = 1
  7. End Sub
复制代码
保存.
这个设置的密码是123

TA的精华主题

TA的得分主题

发表于 2011-9-2 22:25 | 显示全部楼层
sum支持工作表三维引用,但不支持引用函数产生的三维引用,必要时需要使用n()函数取得每个维度的左上角值再汇总;
SUBTOTAL()支持引用函数产生的三维引用,但对工作表三维引用却不支持,这点和sum互补.
今天才知道这个区别。

TA的精华主题

TA的得分主题

发表于 2011-10-27 09:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不知道什么时候会用到,先留个脚印

TA的精华主题

TA的得分主题

发表于 2012-1-12 21:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-1-30 14:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-2-2 10:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢楼主的归纳总结!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 09:27 , Processed in 0.046122 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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