Excel VBA Справочник переменных имя листа - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу сослаться на несколько листов в книге, а затем скопировать их в другую книгу с помощью vba.Это все прогресс большого Макро, который я строю.Проблема в том, что я не могу ссылаться на листы цикла for с их именем.Может быть, вы, ребята, можете помочь.Это фрагмент моего кода, все имена указаны в верхней части моего файла (например, sh as worksheet, а wb - bookbook). Что должен делать мой макрос - это проверочные листы, если они должны быть отправлены получателю, и некоторые изэти листы (например, код ниже) объединяются в одну рабочую книгу и затем отправляют эту книгу.Но проблема у меня заключается в том, как удалить / перезаписать определенный лист в целевой книге.(Строка 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 голосов
/ 18 декабря 2018

Поскольку листы по своей сути имеют числовое представление, вы можете переходить между листами одной рабочей книги с помощью цикла, например:

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

Что касается удаления листов, вы можете использовать вышеуказанное, включая:the .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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...