Nach Speichern soll Makro gelöscht sein

  • #1
S

studnick

Mitglied
Themenersteller
Dabei seit
17.02.2005
Beiträge
13
Reaktionspunkte
0
Ich möchte, dass ein Makro nur einmalig ausgeführt wird.
Sobald das Dokument einmal bearbeitet wurde und mit >Speichern unter..< abgelget wurde, soll das Makro beim erneuten öffnen des Dokumentes nicht mehr ausgeführt werden.

Gibt es dafür eine Möglichkeit?
Wäre für Hilfe sehr dankbar

Gruß studnick
 
  • #2
Ola,

Makro per Makro löschen ?

Such mal in der Hilfe nach den beonderen Namen für Makros
autoopen,
autoNew
autoclose

Möglcih wäre noch, im Dokument eine Dokumentvariable mit dem Makro anzulegen, und das Makro nur dann auszuführen, wenn die Variable nicht existiert ....
 
  • #3
Hallo studnick,

man könnte das folgendermassen lösen:

im VB-Editor ein Modul zur Arbeitsmappe anlegen und folgenden Code einfügen:
Code:
Function CodeZeilenAusDieseArbeitsmappeEntfernen()
  Dim l_cnt As Long
  l_cnt = ActiveWorkbook.VBProject.VBComponents(DieseArbeitsmappe).CodeModule.CountOfLines
  ActiveWorkbook.VBProject.VBComponents(DieseArbeitsmappe).CodeModule.DeleteLines 1, l_cnt
End Function
Function MyMakro()
  MsgBox (Hier kann Code vor dem Speichern ausgeführt werden.)
End Function
MyMakro ist dein Bearbeitungs-Makro, den Du entsprechend gestalten mußt.
CodeZeilenAusDieseArbeitsmappeEntfernen ist eine Funktion, die alle Code-Zeilen aus der Code-Seite von->DieseArbeitsmappe entfernt.

Als dann füge in die Code-Seite von->DieseArbeitsmappe' folgenden Code ein:
Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  
 ->Pruefen, ob SaveAs benutzt wurde
  If SaveAsUI Then
    
   ->Pruefen, ob Arbeitsmappe geändert wurde
    If Not ActiveWorkbook.Saved Then
    
      Call MyMakro->Makro für deine Verarbeitung
      Call CodeZeilenAusDieseArbeitsmappeEntfernen
    End If
  End If
End Sub
Damit wird das Save-Ereignis abgefangen.
Geprüft wird, ob es als SaveAs aufgerufen wurde und ob sich in der Arbeitsmappe etwas geändert hat. Wenn ja, wird zunächst dein Makro MyMakro ausgeführt und anschliessend CodeZeilenAusDieseArbeitsmappeEntfernen. Diese entfernt dann die Codezeilen aus->DieseArbeitsmappe' und damit ist der aufrufende Makro weg.

Gruß Matjes  ;)
 
  • #4
Ola,

so unterschiedlich ist eine Frage ohne nähere Angaben interpretierbar: Ich hatte angenommen, er meint Word ....

Die Idee ist interessant ... wie immer ;)
 
  • #5
Werd mich für Word auch darum bemühen - hab wohl Kartoffeln auf den Augen gehabt  ;D

Gruß Matjes  :)
 
  • #6
Also ohne Änderungsprüfung des Dokuments würde das für Word so aussehen:

Modul mit gleicher Funktion, aber eben für Word:
Code:
Function CodeZeilenAusThisDocumentEntfernen()
  Dim l_cnt As Long
  
  l_cnt = ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.CountOfLines
  ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.DeleteLines 1, l_cnt
End Function
Function MyMakro()
  MsgBox (Hier kann Code vor dem Speichern ausgeführt werden.)
End Function

In die Code-Seite von ThisDocument folgendes Makro eingeben:
Code:
Private Sub Document_Close()
  
  Const c_NameStandard = Word_ThisDocumentCodezeilenBeiSpeichernLoeschen.doc
  
  If ActiveDocument.Name <> c_NameStandard Then
    Call MyMakro
    Call CodeZeilenAusThisDocumentEntfernen
    ActiveDocument.Save
  End If
End Sub
Damit wird das Close-Ereignis abgefangen. Wenn der Documenten-Name nicht dem Wert von c_NameStandard entspricht, wird MyMakro und dann CodeZeilenAusThisDocumentEntfernen und entfernt die Code-Zeilen aus->ThisDocument'.
(in c_NameStandard  muß natürlich der richtige Dateiname eingetragen werden, sonst führt der Makro immer das Löschen aus  ;D )

Prüfung auf Änderung ist noch ein anderes Thema :'(

Gruß Matjes  :)
 
  • #7
;D Hallo ihr lieben, :D
ja ist ein Word Dokument.
Ihr seid einfach genial, funktioniert super!!!
ABER: ihr seid zu genial! 8)

Das Makro macht genau das was es soll, es löscht das Makro.
Allerdings schon während ich es bearbeite, also das alte Makro überarbeite. Speicher ich dann die Änderung, wird das Makro schon nicht mehr ausgeführt.
Zum Problem: Das Dokument soll ins Intranet gestellt werden, wird es von dort geöffnet, soll das Makro ausgeführt werden. Wird das bearbeitete Dokument dann gespeichert und erneut geöffnet, soll das Makro gelöscht sein, so wie die funktion es schon erledigt. Aber halt erst nach dem ersten öffnen!!

Help, I need somebody...help :'(

Gruß vom studnick
 
  • #8
Hi studnick,

in dieser Zeile muß der Dateiname angepaßt werden !

Code:
Const c_NameStandard = Word_ThisDocumentCodezeilenBeiSpeichernLoeschen.doc
Wenn der so lautet, wie die Datei heißt, passiert nix  ;D
Dann kannst Du auch in Ruhe deinen Makro editieren.

Du kannst auch den Aufruf des Löschmakros solange auskommentieren, bis Du dir sicher bist, daß alles andere läuft.
Einfach ein Apostroph vor
Code:
Call CodeZeilenAusThisDocumentEntfernen

Gruß Matjes  ;)
 
  • #9
gibt es eine Funktion, die bezweckt, dass ne Funktion im Makromodul erst dann gestartet wird, wenn der User dia Aktion speichern oder speichern unter ausführt?

Gruß Studnick
 
  • #10
Hi studnick,

also mir ist keine bekannt. :'(

Bis jetzt hab ich auch noch nichts dazu gefunden.

Gruß Matjes :)
 
  • #11
Danke Matjes,
hab auch noch nichts gefunden :'(

Werd weitersuchen und wenn ich was hab, werd ich es posten!
Vielleicht findet ja sonst noch jemand was...

Danke für die Bemühungen!!!!

Gruß Studnick
 
  • #12
Ola,

ich weiß auch mal was ;D

Wenn in Word ein Makro mit dem gleichen Namen belegt wird, wie ein Wordbefehl, dann wird das Makro ausgeführt, nicht der Befehl.

Beispiel

Code:
Sub DateiSpeichernUnter()
MsgBox (hallo)
End Sub
 
  • #13
:'( :'( :'( help  :'( :'( :'(
Irgendwie will das alles nicht so, wie ich will)  :-[

Also ich poste jetzt doch mal meinen (fast) gesamten Code.
Noch mal zum Problem: Es handelt sich um ein Word Dokument, dass ins Internet gestellt werden soll. Wird es von dort aufgerufen, soll das Makro aktiviert werden (sprich es wird gewählt um welche Firma es sich handelt). Wird das bearbeitete Dokument dann gespeichert und erneut geöffnet, soll kein Makro mehr aktiviert werden.

Ich hoffe ihr könnt mir helfen, ich hab keine Ahnung, was ich noch tun soll.

Gruß vom Studnick

Code:
'   97IMALLE.DOT                 vorlage für interne mitteil. etc. ALLE
'                               mit blocksatz
'   zugeordnete dateien:
'       imkonsta.dat            bearbeiter-variablen
'

Public Sub MAIN()
'Function MyMakro()

Dim datverz$
Dim von$
Dim zeichen$
Dim tel$
Dim x
Dim FirmenKz$
Dim ArtKz$
Dim l_cnt As Long

On Error Resume Next
vLauf = FormField.art
datverz$ = WordBasic.[DefaultDir$](2)

WordBasic.ToolsOptionsView DraftFont:=0, WrapToWindow:=0, PicturePlaceHolders:=0, FieldCodes:=0, Bookmarks:=0, FieldShading:=0, StatusBar:=1, HScroll:=1, VScroll:=1, StyleAreaWidth:=0 cm, Tabs:=0, Spaces:=0, Paras:=0, Hyphens:=0, Hidden:=0, ShowAll:=0, Drawings:=1, Anchors:=0, TextBoundaries:=0, VRuler:=1
WordBasic.TableGridlines 0

WordBasic.ScreenUpdating 0
WordBasic.ViewPage



On Error GoTo -1: On Error GoTo 0


DefineDialog:

WordBasic.BeginDialog 536, 380, Mitteilung->Breite, Höhe Alte Werte 536, 252
    WordBasic.GroupBox 10, 6, 211, 258,  FIRMA ->Abstand Links, Oben, Breite, Länge  Alte Werte 10, 6, 210, 118
    WordBasic.OptionGroup Firma
       -> Abstand links, Abstand oben, Breite Feld, Länge Feld
        WordBasic.OptionButton 26, 23, 68, 16, Firma1
        WordBasic.OptionButton 26, 40, 105, 16, Firma1
        WordBasic.OptionButton 26, 57, 88, 16, Firma1
        WordBasic.OptionButton 26, 74, 105, 16, Firma1
        WordBasic.OptionButton 26, 91, 70, 16, Firma1
        WordBasic.OptionButton 26, 108, 70, 16, Firma1
        WordBasic.OptionButton 26, 125, 70, 16, Firma1
        WordBasic.OptionButton 26, 142, 70, 16, Firma1
        WordBasic.OptionButton 26, 159, 120, 16, Firma1
        WordBasic.OptionButton 26, 176, 80, 16, Firma1
        WordBasic.OptionButton 26, 193, 80, 16, Firma1
        WordBasic.OptionButton 26, 210, 70, 16, Firma1
        WordBasic.OptionButton 26, 227, 83, 16, Andere
    WordBasic.TextBox 43, 242, 166, 18, AndereFirma
    
    WordBasic.GroupBox 10, 265, 211, 102,  ART DER MITTEILUNG ->Alte Werte 10,132,211,114
    WordBasic.OptionGroup Type
        WordBasic.OptionButton 26, 278, 161, 16, Interne Mitteilung
        WordBasic.OptionButton 26, 295, 96, 16, Protokoll
        WordBasic.OptionButton 26, 312, 145, 16, Besuchsbericht
        WordBasic.OptionButton 26, 329, 83, 16, Andere
    WordBasic.TextBox 43, 345, 170, 18, AndereArt
    WordBasic.Text 245, 8, 35, 13, von:
    WordBasic.TextBox 343, 8, 160, 18, From
    WordBasic.Text 245, 31, 68, 13, Zeichen:
    WordBasic.TextBox 343, 31, 160, 18, Characters
    WordBasic.Text 245, 54, 64, 13, Telefon:
    WordBasic.TextBox 343, 54, 160, 18, Telefon
    WordBasic.Text 245, 77, 25, 13, an:
    WordBasic.TextBox 343, 77, 160, 18, name1
    WordBasic.Text 245, 100, 56, 13, weitere, Text1
    WordBasic.Text 245, 112, 81, 13, Empfänger, Text2
    WordBasic.TextBox 343, 100, 160, 75, an2, 1
    WordBasic.OKButton 318, 238, 130, 21
    WordBasic.CancelButton 318, 269, 130, 21
WordBasic.EndDialog

Dim dlg As Object: Set dlg = WordBasic.CurValues.UserDialog

dlg.From = von$
dlg.Characters = zeichen$
dlg.Telefon = tel$

x = WordBasic.Dialog.UserDialog(dlg)
If x = 0 Then GoTo Ende



Select Case dlg.Type
    Case 0
        WordBasic.WW7_EditGoTo Destination:=art
        ArtKz$ = Interne Mitteilung
    Case 1
        WordBasic.WW7_EditGoTo Destination:=art
        ArtKz$ = Protokoll
    Case 2
        WordBasic.WW7_EditGoTo Destination:=art
        ArtKz$ = Besuchsbericht
    Case 3
        WordBasic.WW7_EditGoTo Destination:=art
        If dlg.AndereArt =  Then
            WordBasic.MsgBox Sie haben keine Mitteilungsart angegeben.
            GoTo DefineDialog
        Else
            ArtKz$ = UCase(dlg.AndereArt)
        End If
End Select

WordBasic.WW7_EditGoTo Destination:=firma
WordBasic.WW2_Insert FirmenKz$

WordBasic.WW7_EditGoTo Destination:=art
WordBasic.WW2_Insert ArtKz$

WordBasic.WW7_EditGoTo Destination:=von
WordBasic.WW2_Insert dlg.From
WordBasic.WW7_EditGoTo Destination:=Zeichen
WordBasic.WW2_Insert dlg.Characters
WordBasic.WW7_EditGoTo Destination:=Tel
WordBasic.WW2_Insert dlg.Telefon
WordBasic.WW7_EditGoTo Destination:=datum
WordBasic.InsertField Field:=AKTUALDAT \@  + Chr(34) + tt.MM.jjjj + Chr(34)
WordBasic.WW7_EditGoTo Destination:=an
WordBasic.WW2_Insert dlg.name1
WordBasic.WW7_EditGoTo Destination:=an2
WordBasic.WW2_Insert dlg.an2

WordBasic.EndOfDocument
WordBasic.WW7_InsertPageBreak

WordBasic.NormalViewHeaderArea Type:=0, FirstPage:=1, OddAndEvenPages:=0, HeaderDistance:= _
1,25 cm, FooterDistance:=0,80 cm
WordBasic.WW2_FormatBordersAndShading FromText:=1 pt, ApplyTo:=0, Shadow:=0, TopBorder:=0, _
LeftBorder:=0, BottomBorder:=0, RightBorder:=0, HorizBorder:=0, _
VertBorder:=0, TopColor:=0, LeftColor:=0, BottomColor:=0, _
RightColor:=0, HorizColor:=0, VertColor:=0, Shading:=0, _
Foreground:=0, Background:=0

'WordBasic.WW2_Insert Blatt 
'WordBasic.InsertField Field:=SEITE \* arabisch
WordBasic.WW2_Insert   + ArtKz$ +  /  + FirmenKz$ +  /  + dlg.From + , 
WordBasic.InsertField Field:=AKTUALDAT \@  + Chr(34) + tt.MM.jjjj + Chr(34) +  \* FORMATVERBINDEN

WordBasic.EndOfLine

WordBasic.StartOfLine 1
WordBasic.WW2_FormatBordersAndShading FromText:=1 pt, ApplyTo:=0, Shadow:=0, TopBorder:=0, _
LeftBorder:=0, BottomBorder:=0, RightBorder:=0, HorizBorder:=0, _
VertBorder:=0, TopColor:=0, LeftColor:=0, BottomColor:=0, _
RightColor:=0, HorizColor:=0, VertColor:=0, Shading:=0, _
Foreground:=0, Background:=0
WordBasic.WW2_FormatCharacter Font:=Arial, Points:=10, Bold:=0, Italic:=0, _
Strikeout:=0, Hidden:=0, SmallCaps:=0, AllCaps:=0, _
Underline:=0, Color:=0, Position:=0 pt, Spacing:=0 pt
WordBasic.FormatParagraph Alignment:=0, LeftIndent:=0 cm, RightIndent:=0,44 cm, FirstIndent:= _
0 cm, Before:=0 ze, After:=3 ze, LineSpacing:=0 ze, PageBreak:=0, _
KeepWithNext:=0, KeepTogether:=0, NoLineNum:=0

WordBasic.CloseViewHeaderFooter

WordBasic.EndOfDocument
WordBasic.WW6_EditClear -1

WordBasic.BeginDialog 588, 216, Teilnehmer/Verteiler
    WordBasic.Text 12, 6, 170, 13, Bemerkungen/Betreff, Text1
    WordBasic.Text 12, 70, 90, 13, Teilnehmer, Text2
    WordBasic.Text 267, 70, 120, 13, Kopie/Verteiler, Text4
    WordBasic.TextBox 12, 21, 565, 36, Bemerkungen, 1
    WordBasic.TextBox 12, 87, 242, 120, Teilnehmer, 1
    WordBasic.TextBox 267, 87, 160, 120, KopieVerteiler, 1
    WordBasic.OKButton 449, 112, 124, 21
    WordBasic.CancelButton 450, 151, 124, 21
WordBasic.EndDialog
Set dlg = WordBasic.CurValues.UserDialog

Set dlg = WordBasic.CurValues.UserDialog
x = WordBasic.Dialog.UserDialog(dlg)
If x = 0 Then GoTo Ende

WordBasic.WW7_EditGoTo Destination:=betreff
WordBasic.Insert dlg.Bemerkungen
WordBasic.WW7_EditGoTo Destination:=teilnehmer
WordBasic.Insert dlg.Teilnehmer
WordBasic.WW7_EditGoTo Destination:=KopieVerteiler
WordBasic.Insert dlg.KopieVerteiler
'WordBasic.WW7_EditGoTo Destination:=text

MsgBox (Makro jetzt löschen!)
'WordBasic.ScreenUpdating 1
'#########
'Löscht das Makro aus dem Dokument
'#########
l_cnt = ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.CountOfLines
  ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.DeleteLines 1, l_cnt

Call CodeZeilenAusThisDocumentEntfernen

Ende:

WordBasic.WW7_EditGoTo Destination:=text
WordBasic.ScreenUpdating 1


'End Function
End Sub

'Function CodeZeilenAusThisDocumentEntfernen()
 ->Dim l_cnt As Long
  
 ->l_cnt = ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.CountOfLines
 ->ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.DeleteLines 1, l_cnt
'End Function

Code ThisDokument:
Code:
Private Sub Document_Open()
  
  Const c_NameStandard = LoeschIMDAW.doc
  
  If ActiveDocument.Name <> c_NameStandard Then
    MAIN
    Call CodeZeilenAusThisDocumentEntfernen
    ActiveDocument.Save
  End If
End Sub
 
  • #14
Hallo zusammen,

@PCDJoe:
Der Tip war Gold wert  :D

Mit folgender Konstruktion klappt es:

Code in->ThisDocument':
Code:
Private Sub Documnet_Open()
  Call MyMakro
End Sub
Private Sub Document_Close()
  
  Const c_NameStandard = Word_OpenBeiSpeichernLoeschen.doc
  If b_SpeichernUnter Then
    Call CodeZeilenAusThisDocumentEntfernen
    ActiveDocument.Save
  End If
End Sub
'************************
Sub DateiSpeichernUnter()
  b_SpeichernUnter = True
 ->Call AufrufDateiSpeichernUnter
  Dialogs(wdDialogFileSaveAs).Show
End Sub
Code in->Modul1':
Code:
Global b_SpeichernUnter As Boolean

Function CodeZeilenAusThisDocumentEntfernen()
  Dim l_cnt As Long
  l_cnt = ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.CountOfLines
  ActiveDocument.VBProject.VBComponents(ThisDocument).CodeModule.DeleteLines 1, l_cnt
End Function
Code in->Modul2':
Code:
Function MyMakro()
  MsgBox (Hier kann Code vor dem Speichern ausgeführt werden.)
End Function

@studnick: Die Konstruktion, so wie oben beschrieben, beibehalten und deinen eigenen Makro in Modul2 Function MyMakro schreiben.

Die neue Funktion DateiSpeichernUnter überwacht, ob der SpeichernUnter-Dialog aufgerufen wird und speichert das in einer Variablen.

In der Close-Funktion wird überprüft, ob SpeichernUnter aufgerufen wurde. Wenn ja werden die Code-Zeilen aus->ThisDocument' gelöscht.
Also gelöscht wird erst beim Schliessen.

Gruß Matjes :)

ps: übers Internet - bedeutet das, daß das Document als html geöffnet? Dann wären alle Überlegungen umsonst, da im html-Format dieMakros nicht mitübertragen werden.
 
Thema:

Nach Speichern soll Makro gelöscht sein

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben