Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA参考变量表名称_Excel_Vba - Fatal编程技术网

Excel VBA参考变量表名称

Excel VBA参考变量表名称,excel,vba,Excel,Vba,我想引用工作簿中的多个工作表,然后使用vba将这些工作表复制到另一个工作簿中。这是我构建的更大宏的所有进展。 我遇到的问题是,我无法引用带有名称的for循环表。也许你们能帮上忙。 这是我代码的摘录,所有名称都引用在我文件的顶部,如sh作为工作表,wb作为工作簿 我的宏应该做的是检查工作表是否应该发送给收件人,下面的代码之类的工作表合并到一个工作簿中,然后发送此工作簿。但我的问题是,如何删除/覆盖目标工作簿中的特定工作表。第5行 For Each sh In ThisWorkbook.Worksh

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

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

Dim i as long
For i = 1 to sheets.count
    'do something using Sheets(i)
Next i
关于删除工作表,您可以使用上述选项,包括。删除:

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
我建议在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利用已存储的字符串分配内存,而不是每次调用该名称时都返回到该名称。要找到该名称。

感谢@Cyril提供的detailed.answer。问题是,我不想删除源工作簿中的工作表,而是要删除存储上个月工作表版本的目标工作簿中的工作表。因此,我想将多张工作表从WB A转移到WB B。WB B已经有上个月的工作表和其他一些不能删除的重要工作表。我想做的是用WB A中的新表A B和C覆盖WB B中的表A B和C。因为据我所知没有覆盖的可能性,我必须先删除WB B中的表A B和C,然后从WB A复制。我的计划是按图纸名称引用图纸名称,以删除WB B中的正确图纸,而不是按图纸编号。有没有办法通过引用他们的真实工作表名称来实现这一点?好的,我知道了。你的回答帮助了我!非常感谢@Cyril。我没读你的第一句话。祝你圣诞快乐!
Dim shName as String
shName = ActiveSheet.Name
If Sheets(shName).Range("A1").Value Like "?*@?*.?*" And shName <> "A" Or shName <> "B" Or shName <> "C" Then