[Excel] Excel 2010 VBA: mehrere Druckbereiche auf einem Tabellenblatt

amn.ssy

Erfahrenes Mitglied
Hallo,

ich habe in den vergangenen Tagen die Ausgabe von Diagramme in einer Excel-Mappe reorganisiert. Statt vieler Sheets mit jeweils bis zu 10 statischen Diagramme gibt jetzt nur noch ein Sheet mit 8 Dynamischen, die der User via Dropdown und Checkboxen nach belieben zusammenstellen kann.
Nun stellt sich zum Schulß noch das Problem der Druckbereiche.
Selbstverständlich kann man über Druckbereich hinzu fügen alle 8 setzen und ich bekomme beim PDF-Print (eigenes Makro) je Diagramm eine Seite.
Auch das versuche ich gerade via Checkboxen (je eine neben dem Diagramm) etwas zu flexibilisieren um dem User die Möglichkeit zu geben genau die zu wählen die erbraucht.
Wenn's auch nicht schön aussieht und wahrscheinlich viel einfacher geht bekommen ich die Abfrage der Checkboxen schon mal hin. Was mir jetzt noch feht ist das korrekte zusammenbauen. Hab's mal mit ner Schleife versuchtund mit Stringverkettung, aber das hat alles bisher nit zum gewünschten Ergebnis geführt.
Visual Basic:
Sub PrintAreaOn()
Dim PrintA1 As String
Dim PrintA2 As String
Dim PrintA3 As String
Dim PrintA4 As String
Dim PrintA5 As String
Dim PrintA6 As String
Dim PrintA7 As String
Dim PrintA8 As String

If ActiveSheet.Shapes("Print1").ControlFormat.Value = xlOn Then
PrintA1 = "b5:k28"
ElseIf ActiveSheet.Shapes("Print1").ControlFormat.Value = xlOff Then
PrintA1 = ""
End If

If ActiveSheet.Shapes("Print2").ControlFormat.Value = xlOn Then
PrintA2 = "n5:w28"
ElseIf ActiveSheet.Shapes("Print2").ControlFormat.Value = xlOff Then
PrintA2 = ""
End If

If ActiveSheet.Shapes("Print3").ControlFormat.Value = xlOn Then
PrintA3 = "b31:k54"
ElseIf ActiveSheet.Shapes("Print3").ControlFormat.Value = xlOff Then
PrintA3 = ""
End If

If ActiveSheet.Shapes("Print4").ControlFormat.Value = xlOn Then
PrintA4 = "n31:w54"
ElseIf ActiveSheet.Shapes("Print4").ControlFormat.Value = xlOff Then
PrintA4 = ""
End If

If ActiveSheet.Shapes("Print5").ControlFormat.Value = xlOn Then
PrintA5 = "b57:k80"
ElseIf ActiveSheet.Shapes("Print5").ControlFormat.Value = xlOff Then
PrintA5 = ""
End If

If ActiveSheet.Shapes("Print6").ControlFormat.Value = xlOn Then
PrintA6 = "n57:w80"
ElseIf ActiveSheet.Shapes("Print6").ControlFormat.Value = xlOff Then
PrintA6 = ""
End If

If ActiveSheet.Shapes("Print7").ControlFormat.Value = xlOn Then
PrintA7 = "b83:k106"
ElseIf ActiveSheet.Shapes("Print7").ControlFormat.Value = xlOff Then
PrintA7 = ""
End If

If ActiveSheet.Shapes("Print8").ControlFormat.Value = xlOn Then
PrintA8 = "n83:w106"
ElseIf ActiveSheet.Shapes("Print8").ControlFormat.Value = xlOff Then
PrintA8 = ""
End If

'For i = 1 To 8
'If PrintA & i <> "" Then
'MsgBox "PrintA" & i & ": " & PrintA & i
'End If
'Next
    
'ActiveSheet.PageSetup.PrintArea = PrintA1
End Sub
LG
opiwahn
 
Hallo,

ich hätte da 'ne Lösung beizutragen, die zugegebenermaßen nicht gänzlich von mir ist ;-)
Da ich selbst lange vergeblich nach einer Lösung gesucht habe, stelle ich sie an dieser Stelle gerne zur Verfügung, zumal sie recht "simpel" und leicht zu durchschauen ist.
Die Sache mit dem Farbwechsel beim Klicken der Checkbox gehörte nicht zum eigentlichen Ansatz und ist eine "kleine" Erweiterung von mir.
Im Array "arrCCell" habe ich kurzerhand die Zellen notiert auf denen die Checkbox hinterlegt ist.

Grüße
opiwahn

Visual Basic:
Sub PrintAreaOn()
  Dim strPrintArea As String
  Dim i As Integer
  Dim arrAreas

  arrAreas = Array("b3:k26", "n3:w26", "b29:k52", "n29:w52", "b58:k81", "n58:w81", "b84:k107", "n84:w107")
  arrCCell = Array("l3", "x3", "l29", "x29", "l58", "x58", "l84", "x84")
  For i = 1 To 8
    If ActiveSheet.Shapes("Print" & i).ControlFormat.Value = xlOn Then
    Range(arrCCell(i - 1)).Interior.Color = RGB(255, 0, 0) 'Red
      If strPrintArea = "" Then
        strPrintArea = arrAreas(i - 1)
      Else
        strPrintArea = strPrintArea & "," & arrAreas(i - 1)
      End If
    Else
      Range(arrCCell(i - 1)).Interior.Color = RGB(0, 128, 0) 'Green
    End If
  Next i
  'MsgBox strPrintArea
  ActiveSheet.PageSetup.PrintArea = strPrintArea
End Sub
 
Ehrlich gesagt verstehe ich die Frage nicht wirklich, aber ich gebe dennoch mein bestes, vielleicht liege ich ja richtig :D

Zum ersten finde ich diese Zeile kurios:
Visual Basic:
'If PrintA & i <> "" Then
Du kannst keinen Variablennamen mit Verkettung zusammenbauen! VBA interpretiert an dieser Stelle die Variable PrintA (die ist leer) und das Ergebnis von i<>"" was true sein wird. du bräuchtest also an der Stelle z.B. ein Array, dem du dann sagen kannst PrintA(i)

Ich verstehe aber nicht, warum du die Werte überhaupt erst in 8 verschiedenen Feldern speicherst. Wieso verkettest du sie nicht direkt oder gibst sie direkt aus?
 
Zurück