VBA-获取所有文件属性

2024-02-21

我想获取文件夹中所有文件的属性。我已经将其用于固定数量的属性,我唯一关心的是找到最后一个属性的索引,用于GetDetailsOf方法,以便我可以列出所有属性。

下面的函数返回属性计数,但不正确,因为它基于最后一个非空属性名称。然而,有一些索引的名称为空(不确定它们是否可以有值),后面跟着另一个索引,其属性名称具有普通字符串。

我也尝试过On Error Resume Next错误表明最后一个索引已被使用,但从未出现错误,并且显然导致了无限循环GetDetailsOf将接受每个 long >=0。

我还想知道一台计算机上每个文件夹的文件属性数量是否相同。

编辑:我可能没有清楚地表达它,我想要的是获取最后一个属性名称的索引,以便我可以检查所有现有属性的值。

编辑2:这是我的文件的链接,列出了所选文件夹和所有级别的子文件夹中所有文件的属性。可能存在一些未处理的错误(我已经用快捷方式对导致宏崩溃的错误进行了排序),我想到了 Windows 路径长度限制,但它通常适用于选定的文件夹。

感兴趣的主要函数是 list_properties 模块中的 CountProperties。它决定将返回多少属性列。

https://drive.google.com/open?id=1TRIZJoGnHXs9LJtxDBj9rp27ngkects- https://drive.google.com/open?id=1TRIZJoGnHXs9LJtxDBj9rp27ngkects-

Function CountProperties(ByRef FldPath) As Long

Dim objShell As Object
Dim objFolder As Object
Dim testStr As String
Dim propertyCnt As Long

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Left(FldPath, Len(FldPath) - 1)) 'no slash in the end

Do
    testStr = vbNullString      
    testStr = objFolder.GetDetailsOf(objFolder.Items, propertyCnt)      
    If testStr = vbNullString Then Exit Do
    propertyCnt = propertyCnt + 1
Loop

CountProperties = propertyCnt

End Function

我不完全清楚其最终目标是什么,但以下内容应该提取您需要的所有信息。

包括:按文件列出的设置属性总数、设置属性的文件夹计数、每个文件的扩展属性值以及文件夹中的所有文件是否具有相同数量的已分配属性值。我可能会重新考虑该功能,但等待您的反馈。

Note:

我选择返回一个数组,因为我认为您可能最终会比较文件夹,这样您就可以使用文件夹路径作为键简单地创建返回数组的集合/字典。然后,您可以跨文件夹访问和比较数组中的项目。

Code:

Option Explicit

''******************************************************************
'' folderInfo returns:
'' folderInfo(0) = PATH_FOLDER - folder path used
'' folderInfo(1) = AllFileProperties - Dictionary of arrays containing all the file properties of each file within the folder
'' folderInfo(2) = totalPropertiesSetInFolder - total count of extended properties <> vbNullString in the folder
'' folderInfo(3) = filePropertyCounts - dictionary of each file with its respective set property count
'' folderInfo(4) = AllFilesHaveSamePropertyCount - Boolean to say if all files in folder have same # extended properties set

''******************************************************************
Public Sub test()

    Const PATH_FOLDER As String = "C:\Users\User\Desktop\TestFolder\"
    Dim resultsArray()
    resultsArray() = folderInfo(PATH_FOLDER) '<== All the info is now returned here

''***************************************************************************************
       '' Examples of extracting the retrieved information from the array

''***************************************************************************************    

    'Example: folderInfo(0) = folderPath
    Debug.Print "Folderpath = " & resultsArray(0)
    Debug.Print String$(20, Chr$(60))
    Debug.Print vbNewLine

''***************************************************************************************

    'Example: folderInfo(1) = AllFileProperties
    Debug.Print "AllFileProperties:"
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    Set dict = resultsArray(1)

    Dim key As Variant, arr(), i As Long

    For Each key In dict.keys
        Debug.Print "FileName = " & key
        arr() = dict(key)
        For i = LBound(arr, 1) To UBound(arr, 1)
            Debug.Print arr(i, 1), arr(i, 2)
        Next i

        Debug.Print String$(20, Chr$(60))
        Debug.Print vbNewLine
    Next key

''***************************************************************************************

    ''Example: folderInfo(2) = totalPropertiesSetInFolder
    MsgBox "Total properties set in folder = " & resultsArray(2)


''***************************************************************************************

    ''Example: folderInfo(3) = filePropertyCounts
    Dim dict2 As Object
    Set dict2 = CreateObject("Scripting.Dictionary")
    Set dict2 = resultsArray(3)

    Dim key2 As Variant

    For Each key2 In dict2.keys
        Debug.Print key2 & " set property count = " & dict2(key2)
    Next key2

''***************************************************************************************
    ''Example: folderInfo(4) = AllFilesHaveSamePropertyCount
    MsgBox "All files have the same # of set properties? = " & resultsArray(4)

End Sub

Public Function folderInfo(ByVal PATH_FOLDER As String) As Variant

    Dim objShell As Object
    Dim objFolder As Object

    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(Left$(PATH_FOLDER, Len(PATH_FOLDER) - 1))

    'Retrieving Extended File Properties
    Dim i As Long
    Dim arrHeaders(35)

    For i = 0 To 34
        arrHeaders(i) = objFolder.GetDetailsOf(objFolder.items, i)
    Next

    Dim fileName As Object, setPropertyCount As Long, filePropertyCounts As Object, totalPropertiesSetInFolder As Long
    Set filePropertyCounts = CreateObject("Scripting.Dictionary")
    Dim AllFileProperties As Object
    Set AllFileProperties = CreateObject("Scripting.Dictionary")

    For Each fileName In objFolder.items
        setPropertyCount = 0
        Dim fileProperties(0 To 35, 0 To 35)
        fileProperties(0, 0) = fileName
        For i = 0 To 34
            If objFolder.GetDetailsOf(fileName, i) <> vbNullString Then setPropertyCount = setPropertyCount + 1
             fileProperties(i + 1, 1) = arrHeaders(i)
             fileProperties(i + 1, 2) = objFolder.GetDetailsOf(fileName, i)

            '            Debug.Print i & vbTab & arrHeaders(i) _
            '                      & ": " & objFolder.GetDetailsOf(fileName, i)
            '            Debug.Print vbNewLine
        Next i
        'Debug.Print fileName & ": setpropertyCount = " & setPropertyCount
        filePropertyCounts.Add fileName.Name, setPropertyCount

        AllFileProperties.Add fileName.Name, fileProperties
    Next fileName

    totalPropertiesSetInFolder = Application.WorksheetFunction.Sum(filePropertyCounts.items)

    folderInfo = Array(PATH_FOLDER, AllFileProperties, totalPropertiesSetInFolder, filePropertyCounts, AllFilesHaveSamePropertyCount(filePropertyCounts))

End Function

Public Function AllFilesHaveSamePropertyCount(ByVal filePropertyCounts As Object) As Boolean

    AllFilesHaveSamePropertyCount = True
    Dim key As Variant

    For Each key In filePropertyCounts.Keys
        If filePropertyCounts(key) <> Application.WorksheetFunction.Max(filePropertyCounts.items) Then
            AllFilesHaveSamePropertyCount = False
            Exit Function
        End If
    Next key

End Function

运行示例:

参考:

https://technet.microsoft.com/en-us/library/ee176615.aspx https://technet.microsoft.com/en-us/library/ee176615.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBA-获取所有文件属性 的相关文章

  • 非相邻单元格作为数组函数的输入(MIN 和 ISBLANK)

    提出了这个问题 由于具体问题的答案是一个拼写错误 因此被删除 https stackoverflow com questions 59289065 excel non adjecent cells as input to array fun
  • 将所有工作簿工作表复制到新工作簿 VBA

    我正在使用此代码将工作簿中的每张工作表复制到新工作簿中 它工作正常 但它颠倒了工作表的顺序 是否有办法阻止它这样做 Sub copy copies all the sheets of the open workbook to a new o
  • 拆分具有多行文本和单行文本的行

    我试图弄清楚如何拆分数据行 其中行中的 B C D 列包含多行 而其他列不包含多行 我已经弄清楚如何拆分多行单元格 如果我将这些列复制到新工作表中 手动插入行 然后运行下面的宏 仅适用于 A 列 但我在编码时迷失了休息 Here s wha
  • 需要在Excel中合并3列

    我有 3 列 A B C 我需要合并这 3 列 并且我已经应用了 forumala A1 B1 C1输出为 E 列 我需要输出为 D 列 下面的公式将达到您想要的结果 TEXTJOIN TRUE A1 C1 Textjoin 的工作方式类似
  • 具有多个条件(全部等于相同值)的 IF 语句的替代方案

    还有比这更好的方法吗 假设所有变量都为零 If var1 0 Or var2 0 Or var3 0 Or var4 0 Or var5 0 Or var6 0 Then do something End If 你可以用Select Cas
  • 强力查询历年产品利润对比

    我有一个数据集 其中包含公司 产品 利润和年份 公司每年都会销售少量产品并获得利润 公司没有必要在明年销售相同的产品 他们可能会省略以前的产品并添加新的少量产品 我只想对两年的产品进行逐个比较 如下所示 我的数据集是 Company Pro
  • 如何计算 COUNTIF 但仅计算唯一值?

    我有一个数据集 其中有一列包含参考文献 参考文献始终遵循相同的格式 1 XXX YYY XXX 始终为 3 个字母 YYY 始终是一个数字 每个XXX都会有YYY 001 如果同一个XXX有多个类型 就会有YYY 002 以此类推 我想知道
  • 如何将 HTML 表格导出为 .xlsx 文件

    我有一个关于导出的问题HTML表格 as an xlsx文件 我做了一些工作 现在我可以将其导出为xls 但我需要将其导出为xlsx 这是我的 jsFiddle https jsfiddle net 272406sv 1 https jsf
  • 通过 PHP 检测 excel .xlsx 文件 mimetype

    我无法通过 PHP 检测 xlsx Excel 文件的 mimetype 因为它是 zip 存档 文件实用程序 file file xlsx file xlsx Zip archive data at least v2 0 to extra
  • 如何处理 Workbook.SaveAs 覆盖确认上的“否”或“取消”?

    我希望在 VBA 脚本开始修改内容之前提示用户保存工作簿 当 另存为 对话框出现时 如果用户单击 取消 我会引发自定义错误并停止脚本 如果他们单击 保存 并且文件名已存在 我希望询问他们是否覆盖 这是我的代码 Function SaveCu
  • 在 VBA 中使用 getElementsByClassName

    我正在使用此代码从页面获取产品名称 页面代码是 div class product shop col sm 7 div class product name h1 Claro Glass 1 5 L Rectangular Air Tigh
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • Excel VBA 导出到文本文件。需要删除空行

    我有一个工作簿 使用以下脚本将其导出到文本文件 它工作正常 但是当我打开文本文件时 末尾总是有一个空行 这导致我在生成此文本文件后运行的另一个脚本出现问题 有关如何从导出中删除空行的任何帮助 Code Sub Rectangle1 Clic
  • 如何在不滚动的情况下截取整个电子邮件正文?

    我正在使用 OL2010 想要制作整个电子邮件的屏幕截图 不仅仅是 屏幕 可以用VBA或者外部程序来完成吗 有一个类似的问题 https stackoverflow com questions 4176340关于如何使用 C 实现这一点 注
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • OpenArgs 为空问题

    我正在使用OpenArgs使用时发送值的参数DoCmd OpenForm DoCmd OpenForm frmSetOther acNormal acFormAdd acDialog value 然后我用Me OpenArgs在打开的表格内
  • 字典、集合和数组的比较

    我正在尝试找出字典与集合和数组相比的相对优点和功能 我发现了一篇很棒的文章here http www experts exchange com articles 3391 Using the Dictionary Class in VBA
  • VBA根据单元格的值是否为零显示/隐藏行

    我有一个 Excel 工作表 我想根据另一个单元格中的值隐藏或取消隐藏某些行 简而言之 整个事情应该取决于单元格中的值C2 D2 E2 If C2 is blank我想rows 31 to 40被隐藏 如果是的话不为空 他们需要是visib
  • Confluence:使用 VBA 更新现有页面

    我尝试使用 VBA 更新 Confluence 页面 我的想法是使用REST API加载页面内容 修改内容然后上传修改后的版本 这是我的代码 Private Sub TestRESTApi Dim uname As String uname
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla

随机推荐

  • Rails 控制器中的“env”和“request.env”有什么区别?

    我在用着rspec为我的应用程序编写测试 为了授权我发送token在标题中 request headers token 000000099 get index 在控制器端我可以通过以下方式读取这个值request env HTTP TOKE
  • 绘制带圆角的 LinearLayout

    我正在尝试实现一个用圆角绘制自身的 LinearLayout 子类 根据我的研究 我设定setWillNotDraw false 并被覆盖onDraw 在画布上绘制圆角矩形 Override protected void onDraw Ca
  • 为什么用let描述的变量可以在函数内部访问?

    在下面的代码片段中 i是在函数f之后声明的 那么函数f如何访问i的值呢 let f if true f gt console log i let i 1 f i 在函数 f 之后声明 嗯 是的 但在相同的范围 块 内 i被声明在同一个blo
  • Mysql 错误 1241 (21000): 操作数应包含 1 列

    我有具有编号范围的客户组 从客户编号到客户编号 select g id select count sum sales FROM transactions t1 where t1 customernumber between g from c
  • 'c' 参数看起来像单个数字 RGB 或 RGBA 序列

    我的 jupyter 笔记本中出现以下错误 我已经将 matplotlib 更新到最新版本 但仍然出现错误 c 参数看起来像单个数字 RGB 或 RGBA 序列 其中 应避免 因为值映射将优先 长度与 x 和 y 匹配 请使用带有单个 如果
  • 如何在 Pubnub 中重新连接?

    我正在使用 PubNub 在我的 Js 代码中传输通知 一旦互联网断开并恢复 我无法弄清楚如何在 PubNub 中重新连接 恢复 在我的初始化和执行中为真 this listeners message msgEvent gt console
  • 由于 OSError 无法安装软件包:[WinError 2] 没有这样的文件或目录

    我尝试使用 pip 安装 numpy 但收到以下错误消息 Python 由于 OSError 无法安装软件包 Errno 2 没有这样的文件或目录 c python39 Scripts f2py exe gt c python39 Scri
  • 将 css 中生成的圆圈并排放置,而不使用 markdown 文件中的表格

    我正在使用 css 画一些圆圈 我是这样做的 circle background f00 width 200px height 200px border radius 50 这是我在 Markdown 文件中使用它的方法
  • 来源:“函数应用程序的优先级高于中缀运算符”[Haskell]

    我正在学习 Haskell 中的运算符优先级 网络上的几个地方都提到函数应用程序有higher优先于运算符 但我找不到明确的来源 这是来自的一个这样的提及Haskell 简要介绍 https www haskell org tutorial
  • 当我在列表中使用复选框时,未调用 ListItem onClick 方法

    大家好 我是 android 新手 我想显示复选框的动态列表 并且在单击多个复选框时我希望将它们的数据放在单个字符串中 但我的问题是我无法调用 onListItemClick 方法 如果我在列表中使用复选框 然而 根据我的理解和经验 在列表
  • LUIS 与特殊字符相关的问题

    TEXT 被转换为 TEXT 在 LUIS 中 当我们识别实体名称时 特殊字符的问题 请参考下图 这里是每月的智商仪表板hospitalists被转换为reportname gt monthly iq dashboard hospitali
  • 测试重定向 CakePHP 2.0

    我一直在看食谱上的一些例子 但我不明白 http book cakephp org 2 0 en development testing html a more complex example http book cakephp org 2
  • flutter-desktop-embedding 如何构建 exe 文件

    in 颤动桌面嵌入 https github com google flutter desktop embedding 我是windows环境 可以运行 但是不知道如何构建exe文件 我想知道该怎么办 If you flutter buil
  • 对 JSONP 请求的工作原理感到困惑

    我无法理解 jsonp 请求如何工作的细节 我已经阅读了包括 jsonp 上的 wiki 在内的多个资料来源 但对于在进行 jsonp 调用时回调实际上如何获取从服务器返回的函数仍然非常困惑 例如 在wiki中 请求的来源设置为 src h
  • 在不使用 GIT 的情况下将 WAR 文件部署到 Openshift?

    我想将 WAR 文件上传到我的开放式换档帐户 但这迫使我 使用 GIT 或 GITHUB here https www openshift com kb kb e1088 how to deploy pre compiled java ap
  • 从服务器获取数据时 Android 中的列表视图

    我正在尝试将数据异步填充到列表视图中 我正在从服务器检索数据作为 JSON 响应 MainActivity java public class MainActivity extends Activity url to make reques
  • Availability.h 类宏

    是否可以有一个自定义可用性宏 例如 OSX AVAILABLE STARTING 我需要它以同样的方式执行 我只需要更改它的名称以及参数的版本和数量 是的 当然了 Objective C 是 C 的严格超集 因此 C 宏非常适合您使用 并且
  • 如何预测 merMod 对象(lme4)的术语?

    对于简单的glm对象 我可以使用predict fit type terms 检索包含每个项的拟合值的矩阵 相当于什么lmer resp glmer适配型号 据我所知 predict merMod功能不支持type terms 相当于什么l
  • 如何为 Outlook 创建“Internet 日历订阅”?

    目前 用户添加了一个 新的互联网日历 但它是 ICS 文件的一次性下载 我希望用户单击一个按钮即可将其个人日历添加为 Outlook 订阅 我想要自动更新 互联网日历订阅 http office microsoft com en us ou
  • VBA-获取所有文件属性

    我想获取文件夹中所有文件的属性 我已经将其用于固定数量的属性 我唯一关心的是找到最后一个属性的索引 用于GetDetailsOf方法 以便我可以列出所有属性 下面的函数返回属性计数 但不正确 因为它基于最后一个非空属性名称 然而 有一些索引