2017-03-03 2 views
0
Option Explicit 

Dim mySheets As Dictionary 

Private Sub SaveAndOpen_Click() 

    'set up variables 
    Dim i As Long 
    Dim j As Long 
    Dim myArr() As Long 
    Dim filename As String 
    ReDim myArr(1 To Sheets.Count) 

    j = 1 

    'make bounds 
    Dim from As Long 
    Dim tonum As Long 

    'numbers inputted from a userform 
    from = FromBox.Value 
    tonum = ToBox.Value 
    filename = Cells(3, 4) & "." & mySheets.Item(from) & "-" & mySheets.Item(tonum) 
    For i = 1 To mySheets.Count 

     If i >= FromBox.Value And i <= ToBox.Value Then 
      myArr(j) = i 
      j = j + 1 
     End If 
    Next i 

    Dim filepath As String 
    For i = 1 To UBound(myArr) 
     filepath = filepath & myArr(i) 
    Next i 


    filepath = "c:\file\path\here\" 

    ThisWorkbook.Sheets(myArr).Select 

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, filename:= _ 
    filepath & filename, Quality:=xlQualityStandard, IncludeDocProperties:=True, _ 
    IgnorePrintAreas:=False, OpenAfterPublish:=True 

    ThisWorkbook.Sheets(1).Select 
End Sub 


Private Sub UserForm_Initialize() 
    Copies.Value = 1 
    FromBox.Value = 1 


    Dim i As Long 

    Set mySheets = New Dictionary 
    For i = 1 To ActiveWorkbook.Sheets.Count 
     mySheets.Add i, ActiveWorkbook.Sheets(i).Name 
     SheetBox.Value = SheetBox.Value & i & " - " & ActiveWorkbook.Sheets(i).Name & vbCrLf 
    Next i 

    ToBox.Value = i - 1 

End Sub 

Dieses Unterprogramm Informationen aus einer Userform erfolgt, die Benutzervariablen in FromBox und toBox eingegeben hat; Das sind beide Longs. Ziel ist es, beispielsweise die Blätter 2 - 10 zu speichern. Die Parameter werden vom Benutzer festgelegt.speichert eine Reihe von Excel-Tabellen als PDF

Der folgende Code, mit dem unteren Abschnitt unkommentiert, funktioniert, wenn der Benutzer alle Arbeitsblätter angibt (IE gibt 10 Arbeitsblätter, und der Benutzer gibt Bereich 1-10 an). Aber wenn der Benutzer 2-10 angibt, schlägt es fehl.

Das Problem, denke ich, ist, dass ich versuche, 10 Elemente mit einem Array mit 9 Elementen zu wählen.

+1

'ReDim myArr (1 bis ToBox.Value - FromBox.Value - 1)' wird es beheben, denke ich. Das ist Pseudo-Code, mag nicht genau funktionieren, aber ich denke, Sie verstehen, was ich meine. –

+0

Was ist 'mySheets' Ich sehe keine Variable gesetzt - füge' Option Explicit' über deinem Code hinzu und führe es aus. – 0m3r

+2

siehe aktualisierten Code – bdpolinsky

Antwort

2

Wie Scott Holtzman in einem Kommentar darauf hingewiesen hat, dimensionieren Sie myArr größer als es sein sollte. Es enthält daher nicht zugeordnete Werte, die als Standard-Nullwert übrig bleiben. Dies führt zu Problemen, da kein Blatt 0 ausgewählt werden muss.

denke ich, der folgende Code funktionieren soll:

Option Explicit 

Dim mySheets As Dictionary 

Private Sub SaveAndOpen_Click() 

    'set up variables 
    Dim i As Long 
    Dim j As Long 
    Dim myArr() As Long 
    Dim filename As String 

    'make bounds 
    Dim from As Long 
    Dim tonum As Long 

    'numbers inputted from a userform 
    from = FromBox.Value 
    tonum = ToBox.Value 

    'Check ToBox.Value is valid 
    If tonum > Sheets.Count Then 
     MsgBox "Invalid To value" 
     Exit Sub 
    End If 
    'Check FromBox.Value is valid 
    If from > tonum Then 
     MsgBox "Invalid From value" 
     Exit Sub 
    End If 

    'Setup myArr 
    ReDim myArr(from To tonum) 
    For j = from To tonum 
     myArr(j) = j 
    Next 

    filename = Cells(3, 4) & "." & mySheets.Item(from) & "-" & mySheets.Item(tonum) 
    ' 
    Dim filepath As String 
    'For i = LBound(myArr) To UBound(myArr) 
    '  filepath = filepath & myArr(i) 
    'Next i 


    filepath = "c:\file\path\here\" 

    ThisWorkbook.Sheets(myArr).Select 

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, filename:= _ 
    filepath & filename, Quality:=xlQualityStandard, IncludeDocProperties:=True, _ 
    IgnorePrintAreas:=False, OpenAfterPublish:=True 

    ThisWorkbook.Sheets(1).Select 
End Sub 
+0

Danke! Dieser Code funktioniert. Eine meiner Verwirrungen - wenn ich ein Array zu (2 bis 9) redimiere, macht VBA die Indizes dieses Arrays (2,3,4,5,6,7,8,9) oder (0,1,2, 3,4,5,6,7)? Ich habe gelernt, dass die Indizes von Arrays immer bei 0 beginnen, also dachte ich, dass selbst wenn ich das Array redigieren würde, die Indizes immer bei 0 beginnen würden. – bdpolinsky

+0

@bdpolinsky - wenn ein Array als "Dim myArr (2 To 9)" deklariert ist die 'LBound' (untere Grenze) ist 2 - dh' myArr (1) 'würde einen Index außerhalb des Bereichsfehlers geben. (Hinter den Kulissen würde das Array effektiv als nullbasiert gespeichert werden, aber der Compiler würde Code erzeugen, um immer den Index zu reduzieren, der von der unteren Grenze verwendet wird, um zu bestimmen, welche Position zu verwenden ist. Im Fall von 'MyArr (2 Zu 9) 'würde mit' MyArr (5) 'die Position' 5-2' verwendet werden, und im Fall von 'MyArr (-10 zu 7) würde' MyArr (-5) 'die Position' verursachen -5 - -10', dh '5' zu verwenden. Aber das ist alles hinter den Kulissen!) – YowE3K

Verwandte Themen