VBA Excel - Userform - Fehler 17 und andere Excelmacken

Spock55000

Commodore
Registriert
Apr. 2008
Beiträge
4.864
Hallo ihr

ich versuche eine Userform zu erstellen und das seit Stunden, jedoch ist Excel bockig bzw. ich zu blöd.
Ziel:
Wenn Kopf und Fußzeile angekreuzt werden, sollen Überschrift und Datum in der Kopfzeile und Ersteller und Seite: Seitenzahl/Anz ahl Seiten in der Fußzeile stehen. Wird nur Kopf bzw. Fußzeile angeklickt, enthält die Zeile Ersteller, Datum, Seite: Seitenzahl/Anzahl Seite n.

Ich komme dem schon näher, aber es hängt oft an der Syntax.

1597171274165.png


Code:
Private Sub Drucken_Click()

'Deklaration der Variablen
  Dim strDatum$ 'Typ: String - sieht man auch an "str" im Namen
  Dim xFormat, vbStil 'ohne Datentyp, also die Variable deklariert als Variant
  Dim strText$, strTitel$, strErsteller$ 'Typ: String
  Dim Datenauswahl$ 'Druckbereichdaten

    'Abfrage ob Druckbereich ausgewählt ist
    If Datenauswahl = 0 Then
    MsgBox "Kein Druckbereich ausgewählt - bitte wählen sie erst den Bereich aus", vbOKOnly + vbExclamation, "Hinweis"
   
    Else

Bei dem Code kommt der Fehler 17 - die Typen tritt auf. Wieso das so ist, weiß ich net so ganz. Refedit soll am Ende doch einen Text ausgeben, der dann übergeben wird in die Printarea.

Den Rest muss ich soweit ich richtig verstanden habe mit IF Schleifen machen. Jedoch bockt das schon oben im Quellcode rum.

Anbei die komplette Makro Datei.

Könnte mir bitte jemand helfen? Ich dreh langsam durch was Excel angeht...

Grüße
Spock
 

Anhänge

  • Makrotestprojekt - Kopie.zip
    29 KB · Aufrufe: 257
Puh, da fehlt ehrlich gesagt viel, als das man das jetzt beurteilen könnte.
Die Datei habe ich allerdings nicht geladen. Der zitierte Code ist ja erstmal nur GrundCode für die Box. Hinter den Interaktionszonen (“Kopfzeile drucken”) kommt ja dann erst der eigentliche Code.

Und dann endet dein Code mit Zeile 13, Else
Else, was?


Was folgt? Du kannst in VBA nicht mit Else schließen, wie in JS. Da muss ein End If hinter.

Weiter musst Du alle Datentypen definieren. dim $ reicht da nicht.
Musst schon immer dim xx as yy; sonst wird dir der Compiler immer wieder Querschießen.

Weiß gar nicht mehr wie das heißt, gibt’s aber nen Begriff für. Glaub ‘strikte’ Skriptsprache oder sowas? Immer alles definieren. Und jede Verbindung immer schön brav mit End schließen. Insbesondere zB auch End with, End for usw. usf.

Selbst wenn Du einen Job mit Counter aka do until i = 1 benutzt, musst Du diese Funktion entsprechend schließen und kannst sie nicht einfach auslaufen lassen.

Das sind so die größten ersten Unterschiede zu JS. Und bevor Du schimpfst, bedenke immer: VBA ist letztlich immer noch ein Abkömmling von BASIC.
Und BASIC ist eben alt, sehr alt, und sehr BASIC ;)
 
Zuletzt bearbeitet:
Der ganze Code.... ich hatte den nur nicht rein kopiert, da ich erst einmal den Fehler 17 entfernen wollte.

Code:
Private Sub UserForm_Initialize()


End Sub

Private Sub Abbruch_Click()
Unload Me
End Sub


Private Sub Drucken_Click()

'Deklaration der Variablen
  Dim strDatum$ 'Typ: String - sieht man auch an "str" im Namen
  Dim xFormat, vbStil 'ohne Datentyp, also die Variable deklariert als Variant
  Dim strText$, strTitel$, strErsteller$ 'Typ: String
  Dim Datenauswahl As String 'Druckbereichdaten

    'Abfrage ob Druckbereich ausgewählt ist
    If Datenauswahl = 0 Then
    MsgBox "Kein Druckbereich ausgewählt - bitte wählen sie erst den Bereich aus", vbOKOnly + vbExclamation, "Hinweis"
   
    Else
        On Error GoTo Sprungmarke 'Aktiviert die Fehlerbehanndungsroutine und geht zur "Klasse" Sprungmarke

   
        strDatum = Format(Date, "dd.mm.yyyy") 'Setzt das Datumsformat für die Variable strDatum fest auf Tag/Monat/Jahr
        strTitel = ActiveSheet.Name 'Ließt den Namen des Aktiven Blattes aus und übergibt ihn an die Variable strTitel
        strText = "Was soll in der Kopfzeile linksbündig stehen? " & vbNewLine & vbNewLine 'Legt einen Standardtext für die Variable strText fest - dazu werden zwei neue Zeilen erzeugt
        strTitel = InputBox(strText, "Eingabe der Überschrift", strTitel) 'Öffnet ein Eingabefeld in dem die Überschrift eingegeben werden soll, wenn nichts angegeben, dann wird der Titel aus strTitel genommen
        strErsteller = Environ("Username") 'Anmeldedaten des Nutzers des Betriebssystems werden an die Variable strErsteller übergeben
        strErsteller = ActiveWorkbook.BuiltinDocumentProperties("Last Author") 'Name des letztes Authors wird an die Variable strErsteller übergeben
        If strErsteller = "" Then strErsteller = ActiveWorkbook.BuiltinDocumentProperties("Author")  'Falls der Ersteller nicht angegeben ist, wird der Ersteller aus dem Dokumenteneigenschaften übernommen
       
         Application.PrintCommunication = False 'Gibt an, ob die Kommunikation mit dem Drucker eingeschaltet ist. False: Ausführung von Code zu beschleunigen, um PageSetup -Eigenschaften festzulegen.
       
         With ActiveSheet.PageSetup 'Startet die Seiteneinstellungen
               .PrintArea = Range(RefEdit1.Text) 'Gibt den zu druckenden Range-Wert in der Sprache des Makros als Zeichenfolge zurück oder legt ihn fest.
             
          
 'IF Schleife hier festlegen - bezüglich des Formats
            If Hochformat = True Then
               .Orientation = xlPortrait 'Ausrichtung auf Hochformat
               Else
               If Querformat = True Then
               .Orientation = xlLandscape 'Ausrichtung auf Querformat
               Else
               MsgBox "Kein Format ausgewählt", vbOKOnly + vbExclamation, "Hinweis"
               End If
               End If
            
               .PaperSize = xlPaperA4 'Setzt Papierformat auf DIN A4
            'If Schleife hier festlegen - bezüglich der Kopf und Fußzeilen
            If Kopfzeile = True And Fußzeile = True Then
                .LeftHeader = strTitel 'Gibt die Ausrichtung von Text in der linken Kopfzeile einer Arbeitsmappe oder eines Abschnitts zurück oder legt diese fest. - Variableninhalt strTitel
                .RightHeader = strDatum 'Gibt den rechten Teil der Kopfzeile zurück oder legt ihn fest. - Variableninhalt strDatum
                .LeftFooter = strErsteller 'Gibt die Ausrichtung von Text in der linken Fußzeile einer Arbeitsmappe oder eines Abschnitts zurück oder legt diese fest. - Variableninhalt strErsteller
                .RightFooter = "Seite: &S/&A" 'Gibt den Abstand (in Punkt) zwischen dem rechten Rand der Seite und der rechten Begrenzung der Fußzeile zurück oder legt ihn fest. Gibt hier die Seite und Seitenanzahl an
            Else
                If Kopfzeile = True Then
                    .LeftHeader = strErsteller 'Gibt die Ausrichtung von Text in der linken Fußzeile einer Arbeitsmappe oder eines Abschnitts zurück oder legt diese fest. - Variableninhalt strErsteller
                    .CenterHeader = strDatum 'Gibt den rechten Teil der Kopfzeile zurück oder legt ihn fest. - Variableninhalt strDatum
                    .RightHeader = "Seite: &S/&A"
                Else
                If Fußzeile = True Then
                    .LeftFooter = strErsteller 'Gibt die Ausrichtung von Text in der linken Fußzeile einer Arbeitsmappe oder eines Abschnitts zurück oder legt diese fest. - Variableninhalt strErsteller
                    .CenterFooter = strDatum 'Gibt den rechten Teil der Kopfzeile zurück oder legt ihn fest. - Variableninhalt strDatum
                    .RightFooter = "Seite: &S/&A"
                Else
                End If
                End If
            End If
             
               .CenterFooter = "" 'Zentriert die Fußzeileninformationen im PageSetup-Objekt. - Ist leer
             
               .LeftMargin = Application.InchesToPoints(0.7874) 'Gibt die Größe des linken Rands in Punktzurück oder legt Sie fest. | Application.InchesToPoints wandelt eine Maßangabe von Zoll in Punkt um.
               .RightMargin = Application.InchesToPoints(0.3937) 'Gibt die Größe des rechten Rands in Punktzurück oder legt Sie fest.
               .TopMargin = Application.InchesToPoints(0.7874) 'Gibt die Größe des oberen Seitenrands in Punktzurück oder legt Sie fest.
               .BottomMargin = Application.InchesToPoints(0.7874) 'Gibt die Größe des unteren Seitenrands in Punktzurück oder legt Sie fest.
               .HeaderMargin = Application.InchesToPoints(0.31496) 'Gibt den Abstand zwischen dem oberen Rand der Seite und der Kopfzeile in Punktzurück oder legt ihn fest.
               .FooterMargin = Application.InchesToPoints(0.31496) 'Gibt den Abstand vom unteren Rand der Seite zur Fußzeile in Punktzurück oder legt ihn fest.
               .FitToPagesWide = 1 'Gibt zurück oder legt die Anzahl der Seiten breit, die das Arbeitsblatt skaliert werden, wenn es gedruckt wird. Nur gültig für Arbeitsblätter.
               .PrintErrors = xlPrintErrorsDisplayed 'Legt eine XlPrintErrors -Konstante fest, die den Typ des angezeigten Druckfehlers angibt, oder gibt Sie zurück. Diese Funktion ermöglicht es den Benutzern, beim Drucken eines Arbeitsblatts die Anzeige von Fehlerwerten zu unterdrücken. | Gibt den Typ des angezeigten Druckfehlers an.
           End With 'Ende der Seiteneinstellungen
           Application.PrintCommunication = True 'True: alle im Cache vorhandenen PageSetup-Befehle werden ausgeführt
           Exit Sub 'Ausgang des Markos
Sprungmarke:
           Application.PrintCommunication = True 'True: alle im Cache vorhandenen PageSetup-Befehle werden ausgeführt
           strTitel = "Wichtige Information" 'Titel wird festgelegt
           strText = "Es ist ein Fehler aufgetreten. Bitte wenden sich an den Ersteller unter info@xyz.de. " & vbNewLine & vbNewLine 'Fehlermeldung
           vbStil = vbOKOnly + vbExclamation 'Gibt an, dass nur die Schaltfläche OK angezeigt wird + Gibt an, dass das Ausrufezeichensymbol angezeigt wird
           MsgBox strText, vbStil, strTitel 'Nachrichtenbox mit festgelegten Inhalt wird angezeigt
        End If
   
End Sub

Private Sub Fußzeile_Click()

End Sub

Private Sub Kopfzeile_Click()

End Sub

Private Sub OptionButton1_Click()
'Hochformat
   
End Sub

Private Sub OptionButton2_Click()
'Querformat

End Sub

Private Sub RefEdit1_BeforeDragOver(Cancel As Boolean, ByVal Data As MSForms.DataObject, ByVal x As stdole.OLE_XPOS_CONTAINER, ByVal y As stdole.OLE_YPOS_CONTAINER, ByVal DragState As MSForms.fmDragState, Effect As MSForms.fmDropEffect, ByVal Shift As Integer)

End Sub

Private Sub UserForm_Click()

End Sub
 
Zuletzt bearbeitet:
Zurück
Oben