循环访问 workbook.close 上的文件时代码停止

2024-07-04

我试图循环遍历 Excel 文件,打开它们,运行一些破解密码的代码,然后关闭工作簿并移至下一个工作簿。

我的代码适用于我的大多数文件。我在处理包含宏的文件时遇到问题。 (这是我能看到的唯一将这些文件与其他文件区分开来的东西。)

我注意到,当我打开问题文件时,我的 wb 变量被设置为空。它仍然打开文件,并且我的代码继续运行,但是当我执行 wb.close 行时,我的代码只是停止。没有错误消息,但它没有完成它所在的循环。

不确定是否有一种方法可以附加一个有效的文件和一个无效的文件,但如果有人可以解释如何执行此操作,我可以。

当我打开一个不会导致此问题的文件时,在本地窗口中展开变量 wb 时,它具有其他属性。在问题文件上,当我展开 wb 变量时,它只是说:没有变量

当我在不使用 VBA 的情况下打开这些文件之一时,我收到一条警告,指出它可能存在安全问题并且宏已被禁用。我认为这就是我的问题所在,但我认为我用以下方式处理这个问题Application.AutomationSecurity = msoAutomationSecurityForceDisable.

我已将代码更新为以下内容,但它没有解决在 wb.close 上停止代码的问题

Do While fileName <> vbNullString

    Set wb = Workbooks.Open(fileName:=directory & fileName, _
                            UpdateLinks:=0, _
                            IgnoreReadOnlyRecommended:=True, _
                            Notify:=False, _
                            CorruptLoad:=xlNormalLoad)
    If Err.Number = 0 And Not wb Is Nothing Then
        On Error GoTo 0
        Call AllInternalPasswords
        wb.Close True
        fileName = Dir()
    Else
        Err.Clear
        On Error GoTo 0
    End If
Loop

Sub TestPasswordLoop()

Dim directory As String, fileName As String, i As Variant, wb As Workbook
Application.DisplayAlerts = False
Application.ScreenUpdating = False

Dim security As MsoAutomationSecurity
security = Application.AutomationSecurity
Application.AutomationSecurity = msoAutomationSecurityForceDisable

directory = "C:\Users\seth\Desktop\Files for Testing\"
fileName = Dir(directory & "*.xl??")

i = 0
Do While fileName <> vbNullString
    On Error Resume Next
    'Set wb = Workbooks.Open(fileName:=directory & fileName)
    Set wb = Workbooks.Open(fileName:=directory & fileName, _
                            UpdateLinks:=0, _
                            IgnoreReadOnlyRecommended:=True, _
                            Notify:=False, _
                            CorruptLoad:=xlNormalLoad)

    Call AllInternalPasswords 'this code is below
    wb.Close True
    i = i + 1
    Application.StatusBar = "Files Completed:  " & i
    fileName = Dir()
Loop

Application.AutomationSecurity = security
Application.StatusBar = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Complete"

End Sub

Public Sub AllInternalPasswords()
    ' Breaks worksheet and workbook structure passwords. Bob McCormick
    '  probably originator of base code algorithm modified for coverage
    '  of workbook structure / windows passwords and for multiple passwords
    '
    ' Norman Harker and JE McGimpsey 27-Dec-2002 (Version 1.1)
    ' Modified 2003-Apr-04 by JEM: All msgs to constants, and
    '   eliminate one Exit Sub (Version 1.1.1)
    ' Reveals hashed passwords NOT original passwords

    Application.DisplayAlerts = False
    'Application.ScreenUpdating = False

    Const DBLSPACE As String = vbNewLine & vbNewLine
    Const AUTHORS As String = DBLSPACE & vbNewLine & _
            "Adapted from Bob McCormick base code by" & _
            "Norman Harker and JE McGimpsey"
    Const HEADER As String = "AllInternalPasswords User Message"
    Const VERSION As String = DBLSPACE & "Version 1.1.1 2003-Apr-04"
    Const REPBACK As String = DBLSPACE & "Please report failure " & _
            "to the microsoft.public.excel.programming newsgroup."
    Const ALLCLEAR As String = DBLSPACE & "The workbook should " & _
            "now be free of all password protection, so make sure you:" & _
            DBLSPACE & "SAVE IT NOW!" & DBLSPACE & "and also" & _
            DBLSPACE & "BACKUP!, BACKUP!!, BACKUP!!!" & _
            DBLSPACE & "Also, remember that the password was " & _
            "put there for a reason. Don't stuff up crucial formulas " & _
            "or data." & DBLSPACE & "Access and use of some data " & _
            "may be an offense. If in doubt, don't."
    Const MSGNOPWORDS1 As String = "There were no passwords on " & _
            "sheets, or workbook structure or windows." & AUTHORS & VERSION
    Const MSGNOPWORDS2 As String = "There was no protection to " & _
            "workbook structure or windows." & DBLSPACE & _
            "Proceeding to unprotect sheets." & AUTHORS & VERSION
    Const MSGTAKETIME As String = "After pressing OK button this " & _
            "will take some time." & DBLSPACE & "Amount of time " & _
            "depends on how many different passwords, the " & _
            "passwords, and your computer's specification." & DBLSPACE & _
            "Just be patient! Make me a coffee!" & AUTHORS & VERSION
    Const MSGPWORDFOUND1 As String = "You had a Worksheet " & _
            "Structure or Windows Password set." & DBLSPACE & _
            "The password found was: " & DBLSPACE & "$$" & DBLSPACE & _
            "Note it down for potential future use in other workbooks by " & _
            "the same person who set this password." & DBLSPACE & _
            "Now to check and clear other passwords." & AUTHORS & VERSION
    Const MSGPWORDFOUND2 As String = "You had a Worksheet " & _
            "password set." & DBLSPACE & "The password found was: " & _
            DBLSPACE & "$$" & DBLSPACE & "Note it down for potential " & _
            "future use in other workbooks by same person who " & _
            "set this password." & DBLSPACE & "Now to check and clear " & _
            "other passwords." & AUTHORS & VERSION
    Const MSGONLYONE As String = "Only structure / windows " & _
             "protected with the password that was just found." & _
             ALLCLEAR & AUTHORS & VERSION & REPBACK
    Dim w1 As Worksheet, w2 As Worksheet
    Dim i As Integer, j As Integer, k As Integer, l As Integer
    Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
    Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
    Dim PWord1 As String
    Dim ShTag As Boolean, WinTag As Boolean

    Application.ScreenUpdating = False
    With ActiveWorkbook
        WinTag = .ProtectStructure Or .ProtectWindows
    End With
    ShTag = False
    For Each w1 In Worksheets
            ShTag = ShTag Or w1.ProtectContents
    Next w1
    If Not ShTag And Not WinTag Then
        'MsgBox MSGNOPWORDS1, vbInformation, HEADER
        Exit Sub
    End If
    'MsgBox MSGTAKETIME, vbInformation, HEADER
    If Not WinTag Then
        'MsgBox MSGNOPWORDS2, vbInformation, HEADER
    Else
      On Error Resume Next
      Do      'dummy do loop
        For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
        For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
        For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
        For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
        With ActiveWorkbook
          .Unprotect Chr(i) & Chr(j) & Chr(k) & _
             Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
             Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
          If .ProtectStructure = False And _
          .ProtectWindows = False Then
              PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
                Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
                Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
              'MsgBox Application.Substitute(MSGPWORDFOUND1, _
                    "$$", PWord1), vbInformation, HEADER
              Exit Do  'Bypass all for...nexts
          End If
        End With
        Next: Next: Next: Next: Next: Next
        Next: Next: Next: Next: Next: Next
      Loop Until True
      On Error GoTo 0
    End If
    If WinTag And Not ShTag Then
      'MsgBox MSGONLYONE, vbInformation, HEADER
      Exit Sub
    End If
    On Error Resume Next
    For Each w1 In Worksheets
      'Attempt clearance with PWord1
      w1.Unprotect PWord1
    Next w1
    On Error GoTo 0
    ShTag = False
    For Each w1 In Worksheets
      'Checks for all clear ShTag triggered to 1 if not.
      ShTag = ShTag Or w1.ProtectContents
    Next w1
    If ShTag Then
        For Each w1 In Worksheets
          With w1
            If .ProtectContents Then
              On Error Resume Next
              Do      'Dummy do loop
                For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
                For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
                For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
                For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
                .Unprotect Chr(i) & Chr(j) & Chr(k) & _
                  Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
                  Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                If Not .ProtectContents Then
                  PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
                    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
                    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                  'MsgBox Application.Substitute(MSGPWORDFOUND2, _
                        "$$", PWord1), vbInformation, HEADER
                  'leverage finding Pword by trying on other sheets
                  For Each w2 In Worksheets
                    w2.Unprotect PWord1
                  Next w2
                  Exit Do  'Bypass all for...nexts
                End If
                Next: Next: Next: Next: Next: Next
                Next: Next: Next: Next: Next: Next
              Loop Until True
              On Error GoTo 0
            End If
          End With
        Next w1
    End If
    'MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK, vbInformation, HEADER

    'Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

对于错误检查:

在保存之前尝试先保存工作簿

Application.DisplayAlerts  = False
     wb.Save
     wb.Close True
Application.DisplayAlerts  = True

对于错误检查:

尝试将错误捕获设置为“出现所有错误时中断”。 (在 VBA 编辑器中:工具 > 选项 > 常规 > 出现所有错误时中断)

您的“错误继续下一步”隐藏了错误

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

循环访问 workbook.close 上的文件时代码停止 的相关文章

  • 使用 Excel 创建组合

    我想知道Excel中是否有一个函数或函数组合 可能需要VBA 可以帮助我解决以下问题 团里有8个人 我需要找出并显示从 8 个人中选择 4 个人时创建的所有可能的非重复组合 所选个人的顺序并不重要 我只需要找到所有独特的组合 例如 这 8
  • 提取PDF文档的特定部分[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有多个 30 个 PDF 文件 每个包含 48 96 页 所有页面的布局都是相同的 只有其他内容 数字 图表 背景 这些页面是光纤电缆测
  • 选择单元格中的所有形状

    我需要选择给定单元格中的所有形状 我写了这段代码 但它生成错误 Dim sh as shape For Each sh In ActiveSheet Shapes If Not Intersect Range B2 sh TopLeftCe
  • Excel 读取错误:标头签名无效。如何解决?

    我正在从浏览器上传一个 Excel 文件 我正在使用 POI jar 但出现错误 标头签名无效 读取 3255307777713450285 预期为 2226271756974174256 下面是我使用过的两个jsp文件 JSP 1
  • 使用 FileDialog 打开工作簿并在 Excel VBA 中对其进行操作

    我正在学习如何使用 Excel 宏 我发现了这段代码 Dim fd As Office FileDialog Set fd Application FileDialog msoFileDialogFilePicker With fd All
  • 从 Outlook 中提取电子邮件地址

    我正在尝试提取 Outlook 收件箱中所有电子邮件的电子邮件地址 我在互联网上找到了这段代码 Sub GetALLEmailAddresses Dim objFolder As MAPIFolder Dim strEmail As Str
  • 在ruby中执行外部程序并等待其执行

    如何从 ruby 启动外部程序 如 Excel 工作表 并等待其执行 继续之前终止 我知道我可以用以下命令开始 Excel 工作表 system start excel my path to the sheet 但使用它只会启动工作表 然后
  • Python 程序员资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SendKeys 通过 Access 表单中的 VBA 代码弄乱了我的 NumLock 键

    I have the following code for an Access form It appears as if the SendKeys is messing with my NumLock key by toggling it
  • VS 2017 文档级加载项构建因 com 可见组件而失败

    我安装了 VS 2013 并添加了 2017 RC 我使用 C 进行了一些自定义 制作了一个文档级修改后的 Excel 解决方案 效果很好 然后我在电子表格中添加了一些 VBA 代码 并在下面添加了一个 com visible 类 如果我尝
  • 如何跨项目重用核心 VBA 函数 (UDF),但不在单元格插入函数中显示它们

    我有一个带有 核心 功能和子功能的插件 我想在不同的插件或 VBA 项目中引用和使用它们 因为代码复用和单一更新原则 例如 一个函数 根据条件过滤集合成员并返回子集合 代码本身不是这里的问题 Public Function listName
  • 使用 Excel VBA 宏查找并替换 Word 中的页脚文本

    我正在尝试做一个macro in Excel这会打开一个Word文档 找到一个指定的文本 它在里面footer在 Word 文档中 并将其替换为文本 目前 我的宏打开了单词文档 但我不知道如何进入页脚并找到这些文本 Dim objWord
  • 完成某些字段后,使字段在 MS Access 表单中可见

    我正在 MS Access 中构建一个表单供用户输入数据 但可能的字段太多 大多数时候只有大约一半的字段会被使用 因此 我希望仅根据用户在先前给定字段中输入的内容来显示某些字段 例如 用户输入项目编号 标题 然后检查 是 否 工程 由于他检
  • Excel VBA - 选择不按顺序排列的多列

    我想选择multiple列 例如 我想要select column a b d e g h 我试过了 Columns A B D E G H select I get error信息 Type mismatch Range A B D E
  • 如何在microsoft access中动态加载、访问和卸载子表单

    我正在尝试从 ASP NET 过渡到 Access 中的编程 并且当我想到 Access 中的子表单时 我习惯于从用户控件的角度进行思考 我想做的是允许用户单击按钮来加载包含用户可以输入附加数据的控件的子表单 如果有任何信息或资源能够帮助我
  • 从流中读取 Excel 文件

    我需要一种从流中读取 Excel 文件的方法 它似乎不适用于 ADO NET 的处理方式 该场景是用户通过 FileUpload 上传文件 我需要从文件中读取一些值并导入到数据库中 由于几个原因我can t将文件保存到磁盘 也没有理由这样做
  • 我想要函数从 xy 转换为单元格

    如何从函数返回结果 例如 vba 我想要函数 Function xy2cell i f xy2cell End Function Sub aaa main ActiveSheet Cells Clear f 5 4 x 2 4 y 1 Fo
  • 从Excel单元格调用Excel工作表函数

    我有一组用户定义的 vba 函数 位于 Excel 模块中 然后从 Excel 电子表格中调用这些函数 此时一切都工作正常 我被要求将 vba 从模块移动到工作表的代码页 当我这样做时 我发现我无法从工作表上的单元格调用任何函数 名称根本不
  • 使用 Powershell 添加新列并填充工作表名称

    我正在尝试操作下面的代码以在输出中创建一个新列并在新列中分配工作表名称 param Path C TEMP Template TemplateName xlsx StartRow 5 HeaderName Property Current
  • 以编程方式另存为 PowerPoint 2003 中的 PowerPoint 2007 (pptx)

    我需要能够将 PowerPoint 2003 中的演示文稿 以编程方式 保存为 OpenXML pptx 我安装了 Microsoft Office 兼容包 这确实允许我从 PowerPoint 2003 执行 另存为 PowerPoint

随机推荐

  • 在标头中转发声明 constexpr 函数[重复]

    这个问题在这里已经有答案了 假设我有以下文件 这是无效的 C 链接器阻塞 所以是的 还是我的语法错误 constexpr 函数的前向声明必须与其定义位于同一文件中吗 header h extern constexpr int fun int
  • 如何保护日志免受应用程序崩溃的影响?

    我创建了一个简单的记录器 它将所有重要的内容记录到一个文本文件中 我在用着std ofstream但有一个问题 当程序没有关闭文件时 调用std ofstream close 无论出于何种原因 例如崩溃 创建的日志实际上是空的 0大小 由于
  • $.getJSON 和 PHP 文件

    是否可以隐藏 php 文件的名称 document ready function getJSON getdata php function returned data if returned data 1 div wall html use
  • Uncrustify 选项可在空白行上留下空格

    我正在尝试找到在空白行上留下空格的选项 目前 uncrustify 将去除所有尾随空格 很好 但是如果空格位于空行上 我想保留空格 因为它通常达到缩进级别 这是一个空行吗nl 选项或缩进indent 选项 我找不到一个可以做我想做的事情 甚
  • Android 库的移动分析[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在研究 android 库 想知道哪种分析解决方案最适合此目的 我想监控 使用我的库安装 删除独特的应用程序 内存消耗 在我的库中执行某些特
  • 父级退出时的 Python 多处理队列

    我的问题的要点是 当父进程 在这种情况下是守护进程 被杀死时 多处理队列会发生什么 我有一个在后台运行的守护进程 它为子进程排队作业 class manager Daemon def run self someQueue MP Queue
  • 在 Android 中跟踪屏幕时间

    对于一个大学项目 我必须跟踪 Android 智能手机的屏幕时间 很难找到合适的搜索结果 因为我的搜索引擎只会推荐已经为您执行此操作的应用程序 我对这些应用程序如何做到这一点感兴趣 我假设 android 上有一个原生 API 可以支持您
  • 如何将标签放置在拆分包装气泡图上的系列旁边?

    Issue 我正在尝试使用 Highcharts 消除图例分裂填充气泡 https jsfiddle net gh get library pure highcharts highcharts tree master samples hig
  • UISegmentedControl自定义背景图片

    我将 UINavigationBar 设置为图像 一些木质纹理 我想在该栏上插入带有 4 个按钮的 UISegmentedControl 按钮应具有相同的纹理 但色调略有变化 一种解决方案是更改按钮背景颜色的色调 alpha 以便背景中的纹
  • 创建补丁来升级 .NET 应用程序

    我想为我的 NET 应用程序创建一个补丁 要求是 找到安装目录 用新文件覆盖旧文件 重新启动 Windows 服务 我想将更新程序发送给用户 以便他们只需运行它并更新应用程序 我的原始安装程序是使用 Visual Studio 部署项目创建
  • 出现“未捕获类型错误:无法读取未定义”错误的属性“地理代码”

    当我运行以下代码时 我从中获取了this https stackoverflow com questions 6797569 get city name using geolocation answertab active tab top回
  • 使用 jQuery 的数据存储与 Expando 属性

    我正在使用 jQuery 开发代码 并且需要存储与某些 DOM 元素关联的数据 还有很多其他问题how使用 html 元素存储任意数据 但我更感兴趣的是为什么我会选择一个选项而不是另一个选项 假设 为了极其简化的论证 我想在 有趣 的表中的
  • 适用于非常大的图的 A* 算法,对缓存快捷方式有什么想法吗?

    我正在 OpenStreetMap 地图上编写快递 物流模拟 并意识到如下图所示的基本 A 算法对于大型地图 如大伦敦 来说速度不够快 绿色节点对应于开放集 优先队列中的节点 由于数量巨大 整个地图大约有 1 200 万个 因此需要 5 秒
  • 如何从 macOS Catalina build 10.15.4 运行 java?

    我刚刚将 macOS Catalina 从 10 15 3 升级到 10 15 4 并且无法再在 IntelliJ 中运行 java 我设法通过应用警告从终端让它工作brew brew reinstall java gt Reinstall
  • 创建一个可以通过赋值初始化但不可复制的类型

    我希望创建一个类型 可以使用另一个类型的赋值来初始化该类型 但不能复制 这个想法类似于作用域智能指针 因为我希望这种类型的对象在其生命周期内拥有资源 但我也希望能够使用赋值语法 简而言之 这就是我想要的 T x new U allowed
  • 如何检查一个数组是否包含另一个数组的值?

    我想检查一个数组是否包含另一个数组中的值 例如 我想检查数组 A 是否包含数组 B 中的值 我正在寻找任何值而不是一个特定值 如果您想查看两个数组之间是否存在重叠 可以这样做 fun Array lt gt intersects other
  • 无法在 32 位 JVM 上加载 64 位 SWT 库(替换 SWT 文件)

    我正在尝试调试这个问题 但不确定我到底需要在哪里替换 SWT jarEclipse 的文件 当前系统配置 Eclipse Helios 3 6 32 Bit JDK 1 6 JVM 32 Bit Windows 7 64 Bit 错误信息
  • jQuery 如何反序列化 JSON?

    我正在使用 jQuery ajax 从 ASP NET MVC 服务检索 JSON 数据 当服务器遇到异常时 我将 400 Bad Request 状态发送回客户端 并将异常作为 JsonResult 发送 Response StatusC
  • JDK 17 spring boot 无法创建私有 java.time.LocalDateTime

    我在简单的 mongodb 实体中有私有 LocalDateTime lastModifiedDate 属性 使用最新的 2 5 5 和 openjdk 17 运行应用程序 Following exeptions I have with d
  • 循环访问 workbook.close 上的文件时代码停止

    我试图循环遍历 Excel 文件 打开它们 运行一些破解密码的代码 然后关闭工作簿并移至下一个工作簿 我的代码适用于我的大多数文件 我在处理包含宏的文件时遇到问题 这是我能看到的唯一将这些文件与其他文件区分开来的东西 我注意到 当我打开问题