wachsi08
Goto Top

Ausführen einer VBA Anweisung wenn in der Zelle C1 Wahr steht

Ausführen einer VBA Anweisung wenn in der Zelle C1 Wahr steht

Hallo @ll,

ich habe eine Exceldatei in der ich meine Termin für Angebote verwalte, nun hab ich ein Makro gefunden mit dem ich per Aktivierung des Makros die Zelle A1 und B1 in das Outlook
übergebe, nun ist mein gedanke das ich das auch Automatisieren übergeben kann in dem ich in der Zelle C1 eine Wahrheitsprüfung mach. So zu sagen wenn der Wahr in der Zelle C1 steht
soll die Makroprozedur aufgerufen werden, kann mit einer einen Tip geben mit welchen Befehl ich die VBA-Anweisung ausführen kann.

MfG

Wachsi

Content-ID: 129503

Url: https://administrator.de/contentid/129503

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

dog
dog 17.11.2009 um 02:20:22 Uhr
Goto Top
TsukiSan
TsukiSan 17.11.2009 um 04:03:46 Uhr
Goto Top
oder schau dir die eingetragenene Kommentare/Links auf Seite mal an.
Wenn du was hast und es immer noch nicht ganz will, dann poste es bitte und wir schauen drüber.

Gruss
Tsuki
76109
76109 17.11.2009 um 08:06:37 Uhr
Goto Top
Hallo wachsi!

In der Annahme, dass der Wahrheitswert in C1 durch eine Formel in Abhängigkeit der Zellen A1 und B1 erzeugt wird z.B.
=Wenn(Und(A1=1;B1=1);Wahr();Falsch())
würde dieser Code in das entsprechende Tabellenblatt kopiert Dein Makro automatisiert aufrufen:
Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Address = "$A$1" Or Target.Address = "$B$1") And Range("C1") = True Then Call MakroName  
End Sub

zum testen diesen Code z.B. in Modul 1 einfügen:
Sub MakroName()
    MsgBox "Test"  
End Sub

Gruß Dieter
wachsi08
wachsi08 17.11.2009 um 09:45:09 Uhr
Goto Top
Hallo,

ich danke euch für eure Beiträge, ich werde es heute gleich mal ausprobieren danke vorab.

Gruß Wachsi
wachsi08
wachsi08 18.11.2009 um 10:18:58 Uhr
Goto Top
Hallo Didi,

ich habe deine Anweisung mal augeführt und es funktioniert schon aber man muss den Makro immer noch von Hand starten, er soll von alleine gestartet werden sobald " true" ausgewiesen wird.

Geht das irgendwie

MfG
76109
76109 18.11.2009 um 11:39:54 Uhr
Goto Top
Hallo wachsi!

Was funkioniert schon?

Also, wenn Du meine Beispiel-Formel verwendest und den Code im VB-Editor in das Tabellenblatt mit der Formel kopiert hast und der MakroName durch den Namen Deines Makros ersetzt hast, dann sollte es funktionieren.

Deine Formel in Zelle C1 ist mir unbekannt und wenn Deine Formel sinngemäß anders als meine Beispiel-Formel lautet, dann funktioniert der Makro-Aufruf logischerweise auch nichtface-wink

Wie lautet Deine Formel in Zelle C1?

Gruß Dieter
wachsi08
wachsi08 18.11.2009 um 14:53:38 Uhr
Goto Top
Hallo,

ich habe mich nochmal mit deinem Makro beschäftigt das funktioniert wunderbar. Ich habe diesen jetzt genommen und für meine Begriffe weiterverwendet

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("T6") = True Then Call Termin1
End Sub

Nun habe ich eine Zelle in der ich einen Text eintragen habe und in T6 wird das Ergebniss True bezeichnet somit wird mein Makro Termin aufgerufen, (Das klappt alles super, nun würde mich mal Interessieren
wie kann die Prüfung auch für die T7-T25 durchführen) Das bedeute das wenn ich einen Text in die Zelle F8 ein Trage das nur der Wert der Zelle T8 ein Aufruf den Marko verursacht.

Es soll sozusagen per Prüfung Wahr oder Falsch die Zellen F8 für den Aufruf deines Markos veranwortlich sein und wenn ich Später mal die Zelle F12 beschreibe soll nur dies deine Marko aufrufen.

Ich hoffe du verstehst mich

Gruß Peter
76109
76109 18.11.2009 um 15:44:21 Uhr
Goto Top
Hallo wachsi!

Zunächst hast Du den Code unsachgemäß verändert ohne zu wissen, was nun eigentlich passiert.

Im Moment sieht es so aus, dass solange in der Zelle T6 Wahr steht, Du bei wahlloser Änderung eines Zellinhalts der restlichen 65534 Zellen im Tabellenblatt, jedesmal Dein Makro mit T6 aufgerufen wird und das ist mit Sicherheit nicht Sinn der Sache.

Und da mir Deine Formel immer noch unbekannt ist, kann ich Dir leider nicht weiterhelfen. Die Tatsache das in den Zellen T6 - T25 ein Wahrheitswert steht ist dabei eher nebensächlich.

Gruß Dieter

PS. Du könntest noch etwas zum bisherigen Ablauf erläutern. z.B Zelle xy markiert und dann Makro gestartet. Sowas in der Art oder das Makro posten
wachsi08
wachsi08 19.11.2009 um 07:44:50 Uhr
Goto Top
Guten Morgen Didi,

kannst du mir erstmal erklären für was die erste Zeile deines Codes steht "Private Sub Worksheet_Change(ByVal Target As Range)" bzw was damit eigentlich passiert.

Ich hab in meiner Excelliste einen Marko der aus einer Aktiven Zellen zb. F6 eine Email generiert in der der Zelleninhalt der Zelle übertragen wir + die Zelle G6. Nun war mein Problem das ich immer wieder auf einen Button drücken muss um die Daten in das Outlook zu übergeben. Dieses wollte ich um gehen in dem ich in der Zelle T6 eine Wahrheitsprüfung durchführ, also wenn ich zb. in die Zelle F6 und G6 einen Text geschrieben habe soll der Marko automtisch ausgeführt werden, ohne das ich den Button betätigen. Diese aktion soll für die Zeilen 1-25 erfolgen.

SendMakro:

Sub Termin()

'E 2000
'Dim OutApp As Outlook.Application
Dim OutApp As Object, apptOutApp As Object
Dim i As Integer
Dim Nachricht As Object


Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.to = "xxx@xx.de"
.Subject = "Erinnerung für Angebot"
.Body = "Bitte rufen Sie beim Auftraggeber an wie weit der Bearbeitungsstand des Angebotes ist." & "Termin: " & ActiveCell & " Bauvorhaben: " & ActiveCell.Offset(0, 1)
.Send
End With

Set OutApp = Nothing
Set Nachricht = Nothing
Do Until ActiveCell.Value = ""
Set OutApp = CreateObject("Outlook.Application")
Set apptOutApp = OutApp.CreateItem(1) 'olAppointmentItem)
With apptOutApp
'Datum und Uhrzeit aus der Zelle genommen
.Start = Format(ActiveCell.Value, "dd.mm.yyyy") & " 06:00"
'Dauer. Angabe ist jeweils in ganzen Minuten zu setzen
'Betreff steht in der Spalte rechts von den Terminen
.Subject = ActiveCell.Offset(0, 1)
'Zusätzlicher Text
.Body = ""
'ort13-
.Location = ""
.Duration = "5"
'Erinnerung
.ReminderMinutesBeforeStart = 60
'Erinnerung wiederholen
.ReminderSet = True
'Termin speichern
.Save
End With
'Nächste Zelle auswählen
ActiveCell.Offset(1, 0).Select
'Variablen leeren
Set apptOutApp = Nothing
Set OutApp = Nothing
Loop
MsgBox "Termine an Outlook übertragen!"

End Sub


Ich hoffe du kannst meine gedanken nachvollziehen und ich Dank ich schon mal

Gruß Peter
76109
76109 19.11.2009 um 10:10:29 Uhr
Goto Top
Hallo Peter!

Zitat von @wachsi08:
kannst du mir erstmal erklären für was die erste Zeile deines Codes steht
"Private Sub Worksheet_Change(ByVal Target As Range)" bzw was damit eigentlich passiert.
Die Sub ist eine Change-Ereignis-Routine und wird automatisch nach jeder Änderung einer beliebigen Zelle im ganzen Tabellenblatt aufgerufen. Deshalb ist es wichtig festzulegen, für welche Zelländerungen eine Aktion ausgeführt werden soll. Wenn Du also z.B. in Zelle A1 etwas reinschreibst und die Eingabe z.B. mit Enter abschließt, dann wird die Sub aufgerufen und im Parameter 'Target' wird das geänderte Zell-Object übergeben. Somit ist mir die Adresse (A1), die Zeilen-Nummer (1), die SpaltenNummer (1) etc. der geänderten Zelle bekannt.

Anhand Deiner Angaben bedeutet das programmtechnisch:
Wenn sich Bereich F1:G25 ein Zellinhalt ändert, dann ermittle die Zeilennummer und prüfe, ob in dieser Zeile in Spalte T der Wert "Wahr" steht.

Dein Makro Termin() wird dabei insoweit geändert, dass die Einträge der Zellen direkt übergeben werden. Das sieht dann in etwa so aus:
Call Termin(Text_F1, Text_G1).

Das mal vorabface-smile

Gruß Dieter

PS. Das Makro Termin liest beim Start derzeit nacheinander alle Zeilen aus und überträgt somit alle Termine an Outlook. Wenn ich Dich aber richtig verstanden habe, dann soll doch jeweils nur ein geänderter Termin übergeben werden oder sehe ich das falsch?
wachsi08
wachsi08 19.11.2009 um 11:39:19 Uhr
Goto Top
Hallo,

du hast mich Richtig verstanden, es sollen nur Daten übertragen werden die geändert werden. Sagmal kann ich es aus so machen in dem
ich

Termin1 bis Termin25 schreibe und je nach Termin soll die fest definierten zellen übertragen werden z.B.
Sub Termin6()

'E 2000  
'Dim OutApp As Outlook.Application  
Dim OutApp As Object, apptOutApp As Object
Dim i As Integer
Dim Nachricht As Object


Set OutApp = CreateObject("Outlook.Application")  
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.to = "xxx@xx.de"  
.Subject = "Erinnerung für Angebot"  
.Body = "Bitte rufen Sie beim Auftraggeber an wie weit der Bearbeitungsstand des Angebotes ist." & "Termin: " & ("F6") & " Bauvorhaben: " & ("G6")  
.Send
End With

Set OutApp = Nothing
Set Nachricht = Nothing
Do Until ActiveCell.Value = ""  
Set OutApp = CreateObject("Outlook.Application")  
Set apptOutApp = OutApp.CreateItem(1) 'olAppointmentItem)  
With apptOutApp
'Datum und Uhrzeit aus der Zelle genommen  
.Start = Format(ActiveCell.Value, "dd.mm.yyyy") & " 06:00"  
'Dauer. Angabe ist jeweils in ganzen Minuten zu setzen  
'Betreff steht in der Spalte rechts von den Terminen  
.Subject = ActiveCell.Offset(0, 1)
'Zusätzlicher Text  
.Body = ""  
'ort13-  
.Location = ""  
.Duration = "5"  
'Erinnerung  
.ReminderMinutesBeforeStart = 60
'Erinnerung wiederholen  
.ReminderSet = True
'Termin speichern  
.Save
End With
'Nächste Zelle auswählen  
ActiveCell.Offset(1, 0).Select
'Variablen leeren  
Set apptOutApp = Nothing
Set OutApp = Nothing
Loop
MsgBox "Termine an Outlook übertragen!"  
Diese Anweisung würde ich jetzt so oft wieder soviel Zeilen ich benötige. Anschliessend ist mein gedanke in der Spalte T soll pro Zeile überprüft werden ob in der Zelle T6 ein Text steht oder nicht wenn je wird True geschrieben, wenn dies dastehe soll der Termin6 aufgerufen werden.

Meine Anweisung sollt in diesen fall heissen:
Sub Uebergabe6 ()

If cells ("T6")=True Then call Termin6  
End Sub
Diese übergabe Subs sollen jetzt wieder so oft wie benötigt wieder holt werden.

Kann ich mein Problem auch so lösen oder ist das völliger MIST. Ich hoffe ich nerv dich damit nicht zu sehr aber ich bin Neuling auf dem Gebiet der VBA Programmierung.

Gruß Wachsi

[Edit Biber] Codetags nachgetragen [/Edit]
76109
76109 19.11.2009 um 12:48:28 Uhr
Goto Top
Hallo Peter!

Es wird nur 1 Sub Termin() benötigt.

Ich habe ja in der letzten Antwort schon geschrieben, das die Zellinhalte von der Sub Change() direkt übergeben werden. D.h. Du schreibst z.B. in die Zellen F6 und G6 etwas rein und wenn dann in der Zelle T6 Wahr steht, dann wird die Sub Termin mit dem Zellinhalt der Zellen F6 und G6 aufgerufen. Das Makro Termin(..) muss ich dann natürlich noch entsprechend anpassen.

Ausserdem würde ich nun endlich gerne noch wissen, ob z.B. in T6 jetzt eine Formel steht oder ob Du das Wahr per Hand eingibst??????

Gruß Dieter
wachsi08
wachsi08 19.11.2009 um 13:04:29 Uhr
Goto Top
Hi,

in meiner Zelle steht

=ISTTEXT(G6)
76109
76109 19.11.2009 um 13:22:11 Uhr
Goto Top
Hallo!

In diesem Fall, ist die Zelle mit dem Wahrheitswert z.B. T6 vollkommen überflüssig.

Die Change-Routine wird ja bei einer Zelländerung automatisch aufgerufen, sobald Du in Zelle G6 einen Text eingibst und die Eingabe z.B. mit der Enter- oder Pfeiltaste bestätigst. D.h. die Change-Routine kann selbst überprüfen, ob die Zelle F6 und G6 ein gültiges Format enthält und die Termin-Routine mit diesen Parametern aufrufen. Bei einer Änderung des Zellinhaltes in T6 durch eine Formel, wird kein Change-Ereignis ausgelöst, insofern ist dieser Wert nicht von nutzen.

Gruß Dieter
76109
76109 19.11.2009 um 14:19:47 Uhr
Goto Top
Hallo Peter!

Hier mal was zum Testen.

Diesen Quelltext im VB-Editor in das entsprechende Tabellenblatt kopieren:
Option Explicit

Const SpalteF = 6       'Spalte F  
Const SpalteG = 7       'Spalte G  
Const ZeilenB = 1       'Zeilen Begin  
Const ZeilenE = 25      'Zeilen Ende  

Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .Column <> SpalteG Or .Row < ZeilenB Or .Row > ZeilenE Or IsNull(.Text) = True Then Exit Sub
        If IsDate(Cells(.Row, SpalteF)) = True And Cells(.Row, SpalteG).Text <> "" Then  
            Call TestMakro(Cells(.Row, SpalteF), Cells(.Row, SpalteG))
        End If
    End With
End Sub
"TestMakro" nach dem testen durch "Termin" ersetzen.

Diesen Quelltext zum testen im VB-Editor in ein Modul kopieren:
Sub TestMakro(ByRef Datum, ByRef Text)
    MsgBox "Datum: " & Datum & "  Text: " & Text  
End Sub


Deinen Termin-Code im VB-Editor durch diesen Quelltext ersetzen:
Sub Termin(ByRef Datum, ByRef Text)
    
    'OutApp As Outlook.Application  
    Dim OutApp As Object, apptOutApp As Object, Nachricht As Object
    
    Set OutApp = CreateObject("Outlook.Application")  
    Set Nachricht = OutApp.CreateItem(0)
    
    With Nachricht
        .to = "xxx@xx.de"  
        .Subject = "Erinnerung für Angebot"  
        .Body = "Bitte rufen Sie beim Auftraggeber an wie weit der Bearbeitungsstand des Angebotes ist." & "Termin: " & Datum & " Bauvorhaben: " & Text  
        .Send
    End With
    
    Set OutApp = Nothing
    Set Nachricht = Nothing
    Set OutApp = CreateObject("Outlook.Application")  
    Set apptOutApp = OutApp.CreateItem(1) 'olAppointmentItem  
    
    With apptOutApp
        'Datum aus Spalte F  
        .Start = Format(Datum, "dd.mm.yyyy") & " 06:00"  
        'Dauer. Angabe ist jeweils in ganzen Minuten zu setzen  
        'Betreff aus Spalte G  
        .Subject = Text
        'Zusätzlicher Text  
        .Body = ""  
        'ort13-  
        .Location = ""  
        .Duration = "5"  
        'Erinnerung  
        .ReminderMinutesBeforeStart = 60
        'Erinnerung wiederholen  
        .ReminderSet = True
        'Termin speichern  
        .Save
    End With
    
    Set apptOutApp = Nothing
    Set OutApp = Nothing
    
    MsgBox "Termin an Outlook übertragen!"  
End Sub

Gruß Dieter
wachsi08
wachsi08 19.11.2009 um 14:53:29 Uhr
Goto Top
Hi Dieter,

Super Sachen ich Dank Dir wie verrückt.

Kannst du mir ein gutes VBA Buch empfehlen.

Gruß

Peter
76109
76109 19.11.2009 um 15:16:52 Uhr
Goto Top
Hallo Peter!

Yep, gern geschehenface-smile

Jenachdem, ob VBA für Access, Excel, Word usw. empfehle ich persönlich Bücher von Michael Kofler ADDISON-WESLEY-Verlag z.B über Amazon.

Viele Dinge können auch mit Hilfe der Makroaufzeichnung erlernt werden.

Gruß Dieter