Excel VBA参考变量工作表名称

时间:2018-12-18 13:46:22

标签: excel vba excel-vba

我想引用一个工作簿中的多个工作表,然后使用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

1 个答案:

答案 0 :(得分: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利用已经存储的字符串(分配的内存),而不是每次调用该名称时都返回该名称。