【问题标题】:Delete Excel Sheets With Name Criteria删除带有名称标准的 Excel 表格
【发布时间】:2020-10-25 00:00:57
【问题描述】:

正确的代码是

        Private Sub DeleteTSheets()
        Dim xl As New Excel.Application
        Dim wb As Excel.Workbook
        Dim ws as Excel.Worksheet
        wb = xl.Workbooks.Open("C:\Patches\Main_Final.xlsm")
        For Each ws in wb.sheets
           If InStr(1, ws.Name, "T") Then
              If len(ws.name)=3 then
                   ws.delete()
              End If
           End If
        Next
       wb.Close(Savechanges:=vbTrue)
       End Sub

只有当我从 excel 表中删除所有宏时,代码才会运行!!!

谢谢,问候 莫赫布拉比布

【问题讨论】:

  • 你问了这么多问题(不止1个),“代码不起作用或报错”的答案是:请告诉我们你遇到了什么错误,也许有人可以的帮助。
  • 请删除On Error 行,你可能会真正看到你得到了什么错误。
  • 明确地说,最佳实践支持使用 On Error 并重定向到错误句柄部分。 On Error Resume NextOn Error GoTo 0 很少有用,它们会抑制有用的错误消息。
  • @Luuk ,感谢您的支持,但有时您没有某些错误输出可能是因为逻辑可能没有安排,例如这种情况是因为代码正确但它不动作。
  • @Meho2016:在您的问题中,我确实阅读了“代码不起作用”,现在您声称代码是正确的?

标签: excel vba criteria


【解决方案1】:

在第一个代码中,尝试将If InStr(1, wb.Sheets(i).Name, "T") Then 行替换为

If InStr(1, wb.Sheets(i).Name, "T") > 0 Then

在您开发的代码中,尝试将 If InStr(1, wb.Sheets(i).Name, "T") Then 行替换为

If InStr(1, ws.Name, "T") > 0 Then

请记住,您正在循环使用 ws 而不是 i

【讨论】:

  • 亲爱的,我找到了解决方案,代码是正确的,但只有当我从 excel 表中删除所有宏时它才有效,这是什么意思?我编辑了正确的代码
【解决方案2】:

从根本上说,对于整数循环,使用 For 而不是 Do 循环并在没有 On Error 重定向的情况下处理代码逻辑。此外,由于您的第二个代码实现有效,因此您的主要问题是将 VBA 和 VB.Net 混为一谈。尽管它们共享相同的结构,但这两种语言是根本不同的语言。 VBA 是 MS Office 应用程序的扩展实用程序,而 VB.Net 是具有 .NET 兄弟 C# 的独立通用语言。

因此,您无法在这两种类型之间准确地复制/粘贴代码。 VBA 和 VB.Net 的主要区别在于初始化 COM 对象Excel.Application。 VB.Net(如 C#)需要在 Microsoft.Office.Interop API 中进行采购。

VBA

Dim xl As New Excel.Application

VB.Net(见docs

Imports Microsoft.Office.Interop
...

Dim xl As Excel.Application = New Excel.Application()

C#(参见docs(作为比较)

using Excel = Microsoft.Office.Interop.Excel;
...

var xl = new Excel.Application();

此外,由于 COM (Command Object Model) 不仅限于 Microsoft 工具,而是 Windows 机器上的可用资源,因此其他与 COM 连接的语言(如开源工具)也可以连接到 Excel。请注意,与 VB.Net 和 C# 一样,必须导入相应的 COM 库(PHP 以 .ini 扩展名这样做)。

Python

import win32com.client as COM

xl = COM.Dispatch("Excel.Application")

R

libray(RDOMClient)

xl <- COMCreate("Excel.Application")

PHP

$xl = new COM("Excel.Application", NULL, CP_UTF8) or Die ("Did not instantiate Access");

【讨论】:

  • 亲爱的,我要感谢您的回复,但是我使用了正确的引用,并且代码可以作为 VBA 很好地工作,但不能作为 VB.net,这就是我问的原因,似乎当我运行代码时,文件变成了只读文件,它不会接受任何更改...谢谢
  • Excel 文件使文档恢复并且不允许代码运行...谢谢
  • 以上信息应该已经在最初的问题中注明。这是与问题相关的重要信息。您获得的是“只读”,因为您这样做并“打开”,而不是工作簿的“关闭”。
  • @Luuk,我用了wb.close (savechanges:=vbTrue),但什么也没发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多