Schneeflocke Geschrieben 24. Mai 2002 Geschrieben 24. Mai 2002 Hi ihr! ich möchte einen ganz normalen Common Dialog ("Datei öffnen") haben wenn ich auf den kleinen Button mit den "..." drauf klick, was in anderen Proggis dem "Durchsuchen" entspricht. Habs auch hinbekommen jedoch möchte ich ja auch ein File öffnen: ich klick es an und es passiert nichts. Per Zufall hab ich eben gesehen, dass er in "zuletzt verwendete Dokumente" die versuchsweise geöffneten Dateien aber erkannt und weggeschrieben hat. wie krieg ich es hin, dass er die datei öffnet, z.B. eine Exceldatei öffnet? :confused: Thx SF P.S.: ich versuche mich immer noch in Visual Basic Zitieren
progmaker Geschrieben 24. Mai 2002 Geschrieben 24. Mai 2002 Wie wär's mit ein Bisschen Code? Zitieren
Goos Geschrieben 24. Mai 2002 Geschrieben 24. Mai 2002 Jo find ich auch...n bissl Code waer nicht schlecht :OD Dieser DateiDialog ist halt wirklilch nur ein Dialog zur Dateiauswahl. Der oeffnet oder schliesst gar nix, sondern kann nur zurueckgeben, was angewaehlt wurde. Oeffnen mussts dann schon noch selbst Goos Zitieren
Schneeflocke Geschrieben 27. Mai 2002 Autor Geschrieben 27. Mai 2002 Ihr seid sehr hilfreich *pfff* logisch dass man programmieren muss! Hab ich ja auch programmiert! nur das "OpenFile" funzt nicht, es steht zwar überall, dass noch was geschrieben werden muss, damit er auch tatsächlich öffnet, jedoch nicht WAS. Und das Öffnen muss nun mal mit dem Dialog zusammenhängen, weil man sich ja dort die Datei aussucht. Ich bitte hier um fachliche Hilfe und nicht um Sachen, die jeder normale Mensch sich denken kann! Cu SF Zitieren
Tiana Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 Hi, also im Großen und Ganzen müsste Dein Code so aussehen: 'Öffnen- Dialog anzeigen dlg.DialogTitle = "Import" dlg.FileName = "*.*" dlg.Filter = "Alle Dateien (*.*)|*.*" dlg.Flags = cdlOFNFileMustExist dlg.ShowOpen If dlg.FileName = "*.*" Then GoTo Exit_Import End If 'EXE-Dateien öffnen Shell dlg.FileName, vbNormalFocus Exit_Import: Exit Sub Allerdings kann man mit Shell nur EXE-Dateien öffnen. Wenn Du eine XLS öffnen willst, dann musst du mit ActiveX arbeiten. Das habe ich aber auch noch nicht gemacht und kann Die daher keinen Code zur Verfügung stellen, aber viellleicht hilft Dir der Tipp ja trozdem weiter. Gruß, Tiana Zitieren
Schneeflocke Geschrieben 27. Mai 2002 Autor Geschrieben 27. Mai 2002 danke tiana, funzt leider bei mir immernoch nicht. bin ich mit OpenFile (cdl.FileName) derart verkehrt? Option Explicit Private Sub cdl_ShowOpen() With cdl .CancelError = True .InitDir = "c:\windows" .Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly .Filter = "Alle Dateien (*.*)|*.*" .FilterIndex = 1 .ShowOpen OpenFile (cdl.FileName) End With End Sub :confused: Greetz Flocke Zitieren
Klotzkopp Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 Original geschrieben von Schneeflocke bin ich mit OpenFile (cdl.FileName) derart verkehrt? Was bitte, glaubst Du denn, sollte OpenFile machen? Ich glaube ja eher, du suchst das hier: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q170918 Zitieren
Tiana Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 Hi, mhhh, an sich nicht, allerdings wird jetzt die Dati nicht mit Excel geöffnet, sondern er stellt Sie nur für eine interne Verarbeitung zur verfügung. D.h. Du könntest jetzt den Zelleninhalt mittels FileSystemObject auslesen. Du musst, wie schon gesagt mit ActiveX arbeiten und mit eigenen dll`s. Näheres zu ActiveX kannst Du jedem guten VB- Buch entnehmen, Zitieren
Schneeflocke Geschrieben 27. Mai 2002 Autor Geschrieben 27. Mai 2002 Original geschrieben von Klotzkopp Was bitte, glaubst Du denn, sollte OpenFile machen? ~~ÖFFNEN?? Ich glaube ja eher, du suchst das hier: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q170918 ~~ danke für den Link, werd mal stöbern. CU Zitieren
Klotzkopp Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 Original geschrieben von Schneeflocke ~~ÖFFNEN?? Das ist weder so trivial noch so eindeutig, wie Du offenbar glaubst. Dein Dateiname ist zunächst einmal nichts weiter als ein Verweis auf eine Menge Daten auf einem Datenträger. Diese Datei kannst Du in Deinem Programm öffnen, und die Daten lesen, aber Du wirst mit den Daten nicht viel anfangen können. Ich vermute mal, dass Du möchtest, dass Excel die Datei öffnet. Da stehen ganz andere Betriebsystemfunktionen dahinter, immerhin muss u.U. Excel erst mal gestartet werden. Das ganze ließe sich mit ActiveX lösen. Aber auch ShellExecute sollte tun, was Du willst. Zitieren
StarLord Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 @Tiana! Als ich deinen Code-Beispiel gelesen habe viel mir nur eines ein: Uuuuaaaaahhh! Wer hat DIR denn das Programmieren beigebracht? 1. Um Himmelswillen! GOTO verwendet man heutzutage auch in Visual Basic NICHT mehr, so etwas wird nur im NOTFALL (und in Assembler) eingesetzt. 2. Filename besetzt man meist überhaupt nicht vor, es sei denn man will eine bekannte Daten öffnen, z.B. "setup.ini" Um "*.*"-Dateien anzeigen zu lassen gibt es den Filter. 3. Dein ShowOpen wird nicht abgefangen. Wenn der Benutzer auf Cancel drückt kann man dies abfragen und dann kannst du dir auch dein GOTO schenken. 4. Der Ansatz mit Shell war schon nicht schlecht. Wenn er die Excel-Dateien wirklich mit Excel öffnen will, sollte man aber "shell start dlg.FileName" benutzen 5. Ich glaube kaum dass er es schafft _direkt_ auf die EXCEL-Dateien zugreifen zu können. Mehr als Öffnen oder Schließen wird wohl nicht drin sein. CSVs wird er schon noch schaffen, aber XLS-Dateien... nö, das schafft er nie. Gruß, StarLord Zitieren
Tiana Geschrieben 27. Mai 2002 Geschrieben 27. Mai 2002 Hi, also erstens mal, mangels Zeit meiner Ausbilder und weil ein Lehrgang zu teuer war musste ich mir das Programieren anhand von Unterlagen selber beibringen und dafür finde ich mache ich das ganz gut. zu 2. Wenn Du meinen Code gelesen hast ist Dir sicher aufgefallen, dass ich den Filter benutzt habe, um die Dateierweiterung einzugeben. Die zu öffnende Datei wurde ja vorher im Öffnen-Dialog übergeben, so das ich mit der Eigenschaft FileName eigentlich nur den Pfad und Namen der ausgewählten Datei übergeben habe- ich verstehe da dein Problem nicht. Mit ShowOpen wird übrigens nur angezeigt, welchen Dialog ich anzeige nämlich den ÖffnenDialog und das brau auch gar nicht abgefangen werden. zu 1. Mir ist schon klar, dass man nach Möglichkeit kein GOTO verwenden sollte, aber was machst Du, wenn der Anwender keine Datei auswählt und Trozdem auf OK klickt???? Da es sich bei dem angeführten Code eigentlich um eine Importschnittstelle handelt hätte das eine Interessante Fehlermeldung gegeben und die muss eben abgefangen werden. Ich hätte auc ganz am Anfang schrieben können On err GOTO, aber das wäre auf das selbe rausgekommen. Manchmal ist das Benuzten von GOTO eben doch erlaubt und sinnvoll. zu 4. Gib doch mal in einem VB-Prog Shell start <File> ein. Ich wette mit Dir, das es nicht funktioniert, weil er den Parameter Start nicht kennt. zu 5. wie auch VB-scripte zeigen ist es kein Problem mit Hilfe des Filesystemobjects auf xls-Dateien zuzugreifen (OpenFile()) und sie auszulesen und auch zu überschreiben. Das dürfte zeimlich genau auf VB zu übertragen sein, das es sich hier um Methoden des FSO handelt. Excel Datein nicht nur zum Bearbeiten zu öffnen (mit FSO), sondern auch anzuzeigen (was 2 verschiedene Dinger sind) ist eine andere Sache, hierfür muss man wirklich mit ActiveX arbeiten. Ich habe eher das Gefühl, dass Du meinen kleinen Codeauszug, der nur als Anregung gedacht war) weder richtig gelesen, noch verstanden hast. Aber wenn Du so schlau bist kannst Du sicher ein Code-Beispiel für die Lösung mit ActiveX angegeben??? Gruß, Tiana Zitieren
Schneeflocke Geschrieben 27. Mai 2002 Autor Geschrieben 27. Mai 2002 Leute bitte keinen Streit Ich danke jedenfalls schonmal für eure Hilfe und Mühe! Was ich jetzt schon öfters gehört habe ist, dass ein Pfad durch den Common Dialog existiert. Wie komme ich an diesen Pfad, das wär meine Rettung!! Thx Flöckchen Zitieren
Tiana Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi, du bekommst den Dateinamen und Pfad der im Öffnen-Dialog ausgewählten Datei, indem Du folgende Eigenschaft abfragst: CommonDialog.FileName (CommonDialog=name deines CommonDialogs) Zum Test kannst Du Dir das Ergebnis mit Hilfe einer MsgBox anzeigen lassen: Msgbox commondialog.FileName Du kannst den Pfad natürlich auch an eine Stringvariable übergeben und weiterverarbeiten. Gruß, Tiana Zitieren
Boro Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi ! zum letzten Beitrag hätte ich auch eine Frage, da komme ich nämlich gerade nicht weiter. Den Pfad habe ich mit der FileName-Methode zurückbekommen (z.B. "C:\Programme\Zubehör\wordpad.exe"), den Wert habe ich in eine Stringvariable hinterlegt. Aber wenn ich jetzt versuche mit Shell die Datei zu öffnen, bekomme ich trotzdem einen Laufzeitfehler "Datei nicht gefunden". Laut MSDN gibt Filename nur den Dateinamen zurück, also ohne Verzeichnis. Aber in der Variable steht doch der Pfad mit drin ???:confused:??? Das gleiche Problem hab ich mit der Fileexistens-Methode, da bekomme ich permanent False zurück, obwohl sich die Datei bei einer manuellen Eingabe des Pfades + Datei (+Erweiterung) ohne Probleme starten läßt. @Tiana Die Lösung mit dem Goto ist übrigens aus meiner Sicht gar nicht mal so verkehrt, aber ein "Exit Sub" in der IF-Bedingung reicht auch. Gruß Feivel Zitieren
Tiana Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Mhhh, also ich habe kein Problem mit dem FileExist und dem FileName. Allerdings musst du daran denken, dass man mit schell nur exe- Dateien ausführen kann. Kannst Du mal das Stück Code einstellen, vielleicht finde ich ja den Haken? Gruß, Tiana Zitieren
KarlBerg Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi, ich hab das so gemacht. dann kann man auch mehrere Dateien gleichzeitig auswählen, und der Cancel-Fehler wird abgefangen. Dim Flag As Boolean, aa$, bb$, Path$, Mem As Boolean, Pos&, x& Dim PosChr As Integer Dim OldPosChr As Integer PosChr = 0 OldPosChr = 0 On Error GoTo Break With CommonDialog1 .filename = "" .CancelError = True .Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer .ShowOpen If Flag Then MsgBox "Es wurde 'Abbrechen' gewählt!" Else 'Schauen ob evt. nur eine Datei ausgewählt wurde If InStr(.filename, Chr$(0)) <> 0 Then aa = .filename & Chr$(0) Pos = 1 Do 'Chr$(0) ist Trennzeichen x = InStr(Pos, aa, Chr$(0)) If x = 0 Then Exit Do bb = Mid$(aa, Pos, x - Pos) If Not Mem Then 'Im ersten Teil befindet sich immer der Pfad Path = bb Mem = True Else 'Pfad ist bereits bekannt, es folgen Dateinamen FileSize = FileLen(Path & "\" & bb) MsgBox Path & "\" & bb End If Pos = x + 1 Loop Else 'Es wurde nur eine Datei ausgewählt MsgBox .filename End If End If End With Exit Sub Break: If Err.Number = 32755 Then Flag = True Resume Next ElseIf Err.Number = 20476 Then Flag = True MsgBox ("Es wurden zu viele Dateien ausgewählt!") End If Und zum öffnen von Dateien, in ihrem Standardprogramm, hab ich immer das hier verwendet. Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _ (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub Command1_Click() Dim File2Open As String File2Open = "C:\autoexec.bat" intret = ShellExecute(Me.hWnd, "open", File2Open, "", "", 5) End Sub Vielleicht hilft's wem... MfG KarlBerg PS: <Toll> Beim rauskopieren und umändern zum posten, hab ich mir gerade ein Programm zerschossen, weil ich ausversehen gespeichert hab</toll> Zitieren
Boro Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi Tiana ! danke erstmal. Das könnte der Fehler schon sein, ich habe als letztes versucht eine Textdatei zu öffnen, da ich Parameterwerte in einer .txt bzw. .ini Datei habe, und die für den Programmstart notwendig sind. Das erklärt den Fehler in der Shell-Methode. Wenn ich "nur" ausführbare Dateien öffnen kann ist der Fehler eigentlich klar, dann werd ich versuchen den Laufzeitfehler abzufangen. Aber gilt dass den auch für File-Existens ? Zumindest die Existenz des der Textdatei muss sich doch prüfen lassen, oder ? Ich werde den Code heute abend mal posten, da ich nicht am Arbeitsplatz bin. Hab gerad mal in meine Bücher geschaut, stimmt, da steht auch dass es "exe"-Dateien sein düfen. Wer lesen kann ist manchmal doch im Vorteil. Bis dann ! Feivel Zitieren
StarLord Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Original geschrieben von Tiana zu 2. Wenn Du meinen Code gelesen hast ist Dir sicher aufgefallen, dass ich den Filter benutzt habe, um die Dateierweiterung einzugeben. Richtig, und deshalb ist es nicht Sinnvoll den Dateinamen mit "*.*" vorzubesetzen. Das hatte ich aber schon geschrieben... du hattest anscheinend auch keine Zeit mein Posting mal durchzulesen. Original geschrieben von Tiana Die zu öffnende Datei wurde ja vorher im Öffnen-Dialog übergeben, so das ich mit der Eigenschaft FileName eigentlich nur den Pfad und Namen der ausgewählten Datei übergeben habe- ich verstehe da dein Problem nicht. Siehe nächster Absatz Original geschrieben von Tiana Mit ShowOpen wird übrigens nur angezeigt, welchen Dialog ich anzeige nämlich den ÖffnenDialog und das brau auch gar nicht abgefangen werden. Du brauchst mir nicht erklären was ShowOpen macht, ich programmiere in VB schon länger. Allerdings scheinst du nicht zu verstehen dass ShowOpen einen modalen Dialog mit Rückgabewert aufruft. Diesen Rückgabewert kann man dann abfangen, z.B.: dlg.CancelError = TRUE ' Aktiviert die Cancel-Benachrichtigung if dlg.ShowOpen = cdlCance then exit sub/function 'User hat auf Abbrechen gedrückt => Funktion bzw Prozedur beenden ... Original geschrieben von Tiana zu 1. Mir ist schon klar, dass man nach Möglichkeit kein GOTO verwenden sollte, aber was machst Du, wenn der Anwender keine Datei auswählt und Trozdem auf OK klickt???? Richtig, wenn der Anwender einfach auf OK klickt steht immer noch dein "*.*" drin. Deshalb sollte man es mit einem leerem String besetzen und dann einfach auf strlen <> 0 überprüfen. Ob die Datei existiert wirst du später sowieso noch einmal prüfen müssen. Allerdings wird deine Variante versagen wenn der Benutzer eine Datei auswählt und danach auf Abbrechen klickt. Deshalb solltest du auch das Abbrechen abfangen, wie das geht hatte ich ja schon erklärt. Original geschrieben von Tiana Da es sich bei dem angeführten Code eigentlich um eine Importschnittstelle handelt hätte das eine Interessante Fehlermeldung gegeben und die muss eben abgefangen werden. Ich hätte auc ganz am Anfang schrieben können On err GOTO, aber das wäre auf das selbe rausgekommen. Manchmal ist das Benuzten von GOTO eben doch erlaubt und sinnvoll. Man kann es auch umständlich machen wenn es einfach geht. In deinem Fall braucht man kein einziges Goto und ein OnError Resume ... wäre wohl eher angebracht. Original geschrieben von Tiana zu 4. Gib doch mal in einem VB-Prog Shell start <File> ein. Ich wette mit Dir, das es nicht funktioniert, weil er den Parameter Start nicht kennt. Seltsam, bei mir funktioniert Shell "start C:\Windows\Tips.txt", vbHide einwandfrei... es mag sein dass es unter WinNT, 2K oder XP nicht funktioniert. Aber unter Win98 klappt es ohne Probleme. Es gäbe auch noch eine andere Möglichkeit eine Datei ohne "start" aufzurufen... aber das wäre zu kompliziert und ich will euch (eher gesagt DICH) damit nicht überfordern. Original geschrieben von Tiana zu 5. wie auch VB-scripte zeigen ist es kein Problem mit Hilfe des Filesystemobjects auf xls-Dateien zuzugreifen (OpenFile()) und sie auszulesen und auch zu überschreiben. Das dürfte zeimlich genau auf VB zu übertragen sein, das es sich hier um Methoden des FSO handelt. Excel Datein nicht nur zum Bearbeiten zu öffnen (mit FSO), sondern auch anzuzeigen (was 2 verschiedene Dinger sind) ist eine andere Sache, hierfür muss man wirklich mit ActiveX arbeiten. Ehrlich gesagt verstehe ich nicht was du ständig mit "Filesytemobjects" meinst... falls du die Standard APIs für Dateizugriffe meinst kann ich dir nur recht geben. Original geschrieben von Tiana Ich habe eher das Gefühl, dass Du meinen kleinen Codeauszug, der nur als Anregung gedacht war) weder richtig gelesen, noch verstanden hast. Aber wenn Du so schlau bist kannst Du sicher ein Code-Beispiel für die Lösung mit ActiveX angegeben??? Wenn du schon so Ignorrant bist kannst du dir deinen Code selbst schreiben. Denn DU bist diejenige die nicht richtig gelesen hat oder MEINE Kritik nicht verstanden hat. Du kannst programmieren wie du willst. Früher oder später wirst du aber bei komplexeren Programmen auf die Nase fallen. Und da du keine Kritik verträgst und auch auf Vorschläge nicht einmal eingehen willst wird dies wahrscheinlich schon früher geschehen als dir lieb ist. Hochmut kommt vor dem Falle. EOD, StarLord Zitieren
Tiana Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi, also Dein FLAG Problem scheint mir ziemlich simpel. Du deklarierst eine Variabel FLAG als Boolean, weist Ihr aber keinen Wert zu. Damit ist Sie automatisch immer true (Standardwert). Du fragst zwar die Eigenschaft dlg.FLAGS ab und die wird auch ausgewerter (Rückgabewert ist eine Zahl) aber die hat hier keine Auswirkungen auf dein IF. Zitieren
Tiana Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi, Du kannst es ja mal mit StarLords Vorschlag: Shell "start C:\Windows\Tips.txt", vbHide ausprobieren. Wenn er den schon was zur Problemlösung beiträgt, anstatt andere Helfer anzugriefen! Gruß, Tiana Zitieren
StarLord Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Original geschrieben von Feivel Zumindest die Existenz des der Textdatei muss sich doch prüfen lassen, oder ? Natürlich geht das. Hier ein simples Beispiel: Private Sub Command1_Click() If Dir("C:\Windows\Tips.txt2", vbNormal) <> "" Then MsgBox "Datei gefunden.", vbOKOnly Else MsgBox "Datei nicht gefunden!", vbOKOnly End If End Sub Gruß, StarLord Zitieren
Schneeflocke Geschrieben 28. Mai 2002 Autor Geschrieben 28. Mai 2002 wenn ich dir(.filename) eingebe krieg ich nur den Dateinamen, wie krieg ich den Pfad? wo kann ich "Path" verwenden oder is das verkeht? CU SF Zitieren
Tiana Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Hi, also bei mir gibt er immer den Pfad mit zurück bei commonDialog1.Filename. Wenn Du Pfad und Name getrennt brauchst müsste man mal Tricksen. Gruß, Tiana Zitieren
StarLord Geschrieben 28. Mai 2002 Geschrieben 28. Mai 2002 Original geschrieben von Schneeflocke wenn ich dir(.filename) eingebe krieg ich nur den Dateinamen, wie krieg ich den Pfad? wo kann ich "Path" verwenden oder is das verkeht? Natürlich bekommst du bei dir nur den Dateinamen zurück. Dir überprüft auch nur ob die angegebene Datei existiert. Wenn du den Pfad willst reicht es doch wenn du von dlg.filename ab dem letzten Backslash ("\") den String abschneidest. Wo ist denn da das Problem? Hier mal eine Funktion die ich mal geschrieben habe: Function SeperatePath(SearchPath As String) As String Dim PathSeperatorPos, LastPathSeperatorPos As Integer PathSeperatorPos = 1 Do Until PathSeperatorPos = 0 LastPathSeperatorPos = PathSeperatorPos PathSeperatorPos = InStr(PathSeperatorPos + 1, SearchPath, "\") Loop SeperatePath = Left(SearchPath, LastPathSeperatorPos) End Function Wenn du den abschließenden Backslash nicht brauchst: SeperatePath = Left(SearchPath, LastPathSeperatorPos - 1) Gruß, StarLord Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.