Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Kein Zugriff auf Datei nach speichern im Dateisystem (VBA?!)

Frage Microsoft Microsoft Office

Mitglied: greatsteffen

greatsteffen (Level 1) - Jetzt verbinden

29.08.2006, aktualisiert 30.08.2006, 5591 Aufrufe, 5 Kommentare

Ein Worddokument wird per Makro auf dem Server abgelegt (gespeichert). Da es aber noch geöffnet ist kann ein Prozess auf dem Server nicht auf das Dokument zugreifen und es verarbeiten.

Wie in der Einleitung kurz geschildert, kann der Serverprozess, welcher alle 2 Minuten das Verzeichnis überprüft nicht auf die geöffneten Worddokumente zugreifen. Ich möchte die Dokumente nun irgendwie schließen (das Handle oder sonst was, sodass der Server diese anpacken kann und verarbeiten. Es sollen ja nur Snapshots von dem Dokument gespeichert werden und kein permanenter verlauf.

kurz um >> Das Worddokument schließen ohne es wirklich zu schließen ;)

Am besten das ganze per vba-makro....

wenn jemand eine idee hat wäre das super!
Mitglied: Biber
29.08.2006 um 14:13 Uhr
Na, "irgendwie schließen" könnte aber den normalen Arbeitsablauf Deiner User geringfügig beeinträchtigen.
Reicht ein .Document.Save nicht?

Ich würde die Word-Datei im reinen Nur-Lese-Modus öffnen im neuen Prozess.
Wenn ich überhaupt etwas davon "lesen" will.

Was soll den das hehre Ziel dieses Serverprozesses sein?

Gruß
Biber
Bitte warten ..
Mitglied: greatsteffen
30.08.2006 um 08:03 Uhr
auf dem verzeichnis auf dem server lauscht ein xmlmaker, welcher auf eine steuerdatei wartet, die durch ein makro im word zusammen mit dem dokument selbst auf dem server abgelegt werden. dieser xml maker erzeugt eine neue datei (xml), die an ein archivsystem übergeben wird. dieses archivsystem schnappt sich das xml-file und packt es zusammen mit dem doc ins archivierungssystem.

klingt alles ein wenig kompliziert, klappt aber eigentlich schon ganz gut, nur eben an dem punkt, wo das archivsystem das erzeugte xml-file schnappt und zusammen mit dem word-dokument verarbeiten will hakt es, weil das word dokument ja noch beim user geöffnet ist.

das ding ist nur, es soll ja auch beim user geöffnet bleiben, damit er weiter dran arbeiten kann. jedesmal, wenn er das archivierungsmakro ausführt bekommt die datei einen neuen timestampnamen. somit ist es möglich immer wieder eine neuere versin des dokumentes im archiv abzulegen.

und zum schluss:
erst beim erneuten ausführen des makros wird ja die "alte" dokumentversion geschlossen und eine neue auf dem server angelegt, somit kann nun die alte version verarbeitet werden. der user soll aber nicht 2 mal auf das makro klicken um die als erstes erzeugte version ins archiv zu bekommen.

die lösung:???
meine idee wäre nun den kram zuerst in einem zwischenordner zu speichern und nach dem speichern die dateien in den eigentlichen zielordner zu kopieren. nach der zeit x wird der zwischen ordner per task geleert (z.b. nachts um 24 uhr, dann erwischt man hoffentlich keine "noch nicht in den zielordner verschobenen dateien".

das ganze ist aber recht umständlich und deswegen soll das ja auch irgenwie per makro klappen, das ich dem rechner, ähnlich wie im unixsystem, die datei untern hintern wegziehe, obwohl er sie noch offen hat...

Mit freundlichen Grüßen - Steffen
Bitte warten ..
Mitglied: greatsteffen
30.08.2006 um 10:38 Uhr
ich hab das makro erweitert und versuche das Doc zu kopieren, allerdings verweigert er mir den zugriff auf das doc!!!!

kann man den kopiervogang erzwingen?
Bitte warten ..
Mitglied: Biber
30.08.2006 um 10:46 Uhr
ich hab das makro erweitert und versuche das
Doc zu kopieren, allerdings verweigert er mir
den zugriff auf das doc!!!!

kann man den kopiervogang erzwingen?

Kannst Du denn von diesem Makro bzw. von der letzten Erweiterung mal die relevanten Zeilen posten bitte?

Das ist mir so (noch) zu abstrakt.

Danke
Biber
Bitte warten ..
Mitglied: greatsteffen
30.08.2006 um 11:54 Uhr
ok - das prob schein zu 99% gelöst!
hab trick 17 angewendet, auch wenn das nicht die beste variante ist.
ich speichere das dok einfach sofort ein 2.mal mit einem anderem namenszusatz, dann kann ich die erste version weiterverarbeiten.


der gesamte makrocode sieht so aus (sollte auch in einem blanko dokument funzen):
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

01.
Sub Archiv() 
02.
Dim Sektion$, ApplicationTag$, Sender$, File$, Zielpfad$, Zwischenablage$, Steuerdateierweiterung$, Dateiname_hps$, Nrtype$ 
03.
 
04.
    '------------- Parameterbelegung ------------------ 
05.
     
06.
    'Speicherpfad für beide Dateien (HPS und DOC) 
07.
    Zielpfad = "\\testserver\testverzeichnis\" 
08.
    Zwischenablage = "\\testserver\testverzeichnis\Zwischenablage\" 
09.
    Steuerdateierweiterung = "hps" 
10.
     
11.
    '--------------------------------------------------- 
12.
    
13.
    'Auslesen des Bereiches zwischen 2 Textmarken 
14.
    Dim Textmarke_1, Textmarke_2, Textmarke_3, Textmarke_4 
15.
     
16.
    'Textmarken, zwischen denen der Text ausgewählt wird 
17.
    Textmarke_1 = "KUNDENNR" 
18.
    Textmarke_2 = "KUNDENNR_ENDE" 
19.
    Textmarke_3 = "LIEFERANTENNR" 
20.
    Textmarke_4 = "LIEFERANTENNR_ENDE" 
21.
     
22.
     
23.
    '########## Prüfen ob Kunde ############################ 
24.
    Dim kDoc As Document 
25.
    Dim kRange As Range 
26.
     
27.
    Set kDoc = ActiveDocument 
28.
    If kDoc.Bookmarks.Exists(Textmarke_1) And kDoc.Bookmarks.Exists(Textmarke_2) Then 
29.
        Set kRange = kDoc.Range(Start:=kDoc.Bookmarks(Textmarke_1).Range.Start, End:=kDoc.Bookmarks(Textmarke_2).Range.Start) 
30.
        kRange.Select 
31.
        'Wenn Kundennummer gefunden wurde 
32.
        If kRange <> " " And kRange <> "" Then 
33.
            Nrtype = "Kunde" 
34.
            'MsgBox (kRange) 
35.
             
36.
            Call Titel(Zielpfad, Zwischenablage, Steuerdateierweiterung, kRange, Nrtype) 
37.
             
38.
        Else 
39.
            '########## Prüfen ob Lieferant ####################### 
40.
            Dim lDoc As Document 
41.
            Dim lRange As Range 
42.
             
43.
            Set lDoc = ActiveDocument 
44.
            If lDoc.Bookmarks.Exists(Textmarke_3) And lDoc.Bookmarks.Exists(Textmarke_4) Then 
45.
                Set lRange = lDoc.Range(Start:=lDoc.Bookmarks(Textmarke_3).Range.Start, End:=lDoc.Bookmarks(Textmarke_4).Range.Start) 
46.
                lRange.Select 
47.
                'Wenn Lieferantennummer gefunden wurde 
48.
                If lRange <> " " And lRange <> "" Then 
49.
                    Nrtype = "Lieferant" 
50.
                    'MsgBox (NrType) 
51.
                     
52.
                    Call Titel(Zielpfad, Zwischenablage, Steuerdateierweiterung, lRange, Nrtype) 
53.
                     
54.
                Else 
55.
                    '####### wenn keine KDNR und keine LFRNR gefunden wird #################### 
56.
                    Nrtype = "Unbekannt" 
57.
                    Call Case_manuell(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
58.
                End If 
59.
            Else 
60.
                '####### Falls keine Textmarken nach Lieferantensuche gefunden werden ####################### 
61.
                Call Case_manuell(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
62.
            End If 
63.
        End If 
64.
    Else 
65.
    '####### Falls keine Textmarken gefunden werden ########### 
66.
    Call Case_manuell(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
67.
    End If 
68.
     
69.
End Sub 
70.
 
71.
 
72.
Function Case_manuell(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
73.
Dim Mldg, Stil, Titel, Hilfe, Ktxt, Antwort, Text1 
74.
Mldg = "Es wurden keine Textmarken gefunden" & vbCrLf & "Soll eine manuelle Zuweisung vorgenommen werden?" 
75.
Stil = vbYesNo + vbCritical + vbDefaultButton1 
76.
Titel = "Fehler beim Auslesen der Textmarken" 
77.
Antwort = MsgBox(Mldg, Stil, Titel) 
78.
If Antwort = vbYes Then 
79.
  Call Neue_Nummer(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
80.
Else 
81.
    
82.
End If 
83.
End Function 
84.
 
85.
 
86.
Function Neue_Nummer(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nrtype) 
87.
    'Nach Nummerfragen 
88.
    Dim manuelle_Nummer 
89.
    manuelle_Nummer = InputBox("Keine Kundennummer oder Lieferantennummer gefunden." & vbCrLf & vbCrLf & vbCrLf & vbCrLf & "Bitte Nummer eingeben.", "Manuelle Nummerzuweisung für " & Nrtype, "") 
90.
    If manuelle_Nummer = "" Then 
91.
       manuelle_Nummer = " " 
92.
    End If 
93.
 
94.
    Call Titel(Zielpfad, Zwischenablage, Steuerdateierweiterung, manuelle_Nummer & " ", Nrtype) 
95.
End Function 
96.
 
97.
 
98.
Function Titel(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nummer, Nrtype) As Variant 
99.
    'Name des Dokuemtes eingeben 
100.
    Dim DocName 
101.
    DocName = InputBox("Bitte Dokumentname eingeben:", "Dokumentname für Schreiben an " & Nrtype & " (Nr." & Nummer & ")", "neues Dokument") 
102.
    If DocName = "" Then 
103.
       DocName = "Neues Dokument" 
104.
    End If 
105.
     
106.
    'Nochmal fragen ob Dokument wirklich ins Archiv geschoben werden soll 
107.
    Dim Archivantwort 
108.
    Archivantwort = MsgBox("Möchten Sie das Dokument wirklich ins Archiv einfügen?", vbYesNo + vbQuestion + vbDefaultButton1, "Einfügen bestätigen") 
109.
    If Archivantwort = vbYes Then 
110.
        'speichern 
111.
        Call Speichern(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nummer, DocName) 
112.
    Else 
113.
        'nix 
114.
    End If 
115.
End Function 
116.
 
117.
Function Speichern(Zielpfad, Zwischenablage, Steuerdateierweiterung, Nummer, DocName) As Variant 
118.
     
119.
    'Variablen zum Speichern 
120.
    Dim Sektion$, ApplicationTag$, Sender$, File$ 
121.
     
122.
    'Dateipfad und Name fuer HPS und DOC aus Datum basteln 
123.
    Dim Part(1 To 3) As String 
124.
    Part(1) = Zwischenablage 
125.
    Part(2) = Format(Date, "yyyymmdd") + "_" + Format(Time, "hhmmss") 
126.
    Part(3) = "." & Steuerdateierweiterung 
127.
    Dateiname_hps = Part(1) & Part(2) & Part(3) 
128.
    'MsgBox (Dateiname_hps) 
129.
 
130.
    'Erste Zeile (mit eckigen Klammern) 
131.
    Sektion = "[Info]" 
132.
     
133.
    'ApplicationTag 
134.
    ApplicationTag = "ApplicationTag=" & Nummer & DocName 
135.
    'MsgBox (ApplicationTag) 
136.
 
137.
    'Sender 
138.
    Sender = "Sender=" & Environ("Username") 
139.
    'MsgBox (Sender) 
140.
 
141.
    'File 
142.
    File = "File=" & Part(2) & ".doc" 
143.
    'MsgBox (File) 
144.
     
145.
    'HPS schreiben 
146.
    Open Dateiname_hps For Append As 1 
147.
    Print #1, Sektion$ 
148.
    Print #1, ApplicationTag$ 
149.
    Print #1, Sender$ 
150.
    Print #1, File$ 
151.
    Close #1 
152.
     
153.
    'Dokumentpfad und Name der Word-Datei aus Datum basteln 
154.
    Dim Part_doc(1 To 3) As String 
155.
    Part_doc(1) = Zwischenablage 
156.
    Part_doc(2) = Part(2) 
157.
    Part_doc(3) = ".doc" 
158.
    Dateiname_doc = Part_doc(2) & Part_doc(3) 
159.
         
160.
    'DOC schreiben in Zwischenablageordner 
161.
    ChangeFileOpenDirectory Part_doc(1) 
162.
    ActiveDocument.SaveAs FileName:=Dateiname_doc, FileFormat:= _ 
163.
        wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _ 
164.
        True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _ 
165.
        False, SaveNativePictureFormat:=False, SaveFormsData:=False, _ 
166.
        SaveAsAOCELetter:=False 
167.
         
168.
    'DOC schreiben in Zwischenablageordner mit Namenszusatz "_saved" 
169.
    Dim Dateiname_Saved 
170.
    Dateiname_Saved = Part_doc(2) & "_saved" & Part_doc(3) 
171.
    ChangeFileOpenDirectory Part_doc(1) 
172.
    ActiveDocument.SaveAs FileName:=Dateiname_Saved, FileFormat:= _ 
173.
        wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _ 
174.
        True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _ 
175.
        False, SaveNativePictureFormat:=False, SaveFormsData:=False, _ 
176.
        SaveAsAOCELetter:=False 
177.
          
178.
         
179.
    'von der Zwischenablage in den Zielpfad kopieren 
180.
    Dim Datei_hps 
181.
    Datei_hps = Part(2) & Part(3) 
182.
    Call Copy_to_Target(Zwischenablage, Zielpfad, Datei_hps, Dateiname_doc) 
183.
     
184.
End Function 
185.
 
186.
Function Copy_to_Target(Zwischenablage, Zielpfad, Datei_hps, Dateiname_Dokument) 
187.
     
188.
    'HPS und DOC kopieren 
189.
    FileCopy Zwischenablage & Datei_hps, Zielpfad & Datei_hps 
190.
    FileCopy Zwischenablage & Dateiname_Dokument, Zielpfad & Dateiname_Dokument 
191.
     
192.
    'HPS und DOC aus Zwischenablageordner löschen (nur geöffnetes DOC ist noch da!) 
193.
    Kill Zwischenablage & Datei_hps 
194.
    Kill Zwischenablage & Dateiname_Dokument 
195.
End Function
verbesserungsvorschläge??
ist natürlich ein bissel umständlich 2 mal was zu speichern und es nach dem kopieren wieder zu löschen, aber immerhin klappt es! ;)

die restlichen "leichen" aus dem zwischenablagenordner kanni ich ja nachts (wenn hoffentlich kein mitarbeiter mehr ein dok offen hat) per task löschen lassen...

;)
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
gelöst CSV-Datei mit einem VBA Makro in Excel einlesen und leicht anpassen (5)

Frage von JoSiBa zum Thema Microsoft Office ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

VB for Applications
gelöst Xml-Datei laden bzw. auf Festplatte kopieren und per VBA in eine Access-Tabelle speichern (22)

Frage von machohunk zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...