Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1068to1072
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schaltfläche soll Textdatei öffnen und einfügen

Schaltfläche soll Textdatei öffnen und einfügen
21.04.2009 17:48:12
Jaffi
Hallo liebes Forum,
nachdem mir hier SPECKE schon mal den A**** gerettet hat, wende ich mich mal wieder vertrauensvoll an euch um mein neues :( Problem zu lösen:
Nachdem mein letztes Projekt gut angekommen ist muss ich gleich ein neues Starten. Kein Chef will mehr Geld ausgeben... also muss ich mir die Nächte um die Ohren schlagen *grummel* aber gut, nun zu meinem Problem.
Ich fange mit dem einfachen an:
Ein Button soll mich eine Txt-Datei auf meiner Platte auswählen lassen (Ordner sollte als Path voreingestellt sein, ist immer der selbe, nur die Datei heisst immer anders) und diese dann in meiner Tabelle (Ab Zeile 4 von A-E einfügen. Dann die optimale Breite einstellen und ein schwarzes Gitter drum packen. Die Textdatei enthält selbstverständlich die entsprechenden Sonderzeichen um ein Öffnen in Excel sicher zustellen. Manuell kann ich sie ja auch in Excel öffnen. Er soll es halt nur automatisch per Knopfdruck tun.
Dies sollte doch wirklich am einfachsten zu lösen sein, oder....?
Der Rest der da noch kommt macht mir zwar jetzt schon Angst aber eins nach dem anderen und ich hoffe sehr das Ihr und google mir da helfen könnt ;o)
Vielen Dank im voraus
grüsse jaffi

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schaltfläche soll Textdatei öffnen und einfügen
22.04.2009 09:02:54
fcs
Hallo Jaffi,
hier mal auf die Schnelle angepasst.
Gruß
Franz

Sub TextDateiEinlesen()
Dim varTextDatei, FF As Integer
Dim strText As String, arrData, intNumbers As Long, Spalte As Long, Spalten As Long
Dim wks As Worksheet, Zeile As Long, strPfadAkt As String
Const Spalte1 As Long = 1 'Spalte ab der Werte eingetragen werden sollen
Const Zeile1 As Long = 4 'Zeile ab der Werte eingetragen werden sollen
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "C:\Lokale Daten\Test" 'Verzeichnis mit Textdateien
Set wks = ActiveSheet 'oder auch Worksheets("Tabelle1") 'Zieltabelle
FF = FreeFile()
Zeile = Zeile1 - 1 'Zeile nach der die Werte eingetragen werden sollen
Open varTextDatei For Input As #FF
Do Until EOF(FF)
Line Input #FF, strText
'Textzeile am ";" splitten in ein Array
arrData = Split(strText, ";")
'Arrayinhalte in Schritten in Zeilen eintragen
Spalte = Spalte1 'Spalte ab der Werte eingetragen werden sollen
Spalten = UBound(arrData) - LBound(arrData) + 1
Zeile = Zeile + 1
For intNumbers = LBound(arrData) To UBound(arrData)
wks.Cells(Zeile, Spalte) = arrData(intNumbers + Spalte - 1)
Spalte = Spalte + 1
Next
Loop
Close #FF
VBA.ChDir strPfadAkt 'aktives Verzeichnis zurücksetzen
With wks
.Range(.Columns(Spalte1), .Columns(Spalte1 + Spalten - 1)).AutoFit
.Range(.Cells(Zeile1, Spalte1), .Cells(Zeile, Spalte1 + Spalten - 1)).AutoFit
End With
End If
End Sub


Anzeige
AW: Korrektur
22.04.2009 11:45:35
fcs
Hallo Jaffi,
leider hatte ich das setzen des Startverzeichnisses an der falschen Stelle eingefügt.
Gruß
Franz

Sub TextDateiEinlesen()
Dim varTextDatei, FF As Integer
Dim strText As String, arrData, intNumbers As Long, Spalte As Long, Spalten As Long
Dim wks As Worksheet, Zeile As Long, strPfadAkt As String
Const Spalte1 As Long = 1 'Spalte ab der Werte eingetragen werden sollen
Const Zeile1 As Long = 4 'Zeile ab der Werte eingetragen werden sollen
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "C:\Lokale Daten\Test" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
Set wks = ActiveSheet 'oder auch Worksheets("Tabelle1") 'Zieltabelle
FF = FreeFile()
Zeile = Zeile1 - 1 'Zeile nach der die Werte eingetragen werden sollen
Open varTextDatei For Input As #FF
Do Until EOF(FF)
Line Input #FF, strText
'Textzeile am ";" splitten in ein Array
arrData = Split(strText, ";")
'Arrayinhalte in Schritten in Zeilen eintragen
Spalte = Spalte1 'Spalte ab der Werte eingetragen werden sollen
Spalten = UBound(arrData) - LBound(arrData) + 1
Zeile = Zeile + 1
For intNumbers = LBound(arrData) To UBound(arrData)
wks.Cells(Zeile, Spalte) = arrData(intNumbers + Spalte - 1)
Spalte = Spalte + 1
Next
Loop
Close #FF
With wks
.Range(.Columns(Spalte1), .Columns(Spalte1 + Spalten - 1)).AutoFit
.Range(.Cells(Zeile1, Spalte1), .Cells(Zeile, Spalte1 + Spalten - 1)).AutoFit
End With
End If
VBA.ChDir strPfadAkt 'aktives Verzeichnis zurücksetzen
End Sub


Anzeige
AW: Korrektur
22.04.2009 12:32:00
Jaffi
Hallo Franz,
erst einmal vielen vielen Dank für Deine Unterstützung!!
Ich habe den von Dir erarbeiteten Code einer Schaltfläche zugeordnet. Klicke ich dann drauf kommt sogleich eine Fehlermeldung:
Fehler beim Kompilieren:
Sub oder Function nicht definiert
? Er fängt also garnicht erst richtig an.
Die *txt Datei sieht inhaltlich folgendermassen aus:
134567 Durable Mousepad Ergotop mit Gel anthrazit 2,000 1,99
345643 FireWire-Kabel 800/400 9/6polig 2 Meter 6,000 9,99
456743 FireWire-Kabel 800 9/9polig 2 Meter 2,000 9,99
856473 CD-R 700MB/80 Min. Imation 10er Pack Slimcase 2,000 1,99
......
...... usw. usw.
Die Art.Nr. (134567) müssen immer in Spalte A (Ab A5). Die Bezeichnung (Durable Mousepad Ergotop mit Gel) muss in Spalte B. Bei einigen Artikeln gibt es eine Bezeichnung 2 (im Bsp.: anthrazit) das muss dann in Spalte C. Gibt es keine Bezeichnung 2 (wie bei Art.Nr. 345643) muss die Spalte C leer bleiben. Die Menge (2,00) muss dann immer in Spalte D und der Preis (1,99) immer in Spalte E.
Ich glaube Du bist jetzt aufgrund meiner Aussage es seien Zeichen vorhanden von ";" ausgegangen. Aber habe gerade gesehen das ja sie Spalten in meinen *txt Dateien mit Leerzeichen getrennt sind. Denke mal das das auch relevant ist... sorry ich weis wie wichtig es ist das Problem richtig zu schildern aber im Moment gehts leider noch nicht ;o)
Obwohl der Code schon verdammt Sexy aussieht :D
Nochmals Danke für Deine Hilfe Franz!!!!!!
Gruss J.
Anzeige
AW: Korrektur
22.04.2009 12:35:49
Jaffi

Ich glaube Du bist jetzt aufgrund meiner Aussage es seien Zeichen vorhanden von ";" ausgegangen. _
Aber habe gerade gesehen das ja sie Spalten in meinen *txt Dateien mit Leerzeichen getrennt sind. Denke mal das das auch relevant ist... sorry ich weis wie wichtig es ist das Problem richtig zu schildern aber im Moment gehts leider noch nicht ;o)


Nicht mit Leereichen getrennrt sondern es sind TABS... Das Forum hat jetzt meine Textdatei zusammen geschrieben. Aber wie gesagt die einzelnen "Spalten" der Txt-Datei sind mit Tabs getrennt. Das ist sicher eine wichtige Info .. :/
Gruss

Anzeige
AW: Korrektur
22.04.2009 12:41:54
Jaffi

Ich glaube Du bist jetzt aufgrund meiner Aussage es seien Zeichen vorhanden von ";" ausgegangen. _
Aber habe gerade gesehen das ja sie Spalten in meinen *txt Dateien mit Leerzeichen getrennt sind. Denke mal das das auch relevant ist... sorry ich weis wie wichtig es ist das Problem richtig zu schildern aber im Moment gehts leider noch nicht ;o)


Nicht mit Leereichen getrennrt sondern es sind TABS... Das Forum hat jetzt meine Textdatei zusammen geschrieben.
Aber wie gesagt die einzelnen "Spalten" der Txt-Datei sind mit Tabs getrennt. Das ist sicher eine wichtige Info .. :/
Gruss

Anzeige
AW: Korrektur
22.04.2009 13:58:09
fcs
Hallo Jaffi,
wenn das Trennzeichen TABs sind, dann sollte folgende Anpasung für die Split-Zeile funktionieren.

Sub TextDateiEinlesen()
Dim varTextDatei, FF As Integer
Dim strText As String, arrData, intNumbers As Long, Spalte As Long, Spalten As Long
Dim wks As Worksheet, Zeile As Long, strPfadAkt As String
Const Spalte1 As Long = 1 'Spalte ab der Werte eingetragen werden sollen
Const Zeile1 As Long = 4 'Zeile ab der Werte eingetragen werden sollen
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "C:\Lokale Daten\Test" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
Set wks = ActiveSheet 'oder auch Worksheets("Tabelle1") 'Zieltabelle
FF = FreeFile()
Zeile = Zeile1 - 1 'Zeile nach der die Werte eingetragen werden sollen
Open varTextDatei For Input As #FF
Do Until EOF(FF)
Line Input #FF, strText
'Textzeile am "Tab" splitten in ein Array
arrData = Split(strText, vbTab)
'Arrayinhalte in Schritten in Zeilen eintragen
Spalte = Spalte1 'Spalte ab der Werte eingetragen werden sollen
Spalten = UBound(arrData) - LBound(arrData) + 1
Zeile = Zeile + 1
For intNumbers = LBound(arrData) To UBound(arrData)
If intNumbers > 4 Then
wks.Cells(Zeile, Spalte) = Replace(arrData(intNumbers), ",", ".")
Else
wks.Cells(Zeile, Spalte) = arrData(intNumbers)
End If
Spalte = Spalte + 1
Next
Loop
Close #FF
With wks
.Range(.Columns(Spalte1), .Columns(Spalte1 + Spalten - 1)).EntireColumn.AutoFit
With .Range(.Cells(Zeile1, Spalte1), .Cells(Zeile, Spalte1 + Spalten - 1))
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
End With
End If
VBA.ChDir strPfadAkt 'aktives Verzeichnis zurücksetzen
End Sub


Aber es gibt wahrscheinlich Problemem mit den Dezimalzahlen.
ggf. muss man einen anderen Weg gehen, indem man das Textfile zunächst in einer separaten Mappe öffnet und dann die Daten in die Zieltabelle kopiert.


Sub TextDateiEinlesen_Var01()
Dim varTextDatei, wksQuelle As Worksheet, wbText As Workbook
Dim wks As Worksheet, Zeile As Long, strPfadAkt As String
Const Spalte1 As Long = 1 'Spalte ab der Werte eingetragen werden sollen
Const Zeile1 As Long = 4 'Zeile ab der Werte eingetragen werden sollen
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "C:\Lokale Daten\Test" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
Set wks = ActiveSheet 'oder auch Worksheets("Tabelle1") 'Zieltabelle
'Textdatei öffnen
Application.Workbooks.OpenText Filename:=varTextDatei, _
DataType:=xlDelimited, Fieldinfo:=Array(Array(1, 1), Array(1, 2), Array(1, 2), Array(1, 1) _
, _
Array(1, 1)), Tab:=True, semicolon:=False, Comma:=False, Space:=False, _
Other:=False, DecimalSeparator:=","
'Quellobjekte setzen
Set wbText = ActiveWorkbook
Set wksQuelle = ActiveSheet
'Daten kopieren
wksQuelle.UsedRange.Copy Destination:=wks.Cells(Zeile1, Spalte1)
'Zellen formatieren
With wks
With .Range(.Cells(Zeile1, Spalte1), _
.Cells(Zeile1 + wksQuelle.UsedRange.Rows.Count - 1, Spalte1 + _
wksQuelle.UsedRange.Columns.Count - 1))
.EntireColumn.AutoFit
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
End With
'textdatei ohne Speichern schließen
wbText.Close savechanges:=False
End If
VBA.ChDir strPfadAkt 'aktives Verzeichnis zurücksetzen
End Sub


gruß
Franz

Anzeige
AW: Korrektur
22.04.2009 16:19:45
Jaffi
Hallo Franz,
leider gibt er immernoch die Fehlermeldung:
Fehler beim Kompilieren:
Sub oder Function nicht definiert
aus.
Dierk sagt weiter unten das es an meiner Excelversion (2004 for Mac) liegt?
Er sagt:

Hallo,
welche Version hast du? Älter als 2000? Dann geht der Code wg. Split() nicht
Gruß
Dierk


Dann hab ich wohl mit meiner Version keine Chance dies zu bewerkstelligen?
Tausend Dan!!

AW: Korrektur
22.04.2009 18:01:18
fcs
Hallo Jaffi,
ich arbeite mit Excel 2003 / Windows XP. Ich weiss jetzt nicht mit welcher Funktion die Mac-Version die Probleme hat und wie ggf. die entsprechende Funktion für den Mac heißt.
Probiere mal die 2. Variante. Die funktioniert meines Wissens sogar unter Excel97 und man kann die Probleme mit der Dezimalstelle bei Zahlen relativ einfach umschiffen.
Gruß
Franz
Anzeige
AW: Korrektur
22.04.2009 12:52:40
D.Saster
Hallo,
welche Version hast du? Älter als 2000? Dann geht der Code wg. Split() nicht
Gruß
Dierk
AW: Korrektur
22.04.2009 12:57:53
Jaffi
Mhm .. 2004 for MAC .... hatte vorher noch nie Versionsprobleme :( nu hab ich den Salat ?
Hab mich schon gefreut und nu schau ich in die Röhre... *schnief*
Hat irgendjemand eine Idee?
Danke Dierk für den Hinweis
AW: Korrektur
22.04.2009 17:32:22
Jaffi
Ich habe jetzt mal ein Makro aufgezeichnet was eigentlich auch super geht.
ABER! Dann müsste die Datei immer "etik00121890.txt" heissen. Logisch... ;)
Da sich der Dateiname aber ändert, muss es doch möglich sein, das man vorerst die Datei auswählt
die eingefügt werden muss. Sie liegt IMMER im Ordner: Macintosh HD:Users:Shared: ABER hat immer wieder eine andere Bezeichnung (ausser das etik********)
Kann irgend jemand sagen wir ich den Code anpassen müsste um die Datei vorher auswählen zu können?
Hier das Makro:

Sub texteinfuegen()
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;Macintosh HD:Users:Shared:etik00121890.txt", Destination:=Range("A5"))
.Name = "etik00121890_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With


Vielen Dank für eure Hilfe!!

Anzeige
AW: Korrektur
22.04.2009 18:16:20
fcs
Hallo Jaffi,
mit den entsprechenden Methoden/Eigenschaften der Windows Excel 2003-Version schauts etwa wie folgt aus.
Dabei wird dann der Dateiauswahldialog angezeigt und die Verzeichnisse entsprechend gesetzt.
Du muss dann ggf. nach den entsprechenden Methoden für die Mac-Version suchen.
Gruß
Franz

Sub texteinfuegen()
Dim varTextDatei
Dim strPfadAkt As String
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "HD:Users:Shared" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;Macintosh " & varTextDatei, Destination:=Range("A5"))
.Name = "etik00121890_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With
End If
VBA.ChDir strPfadAkt 'aktuelles Verzeichnis zurücksetzen
End Sub


Anzeige
AW: Korrektur
22.04.2009 19:05:42
Jaffi
Mhm. Grummel...das klappt einfach nicht.
Er sagt das er den Pfad nicht findet. Obwohl er doch richtig angegeben ist :(

VBA.ChDir "HD:Users:Shared" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(filefilter:="Text(*.txt),*.txt", _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;Macintosh " & varTextDatei, Destination:=Range("A5")


Obwohl mich die letzte Zeile des Codeausschnitts


"TEXT;Macintosh " & varTextDatei, Destination:=Range("A5")

misstrauisch stimmt? Das Wort Macintosh kann ich da nicht zuordnen. Aber bin auch bei weitem nicht so Fit wie du bei diesem Thema ;o)
Aber auch diese Zeile kommt mir für meine Zwecke nicht funktional vor:


.Name = "etik00121890_2"


wird doch auch hier wieder ein Dateiname genannt. Oder ist das in dem Fall nicht relevant?
Ich MUSS diesen Code zum laufen bringen. *grummel* das wird eine lange Nacht :(
falls Du keine Idee mehr hast Franz danke ich natürlich trotzdem für Deine Hilfe und Lösungsansätze
Gruss
J

AW: Korrektur
23.04.2009 09:16:51
fcs
Hallo Jaffi,
ich weiss nicht, wie die Syntax für Pfad und volständige Dateinamen beim Mac sein muss.
Schau dir mal bei schrittweiser Ausführung des Makros die Inhalte der Variablen "strPfadAkt" und "varTextDatei" an. Dann siehst du, ob "Macintosh " Teil des Pfades / Dateinamens sein muss/ist und passt die Code-Zeilen entsprechend an.
Die Zeile
.Name = "etik00121890_2"
wird ggf. dann relevant, wenn du in einem Tabellenblatt mehrere Querries plazieren möchtest; dann müssen ggf. dem Namen der Querry unterschiedliche Namen zugewiesen werden.
Mit
.Name = Mid(varTextDatei, Len(VBA.CurDir) + 2, Len(varTextDatei)-Len(VBA.CurDir)-4)
kannst du einen individuellen Namen kreieren.
Gruß
Franz
Gruß
Franz
Es will nicht klappen
23.04.2009 12:08:31
Jaffi
Hallo Franz,
nach langen hin und her hab ich es nun geschafft das er eine Zeile weiter geht im Code:

Sub texteinfuegen()
Dim varTextDatei
Dim strPfadAkt As String
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDir "Macintosh HD:Users:Shared" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename("TEXT", , "Bitte Textdatei mit Daten auswählen und ö  _
_
ffnen")
  If varTextDatei  False Then  ------> Hier bleibt er jetzt stehen :(
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;Macintosh " & varTextDatei, Destination:=Range("A5"))
.Name = "etik00121890_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With
End If
VBA.ChDir strPfadAkt 'aktuelles Verzeichnis zurücksetzen
End Sub


Es öffnet sich jetzt ein Dialog Datei öffnen. Mit dem richtigen Text ABER der vorangegebene Pfad stimmt nicht und ich KANN null auswählen er lässt einfach keine Datei zu!!
Mensch das ist ja wie verhext!! :(

AW: Es will nicht klappen
23.04.2009 13:05:41
fcs
Hallo Jaffi,
das ist schon ein Elend mit der Syntax für verschiedene Betriebssysteme.
Auf alle Fälle muss du die folgende Zeile noch anpassen, da "Macintosh " wohl Teil des Verzeichisnamens ist.

If varTextDatei  False Then  ------> Hier bleibt er jetzt stehen :(
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & varTextDatei, Destination:=Range("A5"))


Wie du die Zeile für den Dateiauswahl-Dialog genau anpassen muss weiss ich nicht. Syntax sollte eigentlich eher wie folgt aussehen.


varTextDatei = Application.GetOpenFilename(FileFilter:="Textdateien(*.TEXT), *.TEXT",  _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
ansonsten einfach mal ohne Filtervorgabe probieren


varTextDatei = Application.GetOpenFilename(_
Title:="Bitte Textdatei mit Daten auswählen und öffnen")


Gruß
Franz

AW: Es will nicht klappen
23.04.2009 15:13:35
Jaffi
Hallo Franz,
das mit dem weglassen der Filtervorgabe hats gebracht. Das geht jetzt, wenn auch mit Einschränkungen:

Sub texteinfuegen()
Dim varTextDatei
Dim strPfadAkt As String
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDrive "Macintosh HD:Users:Shared:" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename(Title:="Bitte Textdatei mit Daten auswählen und ö _
ffnen")
If varTextDatei  False Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & varTextDatei, Destination:=Range("A5"))
.Name = "etik00121890_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With
End If
VBA.ChDrive strPfadAkt 'aktuelles Verzeichnis zurücksetzen
End Sub


Er gibt zwar nicht den voreingestellten Pfad vor, und man kann jegliche Datei öffnen (was dann die Tabelle zerschiesst ;)) Aber ok...muss ich wohl mit leben!
Vielleicht kann man den Code zumindest so anpassen das die Datei die geöffnet werden darf IMMER mit "etik" anfangen MUSS ansonsten Fehlermeldung. Das würde eigentlich reichen, da diese Tabelle nur mit dieser Art von Dateien (etik********) arbeiten muss... würde das klappen?
Danke nochmals für Deine Hilfe Franz!!

AW: Es will nicht klappen
23.04.2009 17:41:04
fcs
Hallo Jaffi,
den gewählten Dateinamen kann man zusätzlich prüfen.
Ein absolutes Rätsel ist mir, warum man für den Datei-Auswahldialog den Filter nicht setzen kann.
Hast du in der VBA-Hilfe bzw. einem Beispiel unter der Hilfe für "GetOpenFilename" mal geschaut? Da sollte eigentlich die richtige Syntax gezeigt werden.
Gruß
Franz

Sub texteinfuegen()
Dim varTextDatei
Dim strPfadAkt As String
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDrive "Macintosh HD:Users:Shared:" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename( _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
If InStr(1, LCase(vardateiname), "etik") > 0 Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & varTextDatei, Destination:=Range("A5"))
.Name = "etik00121890_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With
Else
MsgBox "Gewählt: " & varTextDatei & vbLf _
& "Bitte eine Textdatei wählen, deren Name mit ""etik"" beginnt!"
End If
End If
VBA.ChDrive strPfadAkt 'aktuelles Verzeichnis zurücksetzen
End Sub


AW: Es will nicht klappen
23.04.2009 18:24:50
Jaffi
Hallo Franz,
ja da hatte ich geschaut:

This example displays the Open dialog box, with the file filter set to text files. If the user  _
chooses a file name, the code displays that file name in a message box.
fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If fileToOpen  False Then
MsgBox "Open " & fileToOpen
End If
This is the same example in Microsoft Excel for the Macintosh.
fileToOpen = Application.GetOpenFilename("TEXT")
If fileToOpen  False Then
MsgBox "Open " & fileToOpen
End If


Hat mir aber auch nicht weitergeholfen. Aber egal. Damit kann ich leben. Ich grenze ja ein indem die Datei immer mit "etik" beginnen muss.
Nur leider klappts mi deinem Vorschlag nicht richtig. Die MsgBox kommt IMMER ob die Datei mit etik beginnt oder nicht :o(
Das dieser Mac aber auch immer jammern muss ;o) Unter Windows klappts sicher oder? Hast Du das getestet?
Hab mich schon gefreut als ich ne andere Datei gewählt hab und die MsgBox kam. Nur leider bei der richtigen Datei kam die Meldung auch :(

AW: Es will nicht klappen
24.04.2009 08:48:18
fcs
Hallo Jaffi,
testen kann ich nicht, da bei mir deine Mac-Versionen natürlich nicht funktionieren.
Aber mir ist ein Fehler bei der Variablen passiert.
Das kann man vermeiden/als Fehler reduzieren, indem man als 1. Zeile des Codes
Option Explicit
verwendet. Dann müssen alle Variablen in Dim, Private oder Public-Anweisungen deklariert werden.
Korrekte If-Anweisung:

If InStr(1, LCase(varTextDatei), "etik") > 0 Then


Gruß
Franz

jippie... ;o)
24.04.2009 13:30:15
Jaffi
Hallo Franz,
tausend Dank für Deine Hilfe!! Jetzt funktioniert es tadellos!!
Ich stehe tief in Deiner Schuld ;o)
Nun werde ich mich dem ganz schwierigen Teil meines Projektes widmen. :o( oh man mir grauelts jetzt schon davor. Wir Ihr euch das immer so aus dem Ärmel schüttelt ist schon faszinierend ;o) Will das auch können ...
Aber ich bin mir sicher, das ich dies mit der Hilfe dieses echt geilen Forums und vielleicht sogar mit Dir gebacken bekomme, das ich mir bei meinem Chef ein Stein ins Brett "programmieren" kann ..
Nochmal vielen Dank Franz
Grüsse und schönes WE!!
Jaffi
ach nun hab ich doch noch was vergessen
24.04.2009 14:36:41
Jaffi
Mensch die erste Tegele die ich gelesen hab zum Thema war: Überlege Dir VORHER ganz genau was du machen willst!! :( Und nu hab ich doch noch was ausser acht gelassen :(
Der Code sorgt ja dafür, das die Txt-Datei Ab A5 Zeile für Zeile importiert wird. Was mache ich jetzt wenn ich aber zwei Dateien importieren will. wie müsste ich den Code umschreiben, das er einfach bei der ersten freien Zeile ab Spalte A5 anfängt. Ist die Tabelle leer fügt er mir dann sauber ab A5 ein und ist schon eine Datei eingelesen setzt er sie direkt unten ran... das geht doch oder?
Hättest dazu auch einen Lösungsansatz?
Wenn ich erst mal meinen Kurs an der VHS hinter mich gebracht habe schaffe ich das bestimmt auch allein. Aber bis dahin bin ich auf Deine/Eure unglaubliche VBA-Kompetens angewiesen
Sorry Franz wenns nervt .. aber ich versuche soviel wie möglich allein ... aber meistens gehts nicht ohne euch... :(
Tausend Dank
AW: ach nun hab ich doch noch was vergessen
24.04.2009 16:55:56
fcs
Hallo Jaffi,
ungetestet.
Die Einfügezelle ist entweder A5 oder die nächste freie Zelle in Spalte A.
Ich bin aber nicht 100% sicher ob man problemlos mehrer Querries so untereinander anordnen kann.
Gruß
Franz

Sub texteinfuegen()
Dim varTextDatei
Dim strPfadAkt As String, rngEinfuegZelle As Range
strPfadAkt = VBA.CurDir 'Aktives Verzeichnis merken
VBA.ChDrive "Macintosh HD:Users:Shared:" 'Verzeichnis mit Textdateien
varTextDatei = Application.GetOpenFilename( _
Title:="Bitte Textdatei mit Daten auswählen und öffnen")
If varTextDatei  False Then
If InStr(1, LCase(varTextDatei), "etik") > 0 Then
'Einfügezelle ermitteln
With ActiveSheet
If .Cells(.Rows.Count, 1).End(xlUp).Row >= 5 Then
Set rngEinfuegZelle = .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0)
Else
Set rngEinfuegZelle = .Range("A5")
End If
End With
'Querrydaten holen
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & varTextDatei, Destination:=rngEinfuegZelle)
.Name = "etik00121890_2"           'diese Zeile evtl. ganz weglassen !!!
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlMacintosh
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.Refresh BackgroundQuery:=False
.UseListObject = False
End With
Else
MsgBox "Gewählt: " & varTextDatei & vbLf _
& "Bitte eine Textdatei wählen, deren Name mit ""etik"" beginnt!"
End If
End If
VBA.ChDrive strPfadAkt 'aktuelles Verzeichnis zurücksetzen
End Sub


AW: ach nun hab ich doch noch was vergessen
24.04.2009 18:07:39
Jaffi
Mensch Franz Du bist ein Gott!! ;)
Das funktioniert Tadellos!!!!
ich kann mich garnicht genug bedanken!!
trotzdem versuch ich es....100000000000 mal Danke!!!
Was muss ich tun, um einen Profi wie dich zu überreden mir beim Lösen meines grössten Problems..welches ich NIEMALS allein gelöst bekomme...zu helfen...
Werde ganz rot dabei dich das zu fragen...;/ aber ich glaube ich komme nur mit Deiner Hilfe ans Ziel.. ich werde einfach gleich mal "Auf Deutsch" schreiben was meine Tabelle, nun wo sie sich brav mit Daten füllen lässt, tun muss wenn ich eine 6stellige Zahl in C2 eingebe.
Nur schon mal eins vorweg. Ich will den Wareneingang in unserem Laden mit Excel bewerkstelligen...
Und Du entscheidest dann einfach ob du mich wegklickst und mir nen Vogel zeigst weil zu aufwendig ;o) oder Du versuchst mir zu helfen... wobei mich das letztere zum glücklichsten Menschen der Welt machen würde..
wie auch immer Du dich entscheidest... ich stehe jetzt schon tief in deiner Schuld!!
Vielen Dank Franz!!!!
AW: ach nun hab ich doch noch was vergessen
24.04.2009 20:02:08
Jaffi
So nun versuch ich mal zu schildern, was diese Tabelle eigentlich machen soll. Und ich hoffe sooo sehr das Du mir helfen kannst:
Die Tabelle besteht aus 3 Tabellenblättern. Wareneingang, Bestellungen, Sicherung.
Die txt-Datei befüllt das Blatt Wareneingang und zeigt auf was an Ware gekommen sein müsste.
Spalte A die Artikelnummer B-C für die Bearbeitung nicht relevant. D die Soll-Menge, E nicht relevant, F die Menge die ich dann erfasse und G für die Auswertung.
Die ich, wenns erstmal läuft, denke ich alleine hinbekomme!! ;)
Bevor ich den Wareneingang scanne trage ich in Tabellenblatt "Bestellungen" die bestellten Artikelnummern (Ab A3 - A*) ein. Daneben die bestellte Menge. (Irgendwann soll das auch mal automatisch gehen, aber das gibt unser "Billig-Warenwirtschaftssystem" noch nicht her. ;)
In Tabellenblatt "Sicherung" wird stetig gepflegt das und wie bestimmte Artikelnummern gegen Diebstahl gesichert werden müssen. Beispiel (A) 105467 (B) in Vitrine. usw.
Ich habe nun mal, was für mich schon verdammt schwer war, versucht auf Deutsch zu schreiben was der Code machen müsste sobald ich im Tabellenblatt "Wareneingang" in C2 die Artikelnummer der Artikel einscanne die ich quasi zählen will:

6stellige (NUR Zahlen) Dateieingabe in C2
1. Prüfung:	ist C2 6stellig?
1.Prüfung ja =
weiter mit 2. Prüfung
1.Prüfung nein =
MsgBox „Keine gültige Artikelnummer“
Button OK
C2 leer machen
2. Prüfung: 	prüfen ob C2 in Tabellenblatt „Sicherung“ (A3-A letzte, gefüllte Zelle) vorhanden  _
ist.
2.Prüfung ja =
weiter mit 3. Prüfung
2.Prüfung nein =
weiter mit 4. Prüfung
3. Prüfung:	prüfen ob in Zelle C neben gefundener Zahl in Tabellenblatt  „Sicherung“
das Wort "gesichert" steht
3. Prüfung ja =
weiter mit 4. Prüfung
3. Prüfung nein =
in Tabellenblatt „Sicherung“ in Zelle C neben dem gefundenen Wert das Wort "gesichert"
schreiben
MsgBox: „ Bitte den Artikel mit (Textinhalt aus Zelle B neben dem gefundenen Wert) sichern“  _
ausgeben
Button „weiter“
Weiter mit 4. Prüfung
4. Prüfung:	prüfen ob C2 in Tabellenblatt „Bestellungen“(A3-A letzte, gefüllte Zelle) vorhanden  _
ist.
4. Prüfung ja =
weiter mit 5. Prüfung
4. Prüfung nein =
weiter mit 6. Prüfung
5. Prüfung:	prüfen ob in Zelle C neben dem gefundenen Wert das Wort gemeldet steht
5. Prüfung ja =
weiter mit 6. Prüfung
5. Prüfung nein =
in Zelle C neben den gefundenen Wert das Wort gemeldet schreiben
MsgBox: „Der Artikel ist (Textinhalt aus Zelle B neben dem gefundenen Wert)
mal bestellt“
Button „weiter“
weiter mit 6. Prüfung
6. Prüfung:	prüfen ob C2 in der aktiven Tabelle (Spalte A5 – A letzte, gefüllte Zelle)  _
vorhanden ist.
6. Prüfung ja =
in Zelle F neben der gefundenen Zeile aufsteigend den jeweils erfassten Wert schreiben (1 mal  _
gescannt 1. Zweites mal gescannt 2 usw. Eben den Eingang entsprechend zählen was ja eigentlich der Grundgedanke meiner Idee war ;o)
6. Prüfung nein =
C2 in erste, leere Zelle der Spalte A des Aktiven Tabellenblattes eintragen
In Zelle B daneben das Wort MEHRMENGE schreiben
In Zelle F daneben wieder aufsteigend zählen. (1 mal gescannt 1 zweites mal gescannt 2 usw.
C2 in der aktiven Tabelle leer machen
Auf die nächste Eingabe warten


Sicher ist für Dich/Euch zu erkennen, das sich gefundene Werte in Tabellenblatt "Bestellungen" und "Sicherung" immer nur jeweils 1 mal melden sollen. Dies hat den Hintergrund, das ich nicht JEDESMAL wenn ich den Artikel scanne eine Rückmeldung brauche sollte er Bestellt sein und gesichert werden müssen, 1mal reicht mir dabei völlig. Deswegen die, ich nenne sie mal "Prüfeintragungen" ;o) Die MsgBoxen sollen die Sicherungsart und die Bestellmenge jeweils auslesen und dann ausgeben.
Um selber zu sehen ob ich in jeder Abfrage ein Wahr UND ein falsch habe, habe ich die "Prüfungen" durch nummeriert. Bitte lacht nicht wenn das nicht unbedingt eine fachgerechte Vorgehensweise ist, aber so auf Deutsch sehe ich wenigstens ob ich an alles gedacht habe. Und es scheint mir als ob dies, wenn ich jetzt die Übersetzung in VBA hätte, auch klappen könnte..
Ich hoffe ich habe es einigermassen verständlich rübergebracht, wie gesagt versteh es ja selbst kaum ;o)
Wenn Ihr, vorallem aber Du Franz, mir hierbei irgendwie helfen könntet. Sei es mit Lösungsansätzen, Tutorials im Netz, anpassbare, ähnliche Codes o.ä. wäre ich total glücklich.
Und Franz würde ich einen Heiratsantrag machen ;o)
Ich danke euch jetzt schon für jeglichen Tip
wünsche ein schönes WE und mir eine schlaflose Nacht vor Excel ;)
lg
J.

AW: ach nun hab ich doch noch was vergessen
27.04.2009 12:02:20
fcs
Hallo Jaffi,
ich danke für die vielen Dankes und für den bevorstehenden Heiratsantrag ;o). Mindestvoraussetzung: Du bist weiblichen Geschlechts.
Die gewünschte Logik hast du ja sehr schön beschrieben und sie läßt sich auch umsetzen. Etwas unklar ist mir die Sache mit dem Zählen der Scanns. Ich hab es mal so eingerichtet, dass der Zähler des jeweiligen Artikels nach jedem Scann um 1 erhöht wird.
Die eingegebene Artikel-Nr. kann man in den 3 Blättern jeweils mit der Suchfunktion in Spalte A suchen und dann die entsprechenden Aktionen ausführen.
Ich weiss jetzt nicht, ob das Eintragen der Artikelnummer in C2 durch das Scannprogramm automatisch das von mir für die Tabelle "Wareneingang" eingerichtete Ereignismakro startet.
Wenn "Nein", dann muss du dir eine zusätzliche Schaltfläche einrichten und das Makro "WarenEingang" zuweisen und dieses nach jedem Scannvorgang starten.
Gruß
Franz
https://www.herber.de/bbs/user/61439.xls

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige