Hallo Gemeinde,
ich brauche mal wieder eure Hilfe :-\
In einem Formular möchte ich den Inhalt eines Anlagefeldes einer Tabelle in einem Listenfeld / Kombinationsfeld
anzeigen und auswählen können.
Also z.B. zum Datensatz 1 gehören 3 PDF Dateien und 1 Word Dokument die sollen im
Listenfeld / Kombinationsfeld angezeigt werden und der Benutzer soll durch klicken diese geöffnet bekommen.
Gibt es da einen Trick oder VBA-Code?
Ich würde mich riesig über eure Hilfe freuen :)
Gruß
Danny
Hallo Danny,
Der Trick ist auf Anlagefelder zu verzichten und Pfad- und
Dateiname in einer Extratabelle "tblDokumente" zu speichern,
mit einem Fremdschlüssel zum zugehörigen Datensatz. Da du
verschiedene Dokumente hast, würde ich vielleicht sogar noch
eine zusätzl. Tabelle "tblDokumenteArten" anlegen um darin die
Dateiextension und evtl. den Pfad zur Anwendung zu speichern,
und auch diese per FK in "tblDokumente" zu hinterlegen.
Das Öffnen der Dokumente erfolgt dann mit der "FollowHyperlink"-
Methode (siehe OH, dann fragen).
gruss ekkehard
Hallo Ekkehard,
das werde ich mal versuchen aber gibt es da dann auch eine einfache Möglichkeit den Dateipfad wie z.B. im Explorer auszuwählen.
Also wenn ich Dateien zufügen will dann soll ein Button gedrückt werden und ich kann die Datei auf dem PC suchen und dann durch einen anderen Button speichern????
Geht das? Im Netz habe ich dazu nix brauchbares gefunden.
Ich danke dir für die Hilfe und hoffe du hast hierzu auch eine Idee!! Eventuell auch ein einfaches Beispiel?
Gruß
Danny
Hallo,
klar geht das und nennt sich Filedialog.
Im Downloadbereich findest Du eines von vielen Beispielen:
http://www.access-o-mania.de/forum/index.php?action=downloads;sa=view;down=56
Ein anderes "Dateiauswahlfenster" findest Du in der MSO-Library (im VBA-Editor Verweis setzen) als Application.Filedialog
Moin und Danke DF6GL,
da werde ich mal mit rumspielen!!!
Gruß
Danny
Hallo Danny,
Den Filedialog brauchst du sicher, oder willst du Pfade und Dateinamen mit der Tastatur eingeben?
gruss ekkehard
Hallo Gemeinde :) ,
ich habe geglaubt ich habe es jetzt, aber nein weit gefehlt :-[
Ich habe Hondos Link benutzt und das Beispiel für Datei- und Verzeichnisdialog von Karsten Pries versucht abzuspecken so dass ich meine kleine Aufgabe erledigen kann. http://www.kpries.de/index.htm?Entwicklertools/filedialog.htm
Das klappt auch super der Datei-Link wird angezeigt und dann gespeichert.
Beim ausprobieren des Beispiels über frmMat öffnen dann auf Neu klicken wegen der Zuordnung der ID!!!
So und nun kommen meine Probleme:
1.
Beim Speichern in die Tabelle tblPfadSpeichern im Feld Pfad wird der Hyperlink nicht richtig gespeichert.
Wenn ich in der Tabelle einen Link manuell hinzufüge über rechts Klick dann klappt das mit dem öffnen. Aus dem Formular frmPfadSpeichern nach dem speichern allerdings nicht. In der Zeile steht das selbe aber die Farbe ist anders.
2.
Im Formular frmMat habe ich ein Kombinationsfeld (Prüfungshilfen) hier sollen die Links zu den einzelnen Datensätzen angezeigt werden und dann per Doppelklick geöffnet werden.
Aber ich kriege es nicht hin das so einzustellen, dass beim Doppelklicken der Link aus der 3 Spalte zum öffnen genommen wird.
Ich habe ein Beispiel erstellt wo das nachzuvollziehen ist und würde mich riesig freuen wenn da mal einer drüberschauen könnte. Ich habe Access 2016 und da gibt es kein Hyperlink mehr als Felddatentyp sondern nur noch Link. Ich hoffe das ist das selbe wie Hyperlink. Ach und im Modul FileDialog habe ich weggelöscht was ich nicht brauche. Wenn es da weiteres gibt was ich noch löschen kann dann würde ich mich auch freuen wenn ihr das einfach löscht und mein Beispiel wieder hochladet. Da im Netz sehr viele Fragen hierzu rumschwirren und es kaum einfache Beispiele für Anfänger gibt wäre das hier sehr Brauchbar.
Wieder einmal danke ich euch im vorraus fürs Lesen bis hier her :-[
Gruß
Danny
Hallo Danny,
Als erstes musst du die DB mal soweit bringen, dass sie fehlerfrei kompiliert
werden kann. Anschliessend "Reparieren/Komprimieren" und neu hochladen.
Dann musst du den Datentyp des Feldes "Pfad" umstellen auf "Text". Das hatte
ich in der ersten Antwort vergessen zu erwähnen.
Öffnen des Links mit
FollowHyperlink Me!Kombinationsfeld128
(unbedingt noch ordentlich benennen)
gruss ekkehard
Hallo Danny,
Sorry, gerade erst gesehen. "FollowHyperlink" hast du ja schon
verwendet. Allerdings im falschen Ereignis. Kombifelder werden
normalerweise "AfterUpdate" ausgewertet.
Das funzt dann allerdings nur mit einem Textfeld. Ein Hyperlinkfeld
bringt das von Haus aus mit.
gruss ekkehard
Danny, ich habe die Punkte einmal eingebaut.
Bei Verwendung von Hyperlink-Feldern braucht es keinen Doppelklick und auch keine Ereignisprozedur. Persönlich verwende ich die Dinger nie, sondern bevorzuge so etwas wie ShellExecute (http://vb-tec.de/shellexe.htm).
Hallo Lachtaube und Ekkehard, :)
Lachtaube:
das mit dem Link öffnen klappt bei dir super! :)
Aber ich kann keine Datei anfügen. :(
Das ich mit dem Aussuchen des zugehörigen Materials sollte auch automatisch laufen (bei 1500 Artikeln)
Ich habe die Dinge die Ekkehard mir geschrieben hat mal eingebaut und das Formular über die Qry erstellt jetzt zeigt er sie mir an und ich kann sie auch speichern.
Aber deine Möglichkeit direkt den Link anzuklicken ist optisch natürlich viel schöner. Also wenn du magst kannst du nochmal schauen?
Ekkehard:
Das fehlerfreie kompilieren scheint an der Access Version zu liegen. Ich habe 2016 und beim in .mdb wandeln meckert er das ich Features aus 2106 benutze die ich noch nicht gefunden habe.
Also ich danke euch schon einmal für die schnelle Hilfe und stelle hier nochmal die Aktuelle Version rein.
(an .mdb arbeite ich!!!)
Danny,
dass Dein Klassen-Modul zerschossen ist und nicht 64-Bit-fähig ist, obwohl es das vorgibt, habe ich noch nicht erwähnt.
Zum Anderen ist es wenig sinnvoll, in einer Tabelle, die neben Material-Id nur noch einen Dateipfad enthält, diesen leer lassen zu dürfen oder gar mit dem Text (keine) zu bestücken. Und in der Regel passen Pfadanganben auch noch in ein Textfeld (Kurzer Text).
Das Formular über die Abfrage der beiden Tabellen (soetwas mag ich zur Datenpflege gar nicht - warum kein Unterformular?) dürfte ja bereits alle Detaildatensätze anzeigen. Was soll denn da ein Kombifeld noch bezwecken? Wandle das Ding in ein Textfeld um und sperre es. Dann funktioniert Dein Doppelklick, der mich gleich beim Testen mit einer Zip-Datei genervt hat.
Moin Lachtaube nochmal,
also ich habe Access 2106 mit 64 bit und er macht eigentlich das was er soll. Ich verstehe nicht was bei euch so zerschießt :(
Bei den Tabellen handelt es sich nur um ganz vereinfachte Beispiele. Die tblMat hat normalerweise 20 Felder mit verschiedenen UFOs.
Das was in der tblPfadSpeichern steht wird wohl auch noch durch 2 weitere Felder ergänzt.
Es geht darum einem Datensatz also Artikel die Beipackzettel, Anleitungen und so ein Zeugs zuzuführen und diese dann bei Bedarf zu öffnen.
Der Inhalt des frmMat hat normalerweise 3 UFOs und ich wollte das nicht noch voller machen aber ich schätze du hast recht!
Aber so wie ich es jetzt reingestellt habe funktioniert es bei mir. Nur ist deine Version optisch schöner mit dem Link Direkt-Klick.
Da mache ich mir jetzt auch Sorgen ob ich das auf einem anderen Rechner zum laufen bringe!
Ich danke dir wirklich für deine Mühe. Da ich immer noch nur wenig von VBA verstehe habe ich so meine Problemchen.
Gruß
Danny
Noch ein Nachtrag,
ich wollte ein Kombifeld da es zu einem Datensatz auch verschiedene Dokumente geben kann und da soll der Benutzer auswählen was er öffnen muss.
Gruß
Danny
Hier habe ich mal Deine Type-Deklaration der von Win32AP_PtrSafe.txt (https://support.microsoft.com/de-de/help/2030490/office-2010-help-files-win32api-ptrsafe-with-64-bit-support) von Microsoft gegenübergestellt und IMHO fehlerhafte Stellen mit einem Stern (*)am Anfang der Zeilen markiert. Desweiteren ist im sogenannten 32-Bit-Bereich die Kopfzeile Private Type BROWSEINFO auskommentiert. Statt #If Win64 Then wäre es besser #If VBA7 Then zu verwenden und nur unterschiede zwischen 64- und 32-Bit Deklarationen (die gibt es aber hier niht nicht) als solche zu unterscheiden.
Private Type TOpenFileName Private Type OPENFILENAME
* lStructSize As LongPtr lStructSize As Long
hOwner As LongPtr hwndOwner As LongPtr
hInstance As LongPtr hInstance As LongPtr
lpstrFilter As String lpstrFilter As String
lpstrCustomFilter As String lpstrCustomFilter As String
nMaxCustFilter As Long nMaxCustFilter As Long
nFilterIndex As Long nFilterIndex As Long
lpstrFile As String lpstrFile As String
nMaxFile As Long nMaxFile As Long
lpstrFileTitle As String lpstrFileTitle As String
nMaxFileTitle As LongPtr nMaxFileTitle As Long
lpstrInitialDir As String lpstrInitialDir As String
lpstrTitle As String lpstrTitle As String
* Flags As LongPtr flags As Long
nFileOffset As Integer nFileOffset As Integer
nFileExtension As Integer nFileExtension As Integer
lpstrDefExt As String lpstrDefExt As String
lCustData As LongPtr lCustData As LongPtr
lpfnHook As LongPtr lpfnHook As LongPtr
lpTemplateName As LongPtr lpTemplateName As String
End Type '#if (_WIN32_WINNT >= 0x0500)
pvReserved As LongPtr
dwReserved As Long
FlagsEx As Long
'#endif // (_WIN32_WINNT >= 0x0500)
End Type
Kann ich damit gar nicht arbeiten? :-\
Oder besser kann ich das ändern?
Habe den Code doch wie oben beschrieben auf Hondos Empfehlung hier
http://www.kpries.de/index.htm?Entwicklertools/filedialog.htm als Vorlage runtergeladen
und nur das weggelösch was ich für zuviel hielt. Und bei mir läuft es komischer Weise (allerdings unter 64 Bit)
Zweifelhafte Typen-Deklarationen würde ich nicht verwenden. Kopiere Dir die überarbeitete Klasse aus meinem Beispiel, was allerdings nur unter 32-Bit getestet ist.
Super Danke das werde ich versuchen!!! :)
Hallo Lachtaube,
funktioniert das Beispiel von Dir bei dir???
Ich kann im frmPfadSpeichern die ctlOpen (Datei öffnen) drücken aber es passiert nichts.
Geht das bei dir???
Ja - sonst hätte ich es nicht gepostet.
Ok dann kann ich das so noch nicht nutzen weil unter Acess 2016 64 Bit läuft das nicht. :(
Werde die Tage alles in Ruhe mal durchschauen und melde mich nochmal.
Danke das du dir die Zeit für mein Problem nimmst. Echt ein super Forum :)
Prüfe mal, was die MsgBox an dieser Stelle sagt.
With OpenDlg
.lStructSize = LenB(OpenDlg) 'geändert
MsgBox .lStructSizeDa sollte 152 bei einer 64-Bit Version erscheinen; unter 32-Bit sollten es 88 sein.
Sorry Lachtaube jetzt hab ich leider keinen Plan wie du das meinst :-[
Prüfe mal, was die MsgBox an dieser Stelle sagt.
Muss ich was erstellen oder wo finde ich den Code!??
Sorry bin wohl im Moment zu dusselig
OK hab es doch gefunden ist 152
Ahh ok das hat geholfen :)
jetzt geht es Großartig :) :D
Danke du bist die Beste!!!!!!! :-*