Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Makro über VBA erweitern
#11
Zum Thema Drucken bin ich ein wenig weiter als vorher. Das Menü muss ich gar nicht ändern. 
Ich hab in der Arbeitsmappe folgendes Hinterlegt.

Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Range("D8") = "" And Range("D10") = "" And Range("D12") = "" And Range("D14") = "" Then
Cancel = True
MsgBox "Bitte den Zeitraum ankreuzen und ein Datum, einen Monat oder einen speziellen Zeitraum eintragen."
Else
If Range("D8") <> "" And Range("G8") = "" Then
Cancel = True
MsgBox "Bitte das Datum für den gwünschten Samstag eintragen (DD.MM.YYY)."
Else
If Range("D10") <> "" And Range("G10") = "" Then
Cancel = True
MsgBox "Bitte den gewünschten Monat auswählen."
Else
If Range("D12") <> "" And Range("G12") = "" Then
Cancel = True
MsgBox "Bitte den gewünschten Zeitraum eintragen (DD.MM.YYYY - DD.MM.YYYY)."
Else
If Range("D12") <> "" And Range("I12") = "" Then
Cancel = True
MsgBox "Bitte den gewünschten Zeitraum eintragen (DD.MM.YYYY - DD.MM.YYYY)."
Else
If Range("D14") <> "" And Range("G14") = "" Then
Cancel = True
MsgBox "Bitte den gewünschten Zeitraum eintragen (DD.MM.YYYY - DD.MM.YYYY)."
Else
If Range("D14") <> "" And Range("I14") = "" Then
Cancel = True
MsgBox "Bitte den gewünschten Zeitraum eintragen (DD.MM.YYYY - DD.MM.YYYY)."
Else
If Range("D17") = "" And Range("D19") = "" And Range("D21") = "" Then
Cancel = True
MsgBox "Bitte die betroffene Schicht auswählen."
Else
If Range("P8") = "" Then
Cancel = True
MsgBox "Bitte den Namen des Antragstellers eintragen."
Else
If Range("P10") = "" Then
Cancel = True
MsgBox "Bitte im Feld Abteilung die Vollständige Org.-ID eintragen."
Else
If Range("P12") = "" Then
Cancel = True
MsgBox "Bitte die Telefonnummer des Antragstellers eintragen."
Else
If Range("P14") = "" Then
Cancel = True
MsgBox "Bitte die E-Mail des Antragstellers eintragen."
Else
If Range("B26") = "" Then
Cancel = True
MsgBox "Grundlose Mehrarbeit... Ernsthaft?"
Else
If Sheets("Tabelle2").Range("D1").Value < 50 Then
Cancel = True
MsgBox "Die Begründung bitte ausführlicher beschreiben, beispielsweise mit Hilfe von Auftrags- oder Projektnamen sowie gefährdete Termine bzw. bereits verstrichene Termine. Wir sind in Ihrem Tagesgeschäft nicht eingebunden und benötigen daher ein wenig mehr Informationen als beispielsweise ""Rückstand abbauen"". Vielen Dank!"
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End Sub

Damit Decke ich die Prüfung ab, welche die Vollständigkeit Checkt.
Anschließenden öffnet sich der Speichern unter Dialog. Damit mache ich mir ein Problem auf, dass ich bei der Nutzung des Makros, welches hinter dem implementierten Button steckt, bereits eliminiert hatte.

Das Makro vergibt einen Dateinamen der sich, je nachdem wie der Antrag ausgefüllt wurde, anders aufbaut. Am Ende also so, wie die Datei auch endgültig abgelegt wird. Die Datei jedes mal selbst umbenennen nervt irgendwann. Es schaffen auch nur 5% der Nutzer die nötige Aufmerksamkeit aufzubringen, um zu erkennen wie die Datei benannt ist, nachdem Sie diese von allen signiert zurück bekommen. Erziehungsversuche schlagen meistens fehl. 
Also habe ich das automatisiert.

Beim oberen Code wird halt nur die Prüfung durchgeführt. Ist alles in Ordnung, startet die Standardprozedur zur Wandlung in eine PDF Datei. Wie ich dort noch weitere Themen die den Druckvorgang betreffend implementieren kann, das weiß ich leider nicht.  

Der Code hinter dem Button sieht wie folgt aus.

Code:
Private Sub DoPDF()
Dim sName$
Dim Path$

sName = ActiveSheet.Name

Path = CreateObject("WScript.Shell").specialfolders("Desktop")
On Error Resume Next
If Range("D10") = "X" Then
ThisWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=Path & "\" & Sheets("Tabelle1").Range("g10") & " - " & Cells.Range("P10") & ".pdf", _
    OpenAfterPublish:=True
If Err.Number > 0 Then MsgBox "Error saving pdf."
Else
If Range("D12") = "X" Then
ThisWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=Path & "\" & Sheets("Tabelle1").Range("g12") & " - " & Sheets("Tabelle1").Range("I12") & " - " & Cells.Range("P10") & ".pdf", _
    OpenAfterPublish:=True
If Err.Number > 0 Then MsgBox "Error saving pdf."
Else
If Range("D14") = "X" Then
ThisWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=Path & "\" & Sheets("Tabelle1").Range("g14") & " - " & Sheets("Tabelle1").Range("I14") & " - " & Cells.Range("P10") & ".pdf", _
    OpenAfterPublish:=True
If Err.Number > 0 Then MsgBox "Error saving pdf."
Else
ThisWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=Path & "\" & "KW" & Sheets("Tabelle2").Range("c1") & " - " & Cells.Range("P10") & ".pdf", _
    OpenAfterPublish:=True
If Err.Number > 0 Then MsgBox "Error saving pdf."
End If
End If
End If
End Sub
Antworten Top
#12
Zitat:Angenommen es handelt sich um deine Datei. Diese hätte auch eine solche Versionsprüfung mit Downloadlink zur neuen Version (falls vorhanden) als Lösung. Wäre es dir die Mühe überhaupt wert so eine Updatefunktion zu implementieren, oder würdest du es beim Download belassen?


Beim AddIn bräuchtest Du keinen Downloadlink zur neuen Version, da das AddIn, wie schauAn schon schrieb, lediglich der Programmteil ist, der sich immer am gleichen Platz befindet und vom getrennten (separaten) Datenteil (der Datei, die diesen Programmteil verwendet) genutzt wird. Kann auch von mehreren Datendateien genutzt werden...

Ob Ribbonprogrammierung jetzt einfacher ist, das wage ich mal stark zu bezweifeln, zumal beim Ribbon - der Programm- und Datenteil zusammengehören und somit gerade nicht den Vorteil eines AddIns bietet. 

Ansonsten ist die das mit dem AddIn nicht so kompliziert  wie es sich anhört. Es muss (als VBA AddIn) auch nicht installiert werden. Du öffnest eine neue Datei, wechselst in den VBA Editor, und im Modul DieseArbeitsmappe setzt Du die IstAddIn Eigenschaft auf true.  Schreibst Deinen Code, speicherst die Mappe als AddIn (xlam) und (einfachster Weg) unter Datei --> Optionen --> AddIns kannst Du diesen AddIn auswählen und dann unter Entwicklertools --> Exceladdins de-/aktivieren.
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#13
Moin Suprasod,

nur so am Rande: Ich habe Deine Vollständigkeitsprüfung gesehen und mich an die Anfänge meiner Basteleien erinnert: Endlose if...then-Orgien. Es geht einfacher! Zum Testen des Codes brauchst Du eine Userform mit drei Textboxen und einen Commandbutton (alle Namen Standard)

Code:
Private Sub CommandButton1_Click()

Select Case ""
    Case TextBox1.Text
        MsgBox "tbx1"
        TextBox1.SetFocus
        Exit Sub
    Case TextBox2.Text
        MsgBox "tbx2"
        TextBox2.SetFocus
        Exit Sub
    Case TextBox3.Text
        MsgBox "tbx3"
        TextBox3.SetFocus
        Exit Sub
End Select

End Sub
Zwischen End Select und End Sub klemmst Du den Code, der ausgeführt werden soll, wenn alle erforderlichen Angaben da sind. Dies ist die freundliche Variante, bei der Deine Nutzer automatisch zur ersten leeren Textbox geführt werden.

Es geht aber auch anders:   19
Code:
Private Sub CommandButton1_Click()

Select Case ""
    Case TextBox1.Text, TextBox2.Text, TextBox3.Text
        MsgBox "Alle Felder ausfüllen!",, "Du Faulsack!!"
        Exit Sub
End Select

End Sub

Viel Spaß noch!
wünscht

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
Antworten Top
#14
Moin!
Ich bin (fast) ganz bei Ralf A.
Im VBE-Editor Extras → Verweise → AddIn einbinden
Das AddIn sollte sich in einem Netzwerkpfad befinden, für den die User Lese-, Du aber Schreibrechte besitzt.
Dann kann sogar im laufenden Betrieb ein Update durchgeführt werden.
Aktualisiert wird es für den User beim ersten Öffnen nach der Aktualisierung.
Als erster Fallstrick sei die korrekte Referenzierung genannt.
Ist aber alles kein Hexenwerk!

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Ralf A
Antworten Top
#15
Hallöchen,

den Ribbon kann man ggf. auch in der Datendatei ummodeln, das muss nicht zwangsläufig alles in eine. Ist aber eben nicht unbedingt die einfachste Lösung.
Bei den Ereignismakros wird es dann ggf. etwas kniffliger wenn man Daten und Programm trennen will.


Bei der Variante Userform mal noch ein Hinweis. "3 Textboxen" lassen mich vermuten, dass es um das zweite Makro DoPdf geht. Da dürften Textboxen eher nicht die optimale Lösung darstellen. Wenn es bisher z.B. über Zelleinträge "x" gesteuert und mit Cancel=True abgebrochen wird würde ich in Richtung OptionButtons gehen.

Könnte natürlich sein, dass die "x" per Formel ermittelt werden. Dann macht ein Userform eher gar keinen Sinn Sad

Ein userform beim BeforePrint hingegen hat mehr Reiz. Hier könnte man z.B. die Textboxen nur für fehlende Einträge erscheinen lassen ...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#16
@[b]d'r Bastler[/b]

Ich danke dir für die Mühe, aber ich will nicht auch noch mit Userformen anfangen. Das nehmen mir auch die Nutzer übel.

Was auszufüllen ist, ist eine in Struktur gebrachte Exceltabelle. Einige Angaben müssen immer drin sein, wobei die Angaben in der Zusammenstellung ein wenig variieren können.
Über die bedingte Formatierung habe ich bereits die unmöglichen Kombinationen entschärft. Kreuzt man an, dass man einen Samstag möchte, dann verschwinden alle Felder für spezielle Zeiträume, Monate oder Wochen (klar, lediglich Schriftfarbe und Rahmen ändern sich). Wenn beispielsweise ein Samstag ausgewählt wird, dann muss aber auch das dazugehörige Feld mit dem Datum ausgefüllt werden. 

Am Ende sind es max. 11 Pflichtfelder + die Anzahl der gemeldeten Mitarbeiter (max. 62 x3 Felder - Name, Personalnummer, Anzahl geforderte Stunden). Ist Feld 1 ausgefüllt, dann darf Feld 2 und 3 nicht leer sein (Die Abfrage habe ich mir bisher erspart, da dort erfahrungsgemäß am wenigsten Fehler gemacht werden).


Die Punkte Name, Abteilung, Mail und Telefonnummer sind eigentlich nur noch Relikte die ich zur Sicherheit drin gelassen habe. Die Felder lasse ich automatisch mit den Userdaten aus der ActiveDirectory füllen. Da man aber das Formular mit einem Klick leeren kann, kann das eventuell mal passieren. Sollte es passieren, muss auch nur noch auf "Persönliche Daten holen" geklickt werden und es ist wieder alles da.

Ich verstehe aktuell noch nicht wirklich an welcher Stelle ich darüber was vereinfache. Getestet habe ich es und den einzigen Mehrwert den ich gesehen habe war das springen zu der Stelle wo was fehlt. 

Die Hübschen IF Kaskaden wirken auf mich viel unkomplizierter. Denn wenn ich mit Boxen arbeite,
dann muss ich diese natürlich erstmal erstellen,
ich muss zusehen, dass die Boxen aufgerufen werden,
dass die Inhalte in die entsprechenden Zelle übertragen werden
und ich muss mir auch noch Gedanken um die Optik der Formen  machen. 

Dann lieber ein paar Runden IF Karussel. 
79
Antworten Top
#17
Moin, von mir jetzt ungetestet:

mein Select Case-Konstrukt zur Vermeidung von unendlichen if...then-Orgien sollte auch mit der Abfrage von Zellen funktonieren. Statt meiner Textboxen, probierst Du dann einfach die Zelladressen und ihren Inhalt. Der Event, der statt des CommandButtons dann diese Sub auslöst, ist der selbe den Du schon nutzt.


Code:
Select Case ""
    Case Cells(1,1).value, Cells(1,2).value

Nachdem Du Dir die freundliche Variante ausgesucht hast, (bist aber 'nen netter Mensch! Blush ) hier noch der Ersatz für ...Setfocus:
Code:
Cells(1,1).Activate


Viel Spaß!

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
[-] Folgende(r) 1 Nutzer sagt Danke an d'r Bastler für diesen Beitrag:
  • Suprasod
Antworten Top
#18
Hallöchen,

wenn schon, dann
Code:
Select Case ""
    Case Cells(1,1).value
    'Aktion 1
    Case Cells(1,2).value
    'Aktion 2
...
End Select
Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Suprasod
Antworten Top
#19
Moin schaun!
Deinem Beitrag wird nicht widersprochen Wink
Grüße

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
Antworten Top
#20
Big Grin 
Da hätte man selbst drauf kommen können.  28
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste