2011-07-23 13 views
5

Próbuję napisać małą funkcję, która pobiera ścieżkę do pliku (gdzie zapisano skoroszyt), ścieżkę docelową (do której zostanie zapisany plik pdf) i ciąg nazw tabulatorów (rozdzielane potokami (|)) w programie excel.VBA Zapoznaj się z arkuszem roboczym a arkuszem wykresu

Użytkownik tej funkcji nie musi wpisywać ciągu nazw tabulatorów (jest to opcjonalne), a jeśli nie, chcę zaznaczyć wszystkie widoczne zakładki i je wydrukować. To byłoby w przypadku, gdy użytkownik ma 50 wykresów w osobnych arkuszach i nie chce pisać ciąg jak „Chart1 | Chart2 | ....”

Kod:

For Each WSO.Name In WBO.Worksheets 
    strSheets = strSheets & WSO.Name & "|" 
Next WSO 

strSheets = Left(strSheets, Len(strSheets) - 1) 
arraySheets() = Split(strSheets, "|") 

WBO.Sheets(arraySheets()).Select  
WBO.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _ 
    strFilePath, Quality:=xlQualityStandard, _ 
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _ 
    True 

Są dwa problemy z pętlą For Each: nie przechwytuje żadnych arkuszy, takich jak "Chart1", pobiera tylko arkusze takie jak "Sheet1". Ponadto pobierze ukryte arkusze, więc gdy spróbuję wybrać je wszystkie, otrzymam błąd poza granicami.

Nie wiedziałem, czy arkusz wykresu odnosi się inaczej niż zwykły arkusz lub dlaczego wybrane są również ukryte arkusze.

Odpowiedz

6

Użyj WBO.Sheets zamiast WBO.Worksheets w pętli.

Sprawdź, czy WSO.Visible = xlSheetVisible odfiltrowuje ukryte arkusze.

6

Są dwa problemy z pętli For Each: nie chwycić arkusze takie jak „Chart1”, to tylko chwyta arkusze takie jak „Arkusz1”

Wykresy i arkusze są dwie różne kolekcje.
Spróbuj tego:

Sub Demo() 
Dim oWs As Worksheet 
Dim oCs As Chart 

For Each oWs In ActiveWorkbook.Worksheets 
    Debug.Print oWs.Name 
Next 

For Each oCs In ActiveWorkbook.Charts 
    Debug.Print oCs.Name 
Next 
End Sub 
+0

Oczywiście 'ActiveWorkbook.Sheets' obejmuje zarówno' ActiveWorkbook.Worksheets' i 'ActiveWorkbook.Charts'. –

Powiązane problemy