PDA

Vollständige Version anzeigen : Bei bestimmten Zeichen Fehlermeldung


tosoma
22.10.2007, 16:27
Guten Abend,

mit folgendem Code speichere ich nach bestimmten Namensvorgaben eine von Access geöffnete Word Datei aus Acess heraus ab.

Public Sub Save()
Dim Meldung, Titel, Voreinstellung, Wert
Meldung = "Datei speichern unter"
Titel = "Meldung"
Voreinstellung = Forms![frmAusgang]![txtDateiname]
Wert = InputBox(Meldung, Titel, Voreinstellung)
On Error GoTo Save2:
If Forms![frmAusgang]![txtName1] = "" Then
objWordDoc.SaveAs Wert

Da es häufig Probleme gibt, wenn in der Benamsung, den der User in der Inputbox verändern kann, ein Punkt gesetzt wird (die Datei wird dann nicht mehr als Word Datei erkannt), möchte ich diesen Fall (das nämlich in dem Dateinamen ein Punkt vorkommt) mit einer MsBox abfangen und dem User die Neueingabe nahelegen bzw vorschreiben.

Würdet ihr mir bitte helfen? Geht das mit instr und wenn ja, wie genau?

Vielen Dank im Voraus

Mathias

ebs17
22.10.2007, 17:17
Verzichte auf die Inputbox, weil (http://www.dbwiki.de/wiki.php?title=Access_Design:Inputbox)

Besser ist ein ungebundenes Formular. Hier kannst Du Dateiname und -pfad gemäß den Bildungsvorschriften vorbelegen (Dateierweiterung ".doc" in einem zusätzlichen Bez.-Feld anzeigen und intern anhängen).
So weiß der Anwender besser, was er eintragen soll, und Du kannst besser eine Fehlerbehandlung einsetzen.

hcscherzer
22.10.2007, 17:19
Moin Mathias,
mit dim p as long
p = instr(wert, ".doc")
if p > 0 thenkannst Du prüfen ob die Zeichenfolge '.doc' in 'wert' vorkommt.
Mit if right(wert, 4) = ".doc" thenkannst Du testen, ob diese Zeichen ganz rechts stehen, wo sie hingehören ...

tosoma
22.10.2007, 17:22
danke, ebs 17,

aber: die .DOC Prozedur ist ja schon fertig angelegt, es funktioniert alles prima und die meisten User wissen es auch. Ich wollte halt nur den "." abfangen. Eine Msgbox wäre mir also wirklich lieber. Trotzdem Danke für die Aufmerksamkeit

ebs17
22.10.2007, 17:24
Ich meine das etwa so (siehe Grafik). Hier hat mein Anwender im Normalfall nur den Teilausdruck "Datei-705548" durch einen von ihm gewünschten zu ersetzen. Wenn er schläft und nichts eingibt, hat die Datei, die angelegt wird, wenigstens schon einen Namen.

hcscherzer
22.10.2007, 17:26
Ich meine das etwa so:Aber wenn er denn nun partout eine InputBox haben möchte ... oder war's jetzt doch 'ne MsgBox ;)

tosoma
22.10.2007, 17:26
Vielleicht hab ich mich falsch ausgedrückt:

Über Access wählt der User einen Adressaten für einen Brief. Der Name des Adressaten wird als Voreinstellung für den Dateinamen übernommen. Wenn jetzt der Adressat H. Meyer heißt oder F.B.I., dann wird der Punkt in der Voreinstellung übernommen. Dies und auch die versehentliche Falscheingabe soll verhindert werden. Das ".doc" wird automatisert angefügt, darum muss sich der User nicht kümmern.

hcscherzer
22.10.2007, 17:29
Es gäba da noch die Funktion replace(wert, ".", "_")

ebs17
22.10.2007, 17:39
@ hcscherzer:
Ich wurde an anderer Stelle mal nachdrücklich von einer erfahrenen Forumsteilnehmerin darauf hingewiesen, dass man nicht nur dem Willen des Fragenden nachgeben sollte, sondern Zusammenhänge auch richtig (und ausreichend) darstellen soll -> Lerneffekt. Ab und zu versuche ich es.
An der Stelle, als ich meinen Beitrag schrieb, schien mir diese Interpretation der Frage als noch zutreffend.

hcscherzer
22.10.2007, 17:42
von einer erfahrenen ForumsteilnehmerinSoll ich mal den Namen raten?

Anne Berg
22.10.2007, 17:58
HuHu :winken:

;)

Ich würde die Aussage gern näher hinterfragen, wieso denn die Doc-Eigenschaft verloren geht.Das ".doc" wird automatisert angefügt, Wie denn, bitte? Zeige doch bitte den vollständigen Code, sonst hat die Fehlersuche wenig Sinn.

PS: Ich würde nach dem Vorschlag von Hans-Christian (Beitrag #3) verfahren.

tosoma
22.10.2007, 18:12
Welche Fehlersuche?

Es gibt gar keinen Fehler! Ich wünsche doch nur eine Ergänzung zu dem Code, der eigentlich wunderbar funktioniert. Ich möchte nur eben vermeiden, dass Benutzer bei der Benamsung einer Datei einen Punkt eingeben. Für den Fall, dass sie es tun, sollen sie mit einen Hinweis zurückverwiesen werden auf die Inputbox.

Gruß

Mathias

Anne Berg
22.10.2007, 18:20
Ich meinte dabei diesen Fehler:Da es häufig Probleme gibt, wenn in der Benamsung, den der User in der Inputbox verändern kann, ein Punkt gesetzt wird (die Datei wird dann nicht mehr als Word Datei erkannt),

PS: Ich verstehe nicht, dass immer der Benutzer der Dumme sein soll, wenn etwas nicht funktioniert. Ich jedenfalls möchte mir nicht vorschreiben lassen, wie ich meine Dateien zu benennen habe - außer vom Betriebssystem persönlich. ;)

tosoma
22.10.2007, 18:38
Ok, der Einwand ist berechtigt, Anne.

ich habe ein Modul "Files Dialog", welches eine Art Dateimangaer aufruft:

Public Function FilesDialog(Optional OpenSave As Boolean = True, _
Optional Titel As String, Optional Filter As String, _
Optional DefExtension As String, Optional AktDir As String, _
Optional Flags As Long, Optional hwnd As Long = 0) As String
' Öffnet den "Datei öffnen"- bzw. "Speichern unter"-Dialog
' liefert den ausgewählte(n) Pfad und Dateinamen zurück

On Error GoTo Er
Dim Res As Long, OpenDlg As OPENFILENAME, Dateiname As String

Dateiname = String$(512, 0)

With OpenDlg
If IsMissing(Titel) Then
If OpenSave Then
.lpstrTitle = "Datei öffnen" & Chr$(0)
Else
.lpstrTitle = "Datei speichern unter" & Chr$(0)
End If
Else
.lpstrTitle = Titel & Chr$(0)
End If

If IsMissing(Filter) Then
.lpstrFilter = "Alle Dateien" & Chr$(0) & "*.*" & Chr$(0) & Chr$(0)
Else
.lpstrFilter = Filter & Chr$(0)
End If

If IsMissing(DefExtension) Then
.lpstrDefExt = Chr$(0)
Else
.lpstrDefExt = DefExtension & Chr$(0)
End If

If IsMissing(AktDir) Then
.lpstrInitialDir = CurDir$ & Chr$(0)
Else
.lpstrInitialDir = AktDir & Chr$(0)
End If

If IsMissing(Flags) Then
If OpenSave Then
.Flags = OFN_FILEMUSTEXIST Or OFN_READONLY ' bzw. HideReadOnly
Else
.Flags = 0
End If
Else
.Flags = Flags
End If

.lStructSize = Len(OpenDlg)
.hWndOwner = 0
If hwnd = 0 Then
On Error Resume Next
.hWndOwner = Screen.ActiveForm.hwnd
On Error GoTo Er
End If
.nFilterIndex = 1
.lpstrFile = Dateiname
.nMaxFile = Len(Dateiname)
If OpenSave Then
Res = GetOpenFileName(OpenDlg)
Else
Res = GetSaveFileName(OpenDlg)
End If
If Res <> 0 Then
FilesDialog = Left$(.lpstrFile, InStr(.lpstrFile, Chr$(0)) - 1)
Else
FilesDialog = ""
End If
End With

Ex:
On Error Resume Next
Exit Function

Er:
MsgBox "FileOpen: " & Err.Description
Resume Ex
End Function

Das Resultat, wenn eine Datei einen Punkt enthält, sieht dann so aus:

Anne Berg
22.10.2007, 18:43
Das beantwortet nicht meine Frage, wo denn das ".doc" angehängt wird. Du tust es also offensichtlich nicht, dann verweise ich nochmals auf Beitrag #3.


PS: ich dachte die Eingabe erfolgt per InputBox?! :confused:

achtelpetit
22.10.2007, 19:48
Dann will ich auch noch meinen Senf dazugeben: Wenn die User die Dateinamen innerhalb der vom Betriebssystem gesetzten Grenzen frei bestimmen können, dann tun die das auch.
Das Resultat wird mit großer Sicherheit ein niedliches Sammelsurium von Abkürzungen aller Art sein und nach einem halben Jahr oder ganz Gewiss, wenn einer der Kollegen geht, kann das kein Mensch mehr entziffern.
Ein vergleichbares Problem hab' ich gelöst, indem ich maschinell Verzeichnisnamen aus der Kundennummer erzeugt habe und die Kollegen sanft dränge, dahinein zu speichern. So bleibt jedes Dokument wenigstens beim richtigen Kunden.

tosoma
23.10.2007, 09:09
.....Guten Morgen Anne,

das Doc wird angehängt durch folgenden Code:
Public Sub Save()
Dim Meldung, Titel, Voreinstellung, Wert
Meldung = "Datei speichern unter"
Titel = "Meldung"
Voreinstellung = Forms![frmAusgang]![txtDateiname]
Wert = InputBox(Meldung, Titel, Voreinstellung)
On Error GoTo Save2:
If Forms![frmAusgang]![txtName1] = "" Then
objWordDoc.SaveAs Wert

Else

MkDir "M:\Schriftverkehr\Ausgang\" & Forms![frmAusgang]![txtName1] & "-" & Forms![frmAusgang]![txtVorname] & "\"

End If

Save2:
objWordDoc.SaveAs ("M:\Schriftverkehr\Ausgang\" & Forms![frmAusgang]![txtName1] & "-" & Forms![frmAusgang]![txtVorname] & "\" & Wert)

End Sub

Nicht, dass Du denkst, ich würde mich zieren, Deine hilfreichen Gednaken nicht mitzudenken.

Grüße von Mathias

Anne Berg
23.10.2007, 09:21
Ich fragte, wo die Dateiendung ".doc" an den Dateinamen angehängt wird - ist das so schwer zu verstehen?

PS:
Nicht umsonst habe ich bereits mehrfach auf Beitrag #3 verwiesen - bislang offenbar vergebens. :(

tosoma
23.10.2007, 10:12
das objWorddoc intitialisiert ein neues Word Objekt

Anne Berg
23.10.2007, 10:14
Sag mal, spreche ich chinesisch?! :confused:

Hier mal die komplette Prozedur, um alle weiteren Missverständnisse zu vermeiden.
Public Sub Save()
Dim Meldung, Titel, Voreinstellung, Wert
Meldung = "Datei speichern unter"
Titel = "Meldung"
Voreinstellung = Forms![frmAusgang]![txtDateiname]
Wert = InputBox(Meldung, Titel, Voreinstellung)
If right(wert,4) <> ".doc" Then wert = wert & ".doc"
On Error GoTo Save2:
If Forms![frmAusgang]![txtName1] = "" Then
objWordDoc.SaveAs Wert
Else
MkDir "M:\Schriftverkehr\Ausgang\" & Forms![frmAusgang]![txtName1] & "-" & Forms![frmAusgang]![txtVorname] & "\"
End If
Save2:
objWordDoc.SaveAs ("M:\Schriftverkehr\Ausgang\" & Forms![frmAusgang]![txtName1] & "-" & Forms![frmAusgang]![txtVorname] & "\" & Wert)
End Sub
BTW:Ist objWordDoc ein globales Objekt?

tosoma
23.10.2007, 10:19
Mandarin oder Kanton?

Tatsächlich verstehe ich nun wirklich nicht, worauf Du hinaus willst, Anne. Es findet kein "anhängen" eines ".doc" statt. Es wird ein neues Word Dokument erzeugt. Bei meinem Probelm geht es lediglich um den Dateinamen, nicht um die Art der Datei oder um die Endung.

tosoma
23.10.2007, 10:30
Private objWordDoc As Word.Document


Public Function OpenDoc(strDocument As String, bIsTemplate As Boolean) As Word.Document
If bIsTemplate Then
Set objWordDoc = objWord.Documents.Add(Template:=strDocument)
Else
Set objWordDoc = objWord.Documents.Open(strDocument, , , False)
End If
Set objRange = objWord.ActiveDocument.Range
objRange.Start = 1
objRange.End = objRange.Start
'benutzerdefinierte Eigenschaft des Word-Dokuments ansprechen
On Error Resume Next
objWordDoc.Datafilename = CurrentDb.Name
Err = 0
On Error GoTo 0
Set OpenDoc = objWordDoc
End Function

Anne Berg
23.10.2007, 10:47
Es findet kein "anhängen" eines ".doc" statt. Und genau da liegt der Hund begraben.Bei meinem Probelm geht es lediglich um den Dateinamen, nicht um die Art der Datei oder um die Endung.Das siehst du leider falsch. Dein Problem ist das fehlende .doc am Ende, wenn der Dateiname einen Punkt enthält. Also gehst du auf Nummer sicher und fügst in jedem Fall die korrekte Dateiendung an! Somit überlässt du nichts dem Zufall und dem Anwender die Freiheit der Namenswahl.

Ich hoffe, das war jetzt verständlich genug.
Und schau dir bitte auch noch einmal den Nachtrag zu meinem vorigen Beitrag an.

tosoma
23.10.2007, 12:09
Vielen Dank, Anne.

Nun habe ich zwar Deinen Hinweis, den Anwender nicht zum Dummen zu machen, erfolgreich berücksichtigt, die Datei kann nun Punkte auf Deubel komm raus haben, jedoch:

In einem Kombinatioansfeld werden mir sämtliche Dateien angezeigt. Mit einem Doppelklich auf eine beliebige Datei im Kombi kann ich es öffnen, dies geschieht mithilfe von:
Private Sub OpenFile_Click()
On Error Resume Next


If Not IsNull(Me!Dateifld) Then
If File_exist(Me!PfadFld & "\" & Me!ListDateien) = True Then
OpenFileVar = Me!PfadFld & "\" & Me!ListDateien
DoOpenFile = ShellExecute(Me.hwnd, vbNullString, OpenFileVar, vbNullString, vbNullString, 1)
End If


End Sub

Auch hier wird eine .doc Datei nicht geöffnet, wenn vorher im Dateinamen Punkte sind.

Kannst Du mir trotz meiner Dich auf die Palme bringenden Begriffstutzigkeit bitte sagen, wie ich das (wahrscheinlich in der Shellexecute-Prozedur?) verändern muss?

Danke

Anne Berg
23.10.2007, 12:24
In der Prozedur fehlt ein "End IF"...

Aber davon abgesehen, an den Punkten liegt es ganz gewiss nicht, wenn die Datei nicht geöffnet wird.

Vielleicht solltest du mal eine Fehlerbehandlung einbauen, anstatt auftretende Fehler zu ignorieren?

PS:
Zeig doch mal einen Dateinamen aus deinem Kombifeld bei dem es klappt und einen bei dem es nicht klappt. Vielleicht sehen hundert Augen ja mehr als 2. ;)

tosoma
23.10.2007, 12:43
Das End If fehlt nur hier, in der Prozedur ist es drin, aber danke trotzdem.

einer, wo es klappt: A S D 120907 mr.doc
einer, wo es nicht klappt: jhgfkjg..asdfoji231007 mr.doc.

Anne Berg
23.10.2007, 12:45
Sehe ich da einen Punkt am Ende oder ist der wieder nur hier und nicht im Kombifeld?! :confused:

tosoma
23.10.2007, 12:49
Gutes Auge! Der ist nur hier. War als Satzende versehentlich eingegeben.

Anne Berg
23.10.2007, 12:52
Wie sieht's aus mit dem Zugriffspfad, ist das immer derselbe?

tosoma
23.10.2007, 12:55
Ja, immer der selbe Pfad und beide heir benannte Dateien befinden sich auch im selben Pfad.

tosoma
23.10.2007, 12:58
aus der Windows-Umgebung lässt sich diese alberene Datei auch problemlos öffnen.

Anne Berg
23.10.2007, 13:10
Wie verhält sich das genau, gibt es einen Fehler?
Es muss doch irgendeinen Grund geben...

Welche Windows-Version läuft bei dir?
Kannst du eine Test-DB hochladen?

Nachtrag:
Ich habe das Beispiel mal nachgestellt, es läuft auch mit ShellExecute.

tosoma
23.10.2007, 13:17
Windows XP prof. SP2.
TestDB wird schwierig.

Ich bin sehr beeindruckt von Deiner Hartnäckigkeit, Anne. Vielen Dank

Anne Berg
23.10.2007, 13:23
Ja, dafür bin ich wohl bekannt... :cool:

Ich weiß, du würdest lieber die Punkte entfernen! ;)