Feldnamen als Dateinamen in Word

  • #1
B

berliner-loewe

Bekanntes Mitglied
Themenersteller
Dabei seit
20.02.2004
Beiträge
4.606
Reaktionspunkte
0
Ort
Berlin
Hallo Gemeinde,

hoffe auf eure Hilfe.

Wie kann ich dafür sorgen das ein bestimmter Inhalt eines Formularfeldes den Dateinamen für ein Worddokument bildet?
Versionen sind Word 2000 und Word 2003.

Danke im voraus
 
  • #2
Ola,

das war doch mal ne Fragen für den Start in den Tag:
Eingefügtes Formularfled hat Textmarkennamen Text1. wird beim Verlassen berechnet. Bei den Eigenschaften des Felds beim Verlassen das nachfolgende Makro wählen (muss natürlich vorher mit Alt+f11 in das Modul NewMacros kopiert werden.

Code:
Sub SaveAs_form()
'
' SaveAs_form Makro
' Makro erstellt am 29/07/2005 von Jörg Schumacher
'
    Dim strBookmark As String
    strBookmark = ActiveDocument.Bookmarks(Text1).Range
    ActiveDocument.SaveAs FileName:=strBookmark
End Sub
 
  • #3
Hallo Joe,

danke für den Lösungsvorschlag.

Bin noch nicht zum Testen gekommen.

Feedback folgt ;)
 
  • #4
Hallo Joe,

habe es jetzt getestet.

Läuft bei mir nicht :'(

Code:
Sub SaveAs_form()
'
' SaveAs_form Makro
' Makro erstellt am 29/07/2005 von Jörg Schumacher
'
  Dim strBookmark As String
  strBookmark = ActiveDocument.Bookmarks(Text1).Range
  ActiveDocument.SaveAs FileName:=strBookmark
End Sub

Für Tex1 habe ich den Namen meiner Textmarke eingegeben, war das richtig?
 
  • #5
Hallo bla bla,

hinter dem Range fehlt ein .Text.

Ich hab das noch etwas ausgewalzt. Dieser Makro sagt dir was fehlt.

Gruß Matjes :)
Code:
Sub SpeichernUnterNamenVonTextmarke()
  
  Const c_Bookmark = Text1
  
  Dim doc As Document, s_Bookmark As String
  Dim ret As Integer, l_SaveDisplayAlerts As Long
  Dim s_Path As String, s_Filename As String, s_FilenameFull As String
  
  Set doc = ActiveDocument
  
  On Error Resume Next
  
 ->Textmarke lesen
  s_Bookmark = ActiveDocument.Bookmarks(c_Bookmark).Range.Text
  If Err.Number <> 0 Then
    Err.Clear
    MsgBox (Die notwendige Textmarke-> & c_Bookmark &-> ist nicht vorhanden.)
    GoTo AUFRAEUMEN
  End If
  
 ->Textmarke leer
  If s_Bookmark =  Then
    MsgBox (Die Textmarke-> & c_Bookmark &-> ist leer.)
    GoTo AUFRAEUMEN
  End If
  
 ->Ist das Dokument bereits gespeichert ?
  If doc.Saved Then
   ->ja: dann verwende den Pfad des bereits gespeicherten Dokumentes
    s_Path = doc.Path
  Else
   ->nein: dann verwende den Default-Pfad
    s_Path = Options.DefaultFilePath(Path:=wdDocumentsPath)
  End If
  
 ->Filenamen ggf um .doc erweitern
  If LCase(Right(s_Bookmark, 4)) = .doc Then
    s_Filename = s_Bookmark
  Else
    s_Filename = s_Bookmark & .doc
  End If
  
 ->voller Filename
  s_FilenameFull = s_Path & Application.PathSeparator & s_Filename
  
 ->prüfen, ob file bereits vorhanden ist
  If Dir(s_FilenameFull) <>  Then
    
    ret = MsgBox( _
            Es existiert bereits ein file mit dem Namen:  & vbCrLf & _
            s_FilenameFull & vbCrLf & vbCrLf & _
            Soll das bereits vorhanden file überschrieben werden ?, _
            vbCritical + vbDefaultButton1 + vbYesNo)
    
    If ret = vbNo Then GoTo AUFRAEUMEN
    
  End If
  
 ->Dokument speichern 
  l_SaveDisplayAlerts = Application.DisplayAlerts
  Application.DisplayAlerts = wdAlertsNone
  ActiveDocument.SaveAs FileName:=s_FilenameFull
  Application.DisplayAlerts = l_SaveDisplayAlerts
    
  If Err.Number <> 0 Then
    MsgBox ( _
      Das Dokument konnte nicht gespeichert werden. & vbCrLf & _
      Name:-> & s_FilenameFull &->)
    GoTo AUFRAEUMEN
  End If

AUFRAEUMEN:
  On Error GoTo 0
  Set doc = Nothing
End Sub
 
  • #6
Hallo Matjes,

irgendwie funktioniert es nicht :'(

HAbe das MAkro gespeichert und
Code:
Const c_Bookmark = Text1
angepasst
Code:
Const c_Bookmark = Kundennummer
Dies ist der Name der Textmarke des Textformularfeldes.

Wo liegt der Fehler ???

Danke für eure Geduld.
 
  • #7
Welche Fehlermeldung kommt denn ?

Gruß Matjes :)
 
  • #8
Matjes schrieb:
Welche Fehlermeldung kommt denn ?

Gruß Matjes :)

Keine :-\

Als Dateinamen wird das zweite Wort der ersten Zeile vorgeschlagen :-\
 
  • #9
Hallo bla bla,

mir scheint du willst, daß das Makro immer aufgerufen wird, wenn Du SpeichernUnter aufrufst. Das klappt natürlich nicht.

Betätige mal Alt+F8 und wähle dann SpeichernUnterNamenVonTextmarke aus.

Gruß Matjes :)
 
  • #10
Hallo Matjes,

:-[ :-[ :-[

Sorry.habe wohl vergessen dies anzugeben :-[

Das Makro sollte gestartet werden wenn man die Schaltfläche Speichern in der Symbolleiste betätigt oder über die Menüleiste Speichern oder Speichern unter speichern möchte.
 
  • #11
Hi bla bla,

also mit anderen Worten - der Makro an sich funktioniert.

Dann zu der erweiterten Lösung. Ein paar Sachen sind noch zu klären.

Was soll passieren, wenn
a) keine Textmarke des entsprechenden Namens vorhanden ist
b) Textmarke keinen vernünftigen Inhalt hat
c) Datei unter dem entsprechneden namen schon existiert
...

Gruß Matjes :)
 
  • #12
Hallo Matjes,

a) keine Textmarke des entsprechenden Namens vorhanden ist

Gibt es nicht.

b) Textmarke keinen vernünftigen Inhalt hat

Der Inhalt sieht wie folgt aus:
ZZZBZZZZZZ
Z=Ziffer
B=Buchstabe

Wenn der Inhalt nicht vollständig vorhanden ist, sollte eine entsprechende Meldung kommen, damit der Mitarbeiter dies korregieren kann.

Dies sollte auch bei keinem Inhalt erfolgen, mit dem zusätzlichen Hinweis unter Name_Vorname des Kunden zu speichern.

c) Datei unter dem entsprechneden namen schon existiert

Sollte ebenfalls ein Hinweis kommen und zusätzlich das Speichern verbieten.
Müsste dann Fallweise vor Ort geklärt werden.
Vielleicht fällt mir oder Dir aber eine elegantere Lösung ein.

Danke vielmals :)
 
  • #13
Hi bla bla,

nun eine Version zum Ausprobieren.

Erstelle mal eine Kopie deiner Vorlage.
Dann öffnest Du diese Kopie als Vorlage (nicht Dokument !).
Mit Alt+F11 den VB-Editor öffnen und den Makro in->ThisDocument' dieser Vorlage kopieren.
Mit Alt+Q den VB-Editor wieder schliessen.
Vorlage speichern und schliessen.

Neues Dokument auf Basis dieser Vorlage öffnen und ausprobieren.
(Du mußt natürlich dafür Sorgen, daß die TM Kundennummer auch mit einer Kundennummer versorgt wird.)

Gruß Matjes :)

Code:
Option Explicit
Sub DateiSpeichernUnter()
  If Not x_SpeichernUnterNamenVonTextmarke Then
    
   ->!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ->Wenn diese Zeile auskommentiert wird,
   ->wird der Speichernunterdialog
   ->im Fehlerfall nicht mehr angeboten
    Dialogs(wdDialogFileSaveAs).Show
  
  End If
End Sub

'****************************************************************************************
Function x_SpeichernUnterNamenVonTextmarke() As Boolean
  
  Const c_Bookmark = Kundennummer
  Const c_TxT_Chef = vbCrLf & vbCrLf & Bitte beim Chef nachfragen!
  
  Dim doc As Document, s_Bookmark As String
  Dim ret As Integer, l_SaveDisplayAlerts As Long
  Dim s_Path As String, s_Filename As String, s_FilenameFull As String
  
  
  x_SpeichernUnterNamenVonTextmarke = False
  
  Set doc = ActiveDocument
  
  On Error Resume Next
  
 ->Textmarke lesen
  s_Bookmark = ActiveDocument.Bookmarks(c_Bookmark).Range.Text
  If Err.Number <> 0 Then
    Err.Clear
    MsgBox ( _
      Die notwendige Textmarke-> & c_Bookmark &-> ist nicht vorhanden. & _
      c_TxT_Chef)
    GoTo AUFRAEUMEN
  End If
  
 ->Textmarken-Inhalt auf Zulässigkeit prüfen
  If Not TextmarkeInhaltPruefen(s_Bookmark) Then
    MsgBox ( _
      Textmarken-Inhalt von Textmarke-> & c_Bookmark &-> ist unzulässig. & _
      vbCrLf & s_Bookmark & c_TxT_Chef)
    GoTo AUFRAEUMEN
  End If
  
 ->Ist das Dokument bereits gespeichert ?
  If doc.Saved Then
   ->ja: dann verwende den Pfad des bereits gespeicherten Dokumentes
    s_Path = doc.Path
  Else
   ->nein: dann verwende den Default-Pfad
    s_Path = Options.DefaultFilePath(Path:=wdDocumentsPath)
  End If
  
 ->Filenamen ggf um .doc erweitern
  If LCase(Right(s_Bookmark, 4)) = .doc Then
    s_Filename = s_Bookmark
  Else
    s_Filename = s_Bookmark & .doc
  End If
  
 ->voller Filename
  s_FilenameFull = s_Path & Application.PathSeparator & s_Filename
  
 ->prüfen, ob file bereits vorhanden ist
  If Dir(s_FilenameFull) <>  Then
    
    ret = MsgBox( _
          Es existiert bereits ein file mit dem Namen:  & vbCrLf & _
          s_FilenameFull & vbCrLf & vbCrLf & _
          Soll das bereits vorhanden file überschrieben werden ? & _
          c_TxT_Chef, _
          vbCritical + vbDefaultButton1 + vbYesNo)
    
    If ret = vbNo Then GoTo AUFRAEUMEN
    
  End If
  
 ->Dokument speichern unter Inhalt der Textmarke
  l_SaveDisplayAlerts = Application.DisplayAlerts
  Application.DisplayAlerts = wdAlertsNone
  ActiveDocument.SaveAs FileName:=s_FilenameFull
  Application.DisplayAlerts = l_SaveDisplayAlerts
    
  If Err.Number <> 0 Then
    MsgBox ( _
      Das Dokument konnte nicht gespeichert werden. & vbCrLf & _
      Name:-> & s_FilenameFull &-> & c_TxT_Chef)
    GoTo AUFRAEUMEN
  End If
  
  x_SpeichernUnterNamenVonTextmarke = True

AUFRAEUMEN:
  On Error GoTo 0
  Set doc = Nothing
End Function

'****************************************************************************************
Private Function TextmarkeInhaltPruefen(s_TM As String) As Boolean
 ->Prüft Inhalt der Textmarke Kundennummer auf
 ->ZZZBZZZZZZ
 ->Z = Ziffer
 ->B = Buchstabe
  
  Dim s As String, x As Long
  
  TextmarkeInhaltPruefen = False
  
 ->Länge prüfen
  If Len(s_TM) <> 10 Then GoTo AUFRAEUMEN
  
  For x = 1 To Len(s_TM)
    s = Mid(s_TM, x, 1)
    Select Case s
      Case A To Z, a To z
        If x <> 4 Then
          MsgBox ( _
            Textmarke->Kundennummer' enthält an der  & _
            x & .ten Stelle ein unzulässiges Zeichen. & vbCrLf & _
           ->Kundennummer':  & s_TM)
            GoTo AUFRAEUMEN
        End If
      Case 0 To 9
        If x = 4 Then
          MsgBox ( _
            Textmarke->Kundennummer' enthält an der  & _
            x & .ten Stelle ein unzulässiges Zeichen. & vbCrLf & _
           ->Kundennummer':  & s_TM)
            GoTo AUFRAEUMEN
        End If
      Case Else
          MsgBox ( _
            Textmarke->Kundennummer' enthält an der  & _
            x & .ten Stelle ein unzulässiges Zeichen. & vbCrLf & _
           ->Kundennummer':  & s_TM)
            GoTo AUFRAEUMEN
    End Select
  Next

  TextmarkeInhaltPruefen = True
AUFRAEUMEN:
End Function
 
  • #14
Ola,

da schaut manmal drei Tage nicht drauf und schon ufert das aus ....
:)

Aber es wäre tatsächlich schon am Anfang nett gewesen, die Frage konkreter zu stellen ....
 
  • #15
PCDjoe schrieb:
Aber es wäre tatsächlich schon am Anfang nett gewesen, die Frage konkreter zu stellen ....

Da hasz Du sicher recht, sorry :-[

@Matjes

Funktioniert leider nur mit Speichern unter

Habe aber eine Lösung.
Werde sie morgen oder so einstellen.

Danke an euch zwei :)
 
  • #16
Hi bla bla,

das ist auch zunächst so gewollt ;D

Um das auch auf Datei-Speichern zu erweitern, müßtest Du nur die Sub DateiSpeichernUnter() duplizieren und in Sub DateiSpeichern() umbenennen.

Gruß Matjes :)
 
  • #17
So, hier noch die Lösung mit der ich arbeite

Code:
Sub FileSaveAs(x)
 Dim strPath   As String
 Dim strFileName As String
 Dim lngFormat  As Long
 Dim lngRetVal  As Long
 Dim nPos    As Long

 On Error GoTo err_Handler-> Fehler werden hier abgefangen

If x = 1 Then GoTo weiter:
If x = 3 Then GoTo weiter:

  spName = ActiveDocument.FormFields(Kundennummer).Result-> spName ist Variable für speichername
If spName =  Then MsgBox Ihr Feld Kundennummer zum Speichern ist leer!!!) & vbNewLine & der Speichername heißt jetzt >>Kundenname<<: spName = Name_Vorname


 strPath = c:\temp-> Standart Pfad
 strFileName = spName
 lngFormat = wdFormatdot-> Format wie doc, txt, toc...

 If Right$(strPath, 1) <> \ Then  -> prüfung für selbsternannten Pfad
  strPath = strPath & Application.PathSeparator
 End If

 With Application.Dialogs(wdDialogFileSaveAs)-> aufruf der Speichermeldungen
  .Name = strPath & strFileName
  .Format = lngFormat

  lngRetVal = .Display
  If lngRetVal = -1 Then
   strPath = WordBasic.FileNameInfo$(.Name, 5)
   strFileName = WordBasic.FileNameInfo$(.Name, 3)

   If InStr(1, strFileName, .) > 0 Then-> prüfung des Speichernamens + format
    #If VBA6 Then
      nPos = InStrRev(strFileName, .)
    #Else
      nPos = InStrRevVB5(strFileName, .)
    #End If
    strFileName = Left$(strFileName, nPos - 1)
   End If

   If Len(strFileName) > 50 Then  -> prüfung ob zeichenlänge nicht überschritten
    MsgBox Sorry... der Dateiname darf nicht  & _
        länger als 50 Zeichen sein !, _
        vbOKOnly + vbInformation
    GoTo exit_Sub
   End If

   strFileName = strPath & strFileName->speicherroutine
   ActiveDocument.SaveAs FileName:=strFileName, _
      FileFormat:=lngFormat
   If x = 2 Then
   GoTo weiter:
   End If
  Else
   MsgBox Du hast grad->Abbrechen' geklickt !, _
       vbOKOnlyvbInformation
  End If
 End With

exit_Sub:
 On Error GoTo 0
 Exit Sub

@Matjes

Werde jetzt mal probieren deinen Code anzupassen. ;)
 
Thema:

Feldnamen als Dateinamen in Word

ANGEBOTE & SPONSOREN

Statistik des Forums

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