Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Import aus TXT mit Leerzeilen

Mitglied: Venjakob

Venjakob (Level 1) - Jetzt verbinden

27.08.2007, aktualisiert 08.01.2009, 5453 Aufrufe, 10 Kommentare

Ich möchte Namen, die in einer TXT-Datei stehen und mit TABs getrennt sind untereinander in eine Excel-File importieren.

Ansich keine schwierige Sache, schon tausendmal gemacht - jetzt sollen die Namen aber mit je 5 Leerzeilen importiert werden, d.h.

A1: Name1

A6: Name2

A11: Name3

usw.

Wie geht sowas?
Mitglied: bastla
27.08.2007 um 17:59 Uhr
Hallo Venjakob!

Mit dem folgenden Stückchen VBA-Code sollte sich Dein Vorhaben umsetzen lassen:
01.
Sub Import() 
02.
sTxtPath = "D:\ImportDatei.txt" 'Textdatei mit vollständigem Pfad 
03.
iRow = 1 'Startzeile 
04.
iOffset = 5 'Zeilenabstand 
05.
sDelim = vbTab 'Trennzeichen 
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
Set wbNew = Workbooks.Add 
09.
With wbNew.Worksheets(1) 
10.
    Set oInFile = fso.OpenTextFile(sTxtPath, 1) 
11.
    Do While Not oInFile.AtEndOfStream 
12.
        aLine = Split(oInFile.ReadLine, sDelim) 
13.
        .Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine) + 1)) = aLine 
14.
        iRow = iRow + iOffset 
15.
    Loop 
16.
    .Activate 
17.
End With 
18.
End Sub
Einschränkungen:
Es wird angenommen, dass die in der Zeile "sTxtPath = ..." angegebene Datei existiert und ein für den Import brauchbares Format aufweist.

Es wird nicht überprüft, ob die maximale Zeilenanzahl des Blattes überschritten wird (da pro Datensatz 5 Zeilen "verbraucht" werden, dürfte die Textdatei nicht mehr als 13.107 Zeilen haben).

Funktionsweise:
Es wird eine neue Mappe erstellt, in deren erstes Tabellenblatt die Importdaten in den vorgegebenen 5er-Zeilenabständen (siehe Zeile "iOffset = 5")eingefügt werden. Dazu wird die Textdatei zeilenweise eingelesen, anhand des Trennzeichens "Tab" (siehe Zeile "sDelim = vbTab") auf Felder aufgeteilt und in die entsprechende Tabellenzeile übertragen.

Ein automatisches Speichern ließe sich bei Bedarf ergänzen ...

Grüße
bastla

P.S.: Da ich mir nicht sicher war, ob es 5 Leerzeilen oder ein Zeilenabstand von 5 sein sollte, habe ich mich an Deinem Beispiel orientiert - wenn wirklich nach jedem Datensatz 5 Leerzeilen gewünscht sein sollten, einfach "iOffset" auf 6 setzen ...

[Edit] Fehlerhafte Zeile ".Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine))) = aLine" durch Hinzufügen von " + 1" korrigiert. [/Edit]
Bitte warten ..
Mitglied: Venjakob
27.08.2007 um 19:41 Uhr
Hallo & vielen Dank!

Leider bin ich in Skipten ein absoluter Laie, deshalb einige Fragen und Korrekturen:

1. Wo binde ich das Skript ein?

2. Die Namen, stehen in der TXT-Datei natürlich untereinander, die Vornamen durch Semikolon getrennt, also:

Nachname1;Vorname1
Nachname2;Vorname2
...

und in der Excel-Datei soll es dann so aussehen:

A1: Nachname1 B1:Vorname1

A6:Nachname2 B6:Vorname2

...

Danke!
Bitte warten ..
Mitglied: bastla
27.08.2007 um 21:08 Uhr
Hallo Venjakob!

1. Wo binde ich das Skript ein?
Je nachdem, wie häufig es benötigt wird, kannst Du es in der "Persönlichen Makroarbeitsmappe" (steht dann immer zur Verfügung) oder in einer beliebigen Exceldatei (die beim Import daher geöffnet sein muss) ablegen.

Für den Moment einmal die Beschreibung der zweiten Variante:
  • Erstelle eine neue Exceldatei.
  • Wechsle über "Extras / Makro / Visual Basic-Editor" (oder der Tastenkombination Alt-F11) in den VBA-Editor.
  • Wähle dort "Einfügen / Modul".
  • Kopiere das Script in den Arbeitsbereich.
  • Speichere zB unter dem Namen "Import-Makro.xls" (damit wird die gesamte - im Prinzip nur aus leeren Tabellen, aber eben auch dem Script, bestehende - Mappe gespeichert).

Ausführen kannst Du das Script
  • entweder direkt aus dem VBA-Editor (den Cursor in einer beliebigen Zeile zwischen "Sub Import" und "End Sub" platzieren und den Menüpunkt "Ausführen / Sub/UserForm ausführen" oder F5 oder das grüne "Play"-Symbol aus der Symbolleiste zum Starten verwenden) oder
  • aus der Arbeitsmappe so wie ein aufgezeichnetes Makro (also über "Extras / Makro / Makros... / "Import" markieren / Ausführen" oder
  • indem Du eine beliebige AutoForm oder Grafik auf dem Tabellenblatt platzierst und diese über das Kontextmenü "Makro zuweisen..." mit "Import" verknüpfst und damit zur Schaltfläche machst.

2. Die Namen, stehen in der TXT-Datei natürlich untereinander, die Vornamen durch Semikolon getrennt
Das ist kein Beinbruch, das derzeit aufgrund Deines Eingangs-Postings vorgesehene Trennzeichen "Tab" lässt sich leicht durch ein Semikolon ersetzen, indem Du die entsprechende Scriptzeile auf
01.
sDelim = ";" 'Trennzeichen
abänderst.

Damit sollte der Import eigentlich schon möglich sein.

Grüße
bastla
Bitte warten ..
Mitglied: Venjakob
27.08.2007 um 21:35 Uhr
WOW - ich bin tief beeindruckt! Danke!

Läuft super (Excel 2007)!

Wie kannnoch mehr importiert werden?

Alles getrennt wie Nachname;Vorname;Strasse
Bitte warten ..
Mitglied: bastla
27.08.2007 um 21:51 Uhr
Hallo Venjakob!

Erstellt habe ich das Script unter Excel 2003 (hätte ich bei der Beschreibung oben noch anmerken sollen) - dass es unter 2007 läuft, freut mich. (Die Beschränkung hinsichtlich der Zeilenanzahl dürfte dann eigentlich auch kein Problem darstellen. )

Wie kannnoch mehr importiert werden?
Eigentlich nimmt das Script alles, was es kriegen kann - also wenn Du 8 Felder (sauber durch ";" getrennt) in der Textdatei hast, sollten eigentlich auch alle 8 importiert werden - sogar eine unterschiedliche Anzahl von Feldern sollte keine Probleme machen, da jede Zeile dynamisch zerlegt wird und die vorgefundene Anzahl von Feldern in die Tabelle geschrieben werden sollte.

Grüße
bastla
Bitte warten ..
Mitglied: Venjakob
27.08.2007 um 21:54 Uhr
Dann die letzte Frage:

Was muss ich abändern, damit das Makro den Import in die gerade geöffnete Excel-Datei durchführt und nicht eine neue öffnet?
Bitte warten ..
Mitglied: bastla
27.08.2007 um 22:03 Uhr
Hallo Venjakob!

Ändere die Zeile
01.
Set wbNew = Workbooks.Add
auf
01.
Set wbNew = ThisWorkbook
Noch ein Tipp: Wenn Du die Reihenfolge der Tabellenblätter änderst, kannst Du auch mehrere Textdateien in die selbe Mappe importieren, da immer in das erste Tabellenblatt geschrieben wird.

Grüße
bastla
Bitte warten ..
Mitglied: Venjakob
27.08.2007 um 22:14 Uhr
Nur noch 1 Frage!

Das Makro nimmt den 3. Eintrag nicht, es haldelt sich um ein Kürzel mit 2 Großbuchstaben,
also eine Zeile in der TXT-Datei sieht so aus:

Venjakob;Martin;VE

Venjakob & Martin kommen an, VE nicht.

Evtl. zu kurz? Gibt es eine Mindestlänge?
Bitte warten ..
Mitglied: bastla
27.08.2007 um 22:24 Uhr
Hallo Venjakob!

Hatte leider nur oberflächlich getestet - in der folgenden Zeile hat das "+ 1" gefehlt - bitte ergänzen oder ganze Zeile austauschen - sorry ...
01.
        .Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine) + 1)) = aLine
Technische Erklärung für ev Interessierte:
Wenn in VBA ein Array aus einem Zellbereich ("Range") erstellt wird, erfolgt die Indizierung mit Basis 1 - beim Aufspalten oben mittels "Split()" erhält das erste Element den Index 0, sodass UBound(Array) - eigentlich wie in VB gewohnt - (Elementanzahl - 1) liefert. Da die Spaltennummerierung mit 1 beginnt, ist die letzte Spaltennummer entsprechend auf UBound(Array) + 1 zu setzen ...

Grüße
bastla

P.S.: Ich ergänze es oben im kompletten Script auch gleich ...
Bitte warten ..
Mitglied: Venjakob
27.08.2007 um 23:14 Uhr
Super! Alles hat geklappt! 1000 Dank!
Bitte warten ..
Ähnliche Inhalte
Microsoft Office

Ecxel 2010 Macro txt import nur bestimmte Zeilen

gelöst Frage von BloodyRulzMicrosoft Office7 Kommentare

Hallo, ich hoffe das man mir helfen kann. Ich habe ein Makro aufgenommen welches mir eine txt Datei importiert, ...

Batch & Shell

Leerzeilen per Batch aus Textdatei entfernen

gelöst Frage von Yenne97Batch & Shell9 Kommentare

Hallo Zusammen Ich bin neu hier. Ich würde gerne einen Batch schreiben der: 1. In einer Textdatei alle Leerzeichen ...

Linux Tools

Mit Linux am ende einer Datei eine Leerzeile einfügen

gelöst Frage von OIOOIOOIOIIOOOIIOIIOIOOOLinux Tools30 Kommentare

Tach ihr alle, Ich wollte mal einen etwas aufwendigen Script schreiben welches via Cronejob zur bestimmten Zeiten ausgeführt werden ...

Batch & Shell

Batch Leerzeilen und Passwort vergessen Funktion

gelöst Frage von oleg944Batch & Shell3 Kommentare

Hallo zusammen, ich arbeite zur Zeit aus Spaß an einer Batch DateiBisher habe ich ein "Design" festgelegt und bereits ...

Neue Wissensbeiträge
Drucker und Scanner
HP-MF-Drucker per Fax angreifbsr
Information von Lochkartenstanzer vor 4 StundenDrucker und Scanner

Endlich eine sinnvolle Verwendung für Faxe: Damit kann man offensichtlich den Drucker übernehmen. lks

Router & Routing

Das pfSense Buch ist jetzt für jeden kostenlos zu beziehen

Tipp von magicteddy vor 20 StundenRouter & Routing2 Kommentare

Bisher war das Buch nur für zahlende Unterstützer verfügbar, jetzt steht für Jedermann kostenlos zur Verfügung. Siehe auch The ...

Firewall

Möglicherweise neue Sicherheitslücke in Mikrotik-Firmware

Information von LordGurke vor 3 TagenFirewall3 Kommentare

Hallo zusammen, vor ein paar Monaten gab es ja bereits eine Sicherheitslücke in der Firmware von Mikrotik-Routern, über welche ...

Erkennung und -Abwehr
Rechner hacken mit Cortana, auch Remote
Information von Lochkartenstanzer vor 4 TagenErkennung und -Abwehr3 Kommentare

heise berichtet über den Vortrag von der Blackhat Open Sesame: Picking Locks with Cortana. Einige Fehler sind schon gefixt, ...

Heiß diskutierte Inhalte
Windows Netzwerk
Performance bei Terminalserver
Frage von azizalexanderWindows Netzwerk20 Kommentare

Hallo zusammen, Ich wusste nicht in welches Thema meine Frage passt ich Bitte um Vergebung falls ich hier falsch ...

LAN, WAN, Wireless
Bandbreitenverteilung Netzwerk Linux NAS Qnap
Frage von Re-AnimatorLAN, WAN, Wireless18 Kommentare

Hallo Allerseits, ich habe hier im Netzwerk ein Problem mit der Bandbreite für das ich keine Erklärung habe! und ...

Peripheriegeräte
Steckdose(nleiste) mit Schwellwert für off und mit externem Taster
Frage von ahstaxPeripheriegeräte15 Kommentare

Hallo, ich suche eine Steckdose oder Steckdosenleiste mit externem Taster und Schwellwerterkennung. Zu realisieren ist folgendes: Ein PC soll ...

Exchange Server
Exchange 2013 - Unable to Relay nach extern, SuperMailer
Frage von leon123Exchange Server15 Kommentare

Hallo zusammen, ich brauch mal wieder eure Hilfe. Ich beschäftige mich gerade mit dem SuperMailer und erhalte vom Exchange ...