【问题标题】:Excel VBA Reference variable sheet nameExcel VBA 参考变量工作表名称
【发布时间】:2018-12-18 13:46:21
【问题描述】:

我想引用一个工作簿中的多个工作表,然后使用 vba 将它们复制到另一个工作簿。这是我构建的更大宏的所有进展。 我遇到的问题是,我不能用他们的名字引用 for 循环的工作表。可能你们能帮上忙。 这是我的代码的摘录,所有名称都在我的文件顶部引用(如 sh 作为工作表,wb 作为工作簿) 我的宏应该做的是检查工作表是否应该发送给收件人,其中一些工作表(如下面的代码)合并到一个工作簿中,然后发送这个工作簿。但我遇到的问题是,如何删除/覆盖目标工作簿中的特定工作表。 (第 5 行)

For Each sh In ThisWorkbook.Worksheets
    If sh.Range("A1").Value Like "?*@?*.?*" And sh.Name <> "A" Or sh.Name <> "B" Or sh.Name <> "C" Then
         Workbooks.Open Filename:= _
         "Path" & "Name" & ".xlsx", UpdateLinks:=0
        Sheets(chr(34)&sh.name&chr(34)).Delete
        Set wb = ActiveWorkbook
        sh.Copy Before:=wb.Worksheets(1)
        Set wb = ActiveWorkbook
        sh.Copy Before:=wb.Worksheets(1)
        Set sc = wb.Worksheets(chr(34)&sh.name&chr(34))
        With sc.UsedRange
        .Value = .Value
        Rows("244:310").Select
        Selection.EntireRow.Hidden = True
        ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1
        Cells("B1").Select
        ActiveWindow.ScrollRow = 1
        End With

        Filename = "Name"

        Set wb = ActiveWorkbook
        Set OutMail = OutApp.CreateItem(0)
        Set OMail = OutApp.CreateItem(0)

        With wb
            .SaveAs FilePath & Filename & FileExtStr, FileFormat:=FileFormatNum
            On Error Resume Next
            With OMail
            .Display
            End With
                signature = OMail.HTMLbody
            With OMail
                .to = sh.Range("A1").Value
                .CC = sh.Range("A3").Value
                .BCC = ""
                .Subject = Text             
                .Attachments.Add.wb.FullName                                       

            End With

            On Error GoTo 0

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    由于工作表本身具有数字表示,因此您可以通过循环在单个工作簿的工作表之间切换,例如:

    Dim i as long
    For i = 1 to sheets.count
        'do something using Sheets(i)
    Next i
    

    关于一张表的删除,你可以使用上面包含的.delete:

    Dim i as long
    For i = 1 to sheets.count
        If Sheets(i).Range("A1").Value Like "?*@?*.?*" And Sheets(i).Name <> "A" Or Sheets(i).Name <> "B" Or Sheets(i).Name <> "C" Then  Sheets(i).Delete  'note that this is in-line
    Next i
    

    此外,如果您不想使用循环,或者只是想查看当前工作表,则可以使用以下内容进行删除:

    ActiveSheet.Delete
    

    我建议在 if 语句中使用之前将工作表名称记录为字符串,纯粹是为了速度/效率(对于少量代码可能不明显,但体面的做法),类似于:

    Dim shName as String
    shName = ActiveSheet.Name
    If Sheets(shName).Range("A1").Value Like "?*@?*.?*" And shName <> "A" Or shName <> "B" Or shName <> "C" Then
    

    这应该允许 VBA 使用已经存储的字符串(分配的内存),而不是每次调用 .name 以找到该名称。

    【讨论】:

    • 感谢@Cyril 提供detailled.answer。问题是,我不想删除源工作簿中的工作表,而是删除存储上个月版本工作表的目标工作簿中的工作表。所以我想将多张纸从 WB A 转移到 WB B。WB B 已经有上个月的纸和其他一些不能删除的重要纸。我想要做的是用来自 WB A 的新工作表 A B 和 C 覆盖工作表 A B 和工作表 C。由于没有覆盖的可能性(据我所知),我必须删除工作表 A B 和工作表 C 在 WB首先是 B,然后从 WB A 复制。
    • 我的计划是通过它们的名称引用工作表名称,以删除 WB B 中的正确工作表,而不是通过它们的工作表编号。有没有办法通过引用他们的真实工作表名称来完成这项工作?
    • 好的,我明白了。你的回答帮助了我!非常感谢@Cyril。没有真正阅读你的第一句话。圣诞快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多