Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

"Speichern unter..." in Excelmakro mit Visual Basic einfügen?

Mic2004 / 31 Antworten / Baumansicht Nickles

Hallo zusammen!

Ich möchte mir mithilfe von Visual Basic ein kleines Ecxel-Makro basteln, mir dem mal eine TXT-Datei importieren, damit ein Diagramm erstellen und diese dann speichern kann.

Kann mir dazu evtl. jemand eine kurze Anleitung geben, wie man in solch ein Makro mit Visual Basic ein „Öffnen…“ und ein „Speichern unter…“ Fenster einfügt. Sodass der Nutzer die gewünschte TXT-Datei damit suchen und öffnen kann und die fertige Excel-Datei dann auch unter wünschten Namen abspeichern kann.

Schon einmal Danke im Voraus!

Grüße,
Mic2004.

PS.: Ich bin noch etwas Neuling auf diesem Gebiet...

bei Antwort benachrichtigen
The Quimp Mic2004 „"Speichern unter..." in Excelmakro mit Visual Basic einfügen?“
Optionen

In der Werkzeugleiste von VBA gibt es unter "weiteren Steuerelementen" das Steuerelement " Microsoft CommonDialogControl Version 6.0"

Dieses auf das Datenblatt bringen (ist zur Laufzeit unsichtbar). Einen Button noch auf Blatt setzen und sein Clickereignis mit dem Code
CommonDialog1.ShowOpen versehen, schon öffnet sich dein gewünschter Dialog.

Das CommonDialog-Steuerelemnt verfügt ebenfalls über das Ereignis .ShowSave zum abspeichern.

Weitere Erläuterungen findest du, wenn du im Code ShowOpen markierst und mit F1 die Hilfe aufrufst.

bei Antwort benachrichtigen
Mic2004 The Quimp „In der Werkzeugleiste von VBA gibt es unter weiteren Steuerelementen das...“
Optionen

Hallo „The_Quimp“!

Zunächst einmal danke für deine schnelle Antwort. Wo aber finde ich denn diese Werkzeugleiste (im Visual Basic Editor von Excel 2000)?

Meine nächste Frage wäre, wie ich dann die geöffnete Datei im Makro weiter verwenden kann? Ich müsste doch deren Pfad und Name irgendwie auf eine Variable schreiben, mit der das Makro dann weiter arbeitet. Und irgendwie muss das Makro ja auch wissen, dass es dann die neue Excel-Tabelle unter dem im „Speichern unter...“-Fenster gewählten Pfad und Dateiname ablegen muss.

Gibt es eigentlich einen anderen Befehl (anstelle für „.ShowSave“), um das Fenster zum Daten importieren zu öffnen. Im Excel steht da nämlich anstelle „Öffnen“ „Datenquelle auswählen“ drüber und es werden alle Dateitypen (nicht nur .xls) angezeigt.

Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo The_Quimp ! Zunächst einmal danke für deine schnelle Antwort. Wo aber...“
Optionen

Die Werkzeugleiste findest du unter : Ansicht \ Symbolleisten\Steuerelementen-Toolbox

Auf die Werkzeugleiste kannst du prinzipiell nur im Excel-Modus zugreifen, denn damit legst du ja die Steuerelemte auf dein Arbeitsblatt.
Sobald du ein Steuerelement ausgewählt hast und auf das Blatt gezeichnet, mußt du es nur doppelt anklicken und du wechselst automatisch in den Visual-Editor-Modus, wo du dann den Code für dieses Steuerelement schreiben kannst.

Zum Testen mußt du wieder in den Excel-Modus und dafür sorgen, daß du den Entwurfmodus beendet hast. Dann kannst du auf die Steuerelemente klicken und schauen, ob es funktioniert.

Um mit einer Datei (über die erwähnte Show.OPEN -Anweisung wird dir die ausgwählte Datei mit ihrem Pfad und Filenamen bereits übergeben) zu arbeiten, mußt du sie mit der OPEN-Anweisung öffnen, die Daten einlesen und dann darauf reagieren. Schlage vor, du schaust mal in der
Visual-Basic Hilfe unter OPEN, bzw. Öffnen von Dateien nach, da findest du sicherlich brauchbare Hinweise.

Probiere erst einmal ein bißchen mit den Steuerelemten herum, dann wird einiges klarer. Ansonsten frag nochmal.

gruß

bei Antwort benachrichtigen
Mic2004 The Quimp „Die Werkzeugleiste findest du unter : Ansicht Symbolleisten...“
Optionen

Hallo!

So richtig mag das bei mir nicht funktionieren. Ich habe so ein Symbol auf meine Excel-Oberfläche gezogen.





Wenn ich die Excel-Datei dann schließe und wieder neu öffne, erscheit an der stelle aber nur ganz kurz ein rotes X und dann ist sie wieder weg. Ich kann also nichts damit machen.

Und dann ist es ja auch so, dass ich die Datei nicht mit diesen Button öffnen möchte. Sie soll in einer Art Prozedur geöffnet werden, die aus mehreren Fenstern besteht:

Funktionsauswahl (Was soll gemacht werden) --> Eingabe von Rechenwerten --> Öffnen der TXT-Datei --> Excel-Makro ausführen --> Datei speichern unter...

Kann das dieses Steuerelement auch?

Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! So richtig mag das bei mir nicht funktionieren. Ich habe so ein Symbol...“
Optionen

Das Steuerelement CommonDialog ist zur Laufzeit unsichtbar. Deshalb siehst du nur kurz etwas.
Du mußt noch ein anderes Steuerelement nach deiner Wahl einfügen Bsp. ein CommandButton, oder eine checkbox...
Mit diesen mußt du dann, wie in Posting1 beschrieben, einen Verweis auf den Namen deines CommonDialog-elementes setzen.
Prinzipiell ist eine Funktionsauswahl möglich, du mußt dich nur entscheiden, welche Steuerelemente du dafür verwenden willst.

Bsp: Klicke im Entwurfmodus das CommonDialog mit rechts an > Eigenschaften > Name: Nenne es wie du willst. z.B. ComDiag

Dann setze noch einen CommandButton aufs Blatt. Doppelklick und folgenden Code einfügen:

Private Sub CommandButton1_Click()
ComDiag.ShowOpen
End Sub

Zur Laufzeit (sprich nach Beendigung des Entwurfsmodus) erscheint beim Klicken auf diesen Button der Dialog zum Öffnen der Datei.
Dann kannst du besp den inhalt der Datei auslesen und in eine Textbox kopieren und dort ändern, wieder zurückschreben, speichern usw.

aber mach erstam den nächsten Schritt.

P.S.Wenn du deine email schreibst, müssen wir dies nicht hier indem Forum weiterverfolgen.

bei Antwort benachrichtigen
Mic2004 The Quimp „Das Steuerelement CommonDialog ist zur Laufzeit unsichtbar. Deshalb siehst du...“
Optionen

Hallo!

Ich wollte die Sache gerade mal an meinem Arbeitsplatzrechner ausprobieren aber scheitere schon am Grundlegenden. Wenn ich versuche dieses Steuerelement einzufügen, kommt nur der Hinweis von Excel:


Objekt kann nicht eingefügt werden.


Weitere Hinweise gibt es nicht dazu und in der Hilfe findet man so direkt auch nichts. Woran kann das denn nun liegen?

Grüße,
Mic.
bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Ich wollte die Sache gerade mal an meinem Arbeitsplatzrechner...“
Optionen

Hast du auf dem Rechner eine ältere Version von Excel?

bei Antwort benachrichtigen
Mic2004 Nachtrag zu: „"Speichern unter..." in Excelmakro mit Visual Basic einfügen?“
Optionen

Hallo!

Ja, ich sagte, wir arbeiten noch mit Excel 2000 . Man kann zwar da dieses Steuerelement anwählen und auf die Fläche ziehen, dann kommt aber die besagte Fehlermeldung.

Ich habe es jetzt aber auch ohne dieses Steuerelement hinbekommen. In einem Makro, was mir ein Bekannter geschickt hat, habe ich folgenden Code gefunden und für meine Wünsche angepasst:

Dateiname = Application.GetOpenFilename("CSV-Datei (*.csv*), *.csv*", , "Datei die Importiert werden soll", , False)
If Dateiname = "Falsch" Then GoTo Ende:
Application.DisplayAlerts = False
Workbooks.OpenText Filename:=Dateiname, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False, _
Space:=False, Other:=False
Columns(1).Select
Selection.TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False, _
Space:=False, Other:=False

Damit konnte ich dann meine TXT-Dateien öffnen und mit einem ähnlichen Code konnte ich meine Datei dann auch speichern.

Eines habe ich jedoch damit nicht hinbekommen. Ich wollte am Ende des Makros die Option lassen, ob man die Auswertung als neue Excel-Datei speichern oder an eine vorhandene Excel-Datei anhängen möchte. Leider gibt der o.g. Code auf die Variable „Dateiname“ nur den gesamten Dateinamen mit Pfad (z.B. C:\Daten\Beispiel.xls) aus. Um aber ein Excel-Arbeitsblatt von einer Datei in eine andere zu kopieren, muss man dafür den „nackten“ Dateinamen (z.B. Beispiel.xls) angeben. Das verträgt sich leider nicht. Hättest du evtl. da eine andere Idee? An sich müsste ich nur zwei Excel-Arbeitsblätter (eine Tabelle und ein Diagramm) aus einer Excel-Arbeitsmappe, die noch nicht als Datei gespeichert ist, in eine vorhandene Excel-Arbeitsmappe, die bereits als Datei gespeichert ist, kopieren oder verschieben.

Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Ja, ich sagte, wir arbeiten noch mit Excel 2000 . Man kann zwar da dieses...“
Optionen

Workbooks(Mappe1.xls).Sheets(Nummer des zu verschiebenden Blattes).Move _
Before:=Workbooks("Bestehende Arbeitsmappe.xls").Sheets(Blattnummer vor die es soll)
bei Antwort benachrichtigen
Mic2004 The Quimp „ Workbooks Mappe1.xls .Sheets Nummer des zu verschiebenden Blattes .Move _...“
Optionen

Genau das funktioniert nicht, weil ich eben keinen "Wert" Mappe1.xls habe, sondern nur einen "Wert" C:\Daten\Mappe1.xls und damit kann Excel bzw. Visual Basic an dieser Stelle nichts anfangen. Verstehst du, was ich meine?

bei Antwort benachrichtigen
The Quimp Mic2004 „Genau das funktioniert nicht, weil ich eben keinen Wert Mappe1.xls habe, sondern...“
Optionen

Dann probier mal: a$=activeworkbook

und verwende dann diesen String

bei Antwort benachrichtigen
Mic2004 The Quimp „Dann probier mal: a activeworkbook und verwende dann diesen String“
Optionen

Hallo!

Mal dumm gefragt: Wie verwende ich denn den String "a$" richtig? Kann ich das auf eine Variable schreibe, die ich dann im Weiteren verwende?

Grüße,
Mic.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Mal dumm gefragt: Wie verwende ich denn den String a richtig? Kann ich...“
Optionen

Dim a as string
a = activeworkbook.name

Diese Variable kannst du innerhalb der Prozedur verwenden. Soll sie im gesamten Makro vorhanden sein, benutze anstatt 'dim' dann 'public'
Du benutzt dann a überall dort, wo du den Filenamen der Datei bräuchtest.


Bsp:
Private Sub CommandButton1_Click()
Dim a As String
a = ActiveWorkbook.Name
MsgBox a
End Sub

bei Antwort benachrichtigen
mauszuhaus The Quimp „Dim a as string a activeworkbook.name Diese Variable kannst du innerhalb der...“
Optionen

Hallo Quimp,
darf ich dich mit einer ähnlich gelagerten Frage belästigen?
Ich habe ein Macro geschrieben, um in einer Excel-Tabelle eine vorhandene Zeile zu kopieren und sie dann an einer beliebigen Stelle zusätzlich einzufügen.
Das Macro kennt aber nur den absoluten Bezug von der vorhandenen zur neuen Zeile. Ich suche aber die Einfügestelle mit der Maus. Folglich fehlt im Macro die Abfrage: "vor welcher Zeile einfügen"
Dies ist das ganze Problem meiner Frage. Ich hoffe, ein Klacks für einen Crack!tausend Dank!

Inhalt von Macro "Zeile",
Es fehlt jedoch die Benutzerrückfrage: wo soll die kopierte Zeile eingefügt werden?

Sub Zeile()
'
' Zeile Makro
' Makro am 12.06.2007 von Ralf aufgezeichnet
'
' Tastenkombination: Strg+z
'
Range(Selection, Selection.End(xlToRight)).Select (Startpunkt ist eine beliebige Zelle, z.B. A10)
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Rows("15:15").Select (ungelöst: das Ziel sollte eine zu wählende Zelle sein, z.B. vor der Zeile 15)
Selection.Insert Shift:=xlDown
Range("A15").Select (ungelöst: der Cursor sollte anschließend in Spalte A der neu eingefügten Zeile stehen)
End Sub

bei Antwort benachrichtigen
Mic2004 mauszuhaus „Hallo Quimp, darf ich dich mit einer ähnlich gelagerten Frage belästigen? Ich...“
Optionen

Hallo "mauszuhaus"!

Vielleicht darf ich mich an der Stelle mal einmischen. Ich befürchte bald, in einem laufenden Makro mit der Maus in eine Zeile klicken zu können, das wird nichts werden.

Du könntest ja ein Abfragefenster einblenden lassen mit der Frage, wo man die Zeile einfügen soll. Als Antwort gibt man beispielsweise den Zahlwert (in deinem Fall 15) als Antwort ein. Dazu der Befel:

zeile = Application.InputBox("In welche Zeile sonn eingefügt werden?", "")

Eine andere möglichkeit wäre, dass du das Makro nach der nächsten leeren Zeiel suchen lässt und deine kopierte Zeile dort einfügst. Mit diesem Code suchst du die nächste leere Zeile:

zeile = 11
Do
Cells(zeile, 1).Select
If Selection = "" Then Exit Do
zeile = zeile + 1
Loop
zeile = zeile - 1


Damit gibst du dann anstelle deinem Range("A15").Select folgendes ein: Range("A" & zeile).Select"

Vielleicht hilft dir das weiter oder Quimp hat noch eine bessere Idee.

Grüße,
Mic2004.

bei Antwort benachrichtigen
mauszuhaus Mic2004 „Hallo mauszuhaus ! Vielleicht darf ich mich an der Stelle mal einmischen. Ich...“
Optionen

Vielen Dank an Mic2004 für die superschnelle Antwort!
Ich mache mich sogleich an die Umsetzung. Mal sehen ob ich's hinkriege. Melde mich wieder.

bei Antwort benachrichtigen
Mic2004 mauszuhaus „Vielen Dank an Mic2004 für die superschnelle Antwort! Ich mache mich sogleich...“
Optionen

Hallo!

Deinen Worten nach hilft dir mein Tipp weiter? ;o)

Noch ein Tipp: Du solltest vielleicht bei Zeile 1 mit Zählen anfangen. Das mit Zeile 11 ist aus einem Makro von mir. Da hat due Tabelle eine Art "Kopf" wo auch leere Zeilen drin sind und damit er diese nicht schon als Ende der Tabelle ansieht, habe ich bei Zeile 11 angefangen zu "suchen".

Viel Spaß damit.

Grüße,
Mic2004.

bei Antwort benachrichtigen
mauszuhaus Mic2004 „Hallo! Deinen Worten nach hilft dir mein Tipp weiter? o Noch ein Tipp: Du...“
Optionen

Hallo Mic,
ich bin scheint's doch zu dumm, um ein funktionierendes Macro zu bauen. Auf Deutsch: es klappt nicht.Die vielen Kompilierungsfehler gehen über meine Kenntnisse. Würde dich gerne engagieren, wenn ich irgendeine Belohnung ausloben dürfte, Flasche Wein oder so, geht nicht gegen die Regeln, oder?

Der Fall liegt so: umfangreiche Excel-Tabelle, dabei viele Zeilen ähnlichen Inhalts.(ich hätte eine Mustertabelle hier, falls das nützt. Ob man die hochladen kann oder mailen?). Um eine neue Zeile zu generieren, ist es vorteilhaft, eine bestehende nach weiter unten zu kopieren, um dann zwei oder drei Angaben in der neuen Zeile zu ändern.
Jetzt fällt mir noch etwas auf: die Abfragebox könnte entfallen, wenn man die kopierte Zeile generell immer unterhalb derjenigen Zeile einfügt, die in der Spalte A noch denselben Inhalt hat wie in der eben kopierten. Darunter wechselt nämlich der Text in A. Ist das ein Ansatz?
Falls Du hierfür keine Lust hast, habe ich vollstes Veständnis. Aber wenn Du einen Vorschlag machen könntest, wäre das natürlich riesig!

VieleGrüße!!!



bei Antwort benachrichtigen
Mic2004 mauszuhaus „Hallo Mic, ich bin scheint s doch zu dumm, um ein funktionierendes Macro zu...“
Optionen

Hallo!

Ich würde dir theoretisch gern helfen aber wie du vielleicht an den langen Zeitabständen meiner Forums-Einträge siehst, ist Zeit bei mir momentan etwas knapp und so ein Profi, dass bei mir alles in Windeseile geht, bin ich dann leider doch nicht...

Ganz begreife ich deinen Fall aber auch noch nicht. Wenn du die zu kopierende Zeile dort hin kopieren willst, wo das erste mal ein anderer Text in Spalte A steht, überschreibst du doch alles, was danach kommt. Ist das richtig und so gewollt? Ansonsten würde ich noch mal auf meine „Idee“ mit dem „Suche die erste leere Zeile“ verweise. Eventuell müsstest du mal versuchen die Variable Zeile noch einmal zu deklarieren. Gib als am Anfang deines Subs mal ein Dim Zeile As Integer und versuche es dann noch einmal.

Ich habe aber jetzt doch mal versucht ein kleines Makro, anhand dem, wie ich es verstanden habe, zusammenzunageln. Sicher kann man das noch ausbauen aber vielleicht hilft es dir als „Sprungbrett“. Es sind einige Notizen eingebaut. Du müsstest es dir aber noch in deine Excel-Tabelle oder in die „Makrosammlung“ von Excel einfügen.

Du kannst dir die Datei unter folgendem Link downloaden. Nachteil ist, dass du dafür nur 48 Stunden Zeit hast. Dann wird sie wieder vom Server gelöscht. Das dürfte aber ausreichen.

http://www.materialordner.de/CKH3F0w7AL5QuE6igMgFstxy7xWxlpZ.html

Also viel Spaß damit...

Grüße,
Mic2004.

bei Antwort benachrichtigen
Mic2004 Nachtrag zu: „"Speichern unter..." in Excelmakro mit Visual Basic einfügen?“
Optionen

Hallo!

Ich habe mal noch eine andere Frage. Kann man irgendwie Eingabewerte, die man im Makro in ein Eingabefeld eingegeben hat, per Button in eine TXT-Datei schreiben und mithilfe eines weiteren Buttons (wenn man das Makro erneut aufruft) wieder in die Eingabefelder zurück schreiben.

Es müsste irgendwie Befehle geben die sagen:
schreibe UserForm1.TextBox1.Text in Zeile_01 von Textdatei.txt
schreibe UserForm1.TextBox2.Text in Zeile_02 von Textdatei.txt

Und umgekehrt eben:
lese Zeile_01 von Textdatei.txt in UserForm1.TextBox1.Text ein
lese Zeile_02 von Textdatei.txt in UserForm2.TextBox1.Text ein

Gibt es so etwas in der Art? Die Datei soll auch nicht mit so einen "ShowOpen"-Befehl geöffnet oder mit einen "ShowSafe"-Befehl gespeichert werden. Sie soll einfach im selben Verzeichnis wie das Excel-Makro liegen und bei Bedarf erstellt und beschrieben werden.

Grüße,
Mic.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Ich habe mal noch eine andere Frage. Kann man irgendwie Eingabewerte, die...“
Optionen

Setz einmal zwei Textfelder und zwei Buttons auf dein Blatt und probier mal das da:

Dim a As String

Private Sub CommandButton1_Click()
Dim a As String
a = ActiveWorkbook.Name
TextBox1.Text = a
End Sub

Private Sub CommandButton2_Click()
b = MsgBox("Inhalt von Textbox1 kopieren?", vbYesNo, "Frage")

If b Then TextBox2.Text = TextBox1
End Sub

Ich denke für weitere Fragen belasten wir nicht mehr dieses Forum.

Wenn du noch Fragen hast dann mail mir gerne unter quimp@web.de

Gruß

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Ich habe mal noch eine andere Frage. Kann man irgendwie Eingabewerte, die...“
Optionen

Sorry, hatte dich falsch verstanden:

Dies hier geht:

Dim a As String

'Text aus File in textbox1 schreiben
Private Sub CommandButton1_Click()

TextBox1.MultiLine = True 'Dann kann die Textbox mehrere Zeilen haben

Dim zeile As String

Open "C:\Testfile.txt" For Input As #1

Do Until EOF(1)

Line Input #1, zeile

TextBox1.Text = TextBox1.Text & zeile & Chr(13)

Loop

Close 1
End Sub

'Text aus textbox2 in file schreiben
Private Sub CommandButton2_Click()

Open "c:\Testfile.txt" For Output As #1

Print #1, TextBox1.Text

Close 1


End Sub

bei Antwort benachrichtigen
Mic2004 The Quimp „Sorry, hatte dich falsch verstanden: Dies hier geht: Dim a As String Text aus...“
Optionen

Hallo!

Danke für den Tipp aber so ganz das Ziel ist damit noch nicht erreicht. Noch mal kurz zur Problematik. Ich habe vier Text-Eingabefelder mit je nur einer Zeile, in die Rechenfaktoren für Excel eingegeben werden. Diese möchte ich in einer Textdatei mit vier Zeilen ablegen, um sie beim nächsten Start des Makros nicht noch einmal neu eingeben zu müssen.

Nach deinem Quell-Code muss ich jetzt jede Teile in einer separaten TXT-Datei abspeichern. Das wollte ich eigentlich nicht, weil das die Festplatte nur unnötig zumüllt. Kann man also evtl. auch alle vier Werte der Textfelder in nur einer Datei speichern? Wie müsste man da angeben, in welche Zeile er welchen Wert schreiben muss und aus welcher Zeile er dann welchen Wert wieder lesen soll.

Es soll einfach eine Text-Datei entstehen, die folgenden beispielsweise Inhalt hat:

0.00013
-2.7167449
100000
500000


Wegen der Frage mit dem "ActiveWorkbook.Name" habe ich noch nicht weiter experimentiert.

Grüße,
Mic.

bei Antwort benachrichtigen
Mic2004 The Quimp „Sorry, hatte dich falsch verstanden: Dies hier geht: Dim a As String Text aus...“
Optionen

Hallo!

Mal noch eine Frage: Was müsste ich denn als Pfad der Text-Datei (anstelle deinem C:\) angeben, damit die Datei im selben Verzeichnis gespeichert wird, in dem sich das Excel-Makro befindet.

Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Mal noch eine Frage: Was müsste ich denn als Pfad der Text-Datei...“
Optionen

Na hallo,

dachte du lebst nicht mehr :)

also:

Frage 1: Du kannst den Pfad, in dem dein Makro gespeichert ist, gewöhnlich wie folgt abfragen:
Dim a as string

a= application.path

Damit erhälst du das Verzeichznis, indem Excel installiert ist.

Die Datei speicherst du dann wie folgt:

open (a & "DeineDatei.txt") for output as #1

.... hier folgt alles was du in die Datei schreibst

close #1

Frage 2: Zwischen open und close (s.o.)
wird mit jedem print #1, Text-Befehl eine weitere Zeile in die Datei geschrieben.
Du brauchst also nicht vier Dateien zu schreiben:

Bsp:
open (a & "DeineDatei.txt") for output as #1

print 1#, Textfeld1.text
print 1#, Textfeld2.text
print 1#, Textfeld3.text
usw...

close 1

Falls du die Datei zu einem späteren Zeitpunkt nochmals öffnest und wieder reinschreibst, wird der alte Inhalt gelöscht.
Um das zu verhindern, benutzt du folgenden Code:

open "MeineDatei.txt" for Append as #1. Weiter wie oben

Dann schreibt das Programm nach dem schon bestehenden Inhalt weiter.

Alles klar?


bei Antwort benachrichtigen
Mic2004 The Quimp „Na hallo, dachte du lebst nicht mehr : also: Frage 1: Du kannst den Pfad, in dem...“
Optionen

Hallo!

Zu der Pfadangabe:
Ich möchte die Dateien aber nun nicht im Verzeichnis von Excel speichern, sonder in dem Verzeichnis wo mein Makro drin ist. Excel kann z.B. unter C:\Programme\Microsoft Office liegen aber mein Makro unter D:\Excel-Dateien und in genau dieses Verzeichnis soll das Makro auch seine TXT-Datei speichern. Bisher „müllt“ es mit nur die Wurzel von Laufwerk C: zu.

Zu der Text-Datei:
Ich hatte das bisher so gemacht, dass die Text-Datei für jedes Schreiben geöffnet und danach wieder geschlossen wird. Das war vielleicht der Fehler.

Ich möchte ja auch, dass der alte Inhalt gelöscht wird, wenn man erneut in die Datei schreibt. Meine vier Faktoren sollen in der Text-Datei so lange stehen bleiben, bis neue Werte in die Eingabefelder eingegeben und diese gespeichert werden. Die Werte sollen ja dann auch per Button wieder eingelesen werden. Da muss der Wert zum Textfeld 1 auch immer in Zeile 1 stehen und nicht auf einmal (weil die Daten angehängt wurden) in Zeile 5.

Ich werde es morgen noch mal testen. Das Programmieren an dem Makro ist für mich eben nur ein Lückenfüller, wenn mal fünf Minuten Ruhe sind. Momentan ist aber so auch gut genug zutun... ;o)

Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo! Zu der Pfadangabe: Ich möchte die Dateien aber nun nicht im Verzeichnis...“
Optionen

Dann gib entweder den gewünschten Pfad selber in den Code ein. Wenn das Programm nur für dich ist, dann ist es ja kein Problem, den Pfad direkt ins Makro zu schreiben. Ansonsten verwende die getopenfilename -Anweisung mit einem String, den du vorher von einem Textfeld übernommen hast.

Open "D:\Excel-Darteien\MeineDatei.txt" for input / output / append ... as #1

Sobald du die Datei wieder mit open öffnest, ist der Inhalt verloren, wie geschrieben. Das war sicherlich der Fehler.

bei Antwort benachrichtigen
Mic2004 The Quimp „Na hallo, dachte du lebst nicht mehr : also: Frage 1: Du kannst den Pfad, in dem...“
Optionen

Hallo!

Also ich glaube das mit der TXT-Datei funktioniert jetzt. Ich bin begeistert! :o) Nur mal als Zwischenfrage, kann man das auch mit Visual Studio 6.0 für EXE-Programme so machen und kann man die Zeilen einer TXT-Datei auch auf Variablen schreiben?

Was den Speicherort der TXT-Datei angeht, so soll das Programm eben nicht nur für mich sein. Es wäre ja auch möglich die TXT-Datei ins Temp-Verzeichnis des Computers zu schrieben. Das ist sicher bei jedem, der das Makro nutzen möchte, vorhanden. Ich habe schon mal versucht mit der Windows-Variable %Temp% zu arbeite aber das versteht Visual Basic scheinbar nicht. Hast du da eine Idee?

Weiterhin versuchte ich mit dem Befehl FileSystemObject.CreateFolder(Ordnername) ein Verzeichnis zu erstellen. Leider erfolglos...

Grüße,
Mic2004.

bei Antwort benachrichtigen
Mic2004 Nachtrag zu: „Hallo! Also ich glaube das mit der TXT-Datei funktioniert jetzt. Ich bin...“
Optionen

Hallo nochmal!

Ich habe gleich mal noch eine Frage dazu. Ich würde nun gern auch eine Kontrolle einbauen, ob die Datei echt existiert, wenn man einlesen möchte. Momentan ist es so, dass immer der Debugger anspringt, wenn ich die Daten aus meiner TXT-Datei einlesen möchte, diese aber nicht existiert. Mit den Befehlen, wie sie in der Hilfe stehen, klappt es nicht. Wie kann man das anstellen.

So der Art nach:
If Exists "\Textdatei.txt" Then
...
...
...
Else
MsgBox "..."
End If


Grüße,
Mic2004.

bei Antwort benachrichtigen
The Quimp Mic2004 „Hallo nochmal! Ich habe gleich mal noch eine Frage dazu. Ich würde nun gern...“
Optionen

Natürlich kannst du dies alles auch mit VB 6.0 machen. Dort hast du auch viel mehr Möglilchkeiten, die Datei zu Beginn auszuwählen. Ich erinnere an den MSCommonDialog 6.0

Bezüglich deiner Fehlerkorrektur:


On Error GoTo Fehler

Open "c:\Testfile.txt" For Input As #1 (oder: open Variable for input as #1)
........

Close 1

Exit Sub

Fehler:
MsgBox "Datei exisitert nicht!"

end sub

bei Antwort benachrichtigen
Mic2004 Nachtrag zu: „"Speichern unter..." in Excelmakro mit Visual Basic einfügen?“
Optionen

Hallo!

Also das was wir bisher besprochen hatten, scheint in meinem Excel-Makreo erst einmal zu funktionieren. Ob es auch echt immer und mit jeder Datei klappt, wird die Zeit zeigen.

Für das ablegen der Werte in einer TXT-Datei hatte ich jetzt folgenden Code eingegeben:

Private Sub CommandButton4_Click()
Dim TXTPfad As String
Dim Textzeile As String
TXTPfad = ActiveWorkbook.Path
Open (TXTPfad & "\MSKalib.tmp") For Output As #1
Print #1, TextBox5.Text
Print #1, TextBox6.Text
Print #1, TextBox7.Text
Print #1, TextBox8.Text
Close 1
End Sub


Jetzt hatte ich die Idee das in einem anderen kleinen Tool, was ich mit Visual Basic 6 (also nicht das im Excel, sondern das "echte" Visual Studio) erstellt hatte einzubauen. Leider scheiterte ich schon daran den Pfad zu "suchen". Der Befehl TXTPfad = ActiveWorkbook.Path funktioniert da ja nicht. Was müsste ich denn stattdessen angeben?

Außerdem: Kann man da auch so ein Öffnen-Fenster einbauen? Das Tool ist dazu da, Dateien zu sichern. Dazu würde ich gern in einem Fenster Pfad-Angaben hinterlegen, sodass man sie jeder Zeit ändern kann aber nicht immer ändenr muss. Da käme doch so eine TXT-Datei gerade recht. Verstehst du, was ich meine? Man klickt irgendwo auf "Durchsuchen...", der damit gesuchte Pfad wird in der TXT-Datei gespeichert und im Fenster angezeigt und immer wenn man das Tool startet wird dieser Pfad genugtzt. Dazu müsste man ihn dann auf eine "Public"-Variable schreiben können oder so...

Grüße,
Mic2004.

bei Antwort benachrichtigen