26.07.2016, 16:26 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2016, 16:26 von Vince440.)
Hi,
ich habe folgendes Problem:
Ich habe eine Mappe mit 3 Tabellenblättern. Im ersten Blatt Teil1 sollen die Daten von txtfile1 sowie im zweiten Blatt Teil2 die Daten von txtfile2 importiert werden. Das dritte Blatt arbeitet mit Referenzierungen und ist eine Kombination der ersten beiden.
Da sich innerhalb der txtfiles Semikolons zum Trennen befinden, muss das beim Import voreingestellt sein, dass nur dadurch und nicht durch Tabulator getrennt wird. Außerdem muss es Windows (ANSI)-Format haben.
Ich möchte nun ein Makro erstellen, welches mir einen Datei-Dialog öffnet und NUR die Daten aus txtfile1 IMMER in Tabellenblatt Teil1 einfügt. Für txtfile2 gilt dann das gleiche mit Teil2, dafür will dann ein eigenes Makro machen, da nicht immer alle txtfiles vorliegend sind, bzw. aktuelle Daten nicht geändert werden sollen, solange kein txtfile reinkommt.
Der Dateipfad ist natürlich nicht immer gleich, daher die Auswahl über den Dialog.
Du musst nicht jede Frage gleich innerhalb weniger Minuten in mehreren Foren posten. Dass wir hier crossposting nicht verbieten ist keineswegs ein Freibrief für massives Ausnutzen unserer Kulanz dieses Thema betreffend. Man sollte den Antwortern in einem Forum schon mal m.E. um die zwei Stunden Zeit geben, wobei die Meinungen dazu auch etwas auseinander gehen.
Schaue erst mal, was in dieser Frage der Makrorekorder leistet und stelle den Code zur Verbesserung dann ein.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
01.08.2016, 17:32 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2016, 17:32 von Vince440.)
Hi,
hier mal mein Einstieg.
Mein Problem liegt explizit darin, dass ich 1. keinen Dialog hinbekomme und 2. unabhängig vom Tabellenblatt arbeiten will. Dh. die Ausführung meiner Makros ist immer Tabellenblatt-gebunden, was mega nervt.
Ich stelle mir beim Gesamtblatt Tablet bspw. für jedes Einzelblatt Teil1, Teil2,... einen Button vor. Bei Betätigen z.B. des ERSTEN Buttons öffnet sich ein Dialog zur Auswahl einer txt-Datei in das Tabellenblatt Teil1. Der txt-Import soll als Windows ANSI, Spaltentrennung über Semikolon und Datenformat: Text erfolgen. Betätigung des ZWEITEN Buttons löst einen Dialog für ein Txt-File für das Tabellenblatt Teil2.
Ich habe mal eine Excel für die Struktur inkl. des bisherigen Makros angefügt...
also habe jetzt ungefähr gefunden, was ich suche. Wer kann mir den Code so kombinieren, dass zum einen die txt-Datei korrekt formatiert importiert wird und das die neue Datei nicht in einem neuen Excel-file geöffnet wird, sonder direkt an die richtige Stelle (Teil1) gesetzt wird.
Anbei der Code:
Code:
Sub neu() Dim ImportDatei As Variant Dim wbImport As Workbook
wie kann ich in dem bisherigen Makro die Leerzeilen in dem Tabellelblatt löschen, in welche ich das neue txt eingefügt habe, wie in diesem Makro?
Code:
Sub DelEmptyLines() Dim i As Long ' Zeilenzähler Application.ScreenUpdating = False ' Bildschirmausgaben abschalten For i = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row _ To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(i)) = 0 _ Then Rows(i).Delete If i Mod 100 = 0 Then Application.StatusBar = i Next Application.StatusBar = False ' Statuszeile wieder ans Excel zurückgeben Application.ScreenUpdating = True ' Bildschirmausgaben einschalten End Sub
Außerdem hätte ich gerne in den Spalten A, B und C eine Löschung sämtlicher Sonderzeichen wie mit diesem Makro:
Code:
Public Sub Zeichenloeschung() Dim i As Long Dim Start As String Dim Ende As String Dim Temp As String Dim erlaubt As String Start = Time ' <- hier wird eine Zeitmessung eingeleitet erlaubt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!§$%&/[]()=?*#ß\ÄÖÜ@,-_:.+;<>°'""" ' Groß-/Kleinschreibung wird ignoriert Application.ScreenUpdating = False ' Bildschirm-Aktualisierung wird hier deaktiviert; ' Ansonsten dauert der Vorgang noch ein wenig länger, da er sonst jede Änderung sofort anzeigt For Each C In Selection With C Temp = "" For i = 1 To Len(.Text) If InStr(1, erlaubt, Mid(.Text, i, 1), vbTextCompare) > 0 Then Temp = Temp & Mid(.Text, i, 1) End If Next i .Value = Temp End With Next C Application.ScreenUpdating = True ' Jetzt wird die Anzeige wieder aktualisiert Ende = Time ' <- hier wird die Zeitmessung gestoppt End Sub
Dazu würde ich gerne noch die Spalten D und E genauso von Sonderzeichen SOWIE Leerzeichen (also mit " " ) bzw. nicht erlaubten Sonderzeichen wie mit dem folgenden Makro befreien (fast das gleiche wie oben).
Code:
Public Sub Zeichenloeschung() Dim i As Long Dim Start As String Dim Ende As String Dim Temp As String Dim erlaubt As String Start = Time ' <- hier wird eine Zeitmessung eingeleitet erlaubt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!§$%&/[]()=?*#ß\ÄÖÜ@,-_:.+;<> °'""" ' Groß-/Kleinschreibung wird ignoriert Application.ScreenUpdating = False ' Bildschirm-Aktualisierung wird hier deaktiviert; ' Ansonsten dauert der Vorgang noch ein wenig länger, da er sonst jede Änderung sofort anzeigt For Each C In Selection With C Temp = "" For i = 1 To Len(.Text) If InStr(1, erlaubt, Mid(.Text, i, 1), vbTextCompare) > 0 Then Temp = Temp & Mid(.Text, i, 1) End If Next i .Value = Temp End With Next C Application.ScreenUpdating = True ' Jetzt wird die Anzeige wieder aktualisiert Ende = Time ' <- hier wird die Zeitmessung gestoppt End Sub
Ich habe dazu auch noch das Problem, dass meine Bezüge aus dem Gesamtblatt also wo alle einzelnen Blätter zusammenlaufen nach der Ausführung deines Makros kaputt gehen und nicht mehr funktionieren. Wieso ist das so und wie kann ich das verhindern? Es kommt ja augenscheinlich daher, dass ich etwas importiere und dann eben nichts zum verweisen vorhanden ist.
ich bin zwar nicht der Ralf, aber hätte noch folgenden Vorschlag. Da Du ja Querytables hast, genügt ja ein Refresh mit Dateiabfrage.
Sub Import_txt1() ' ' Import_txt1 Makro ' With Sheets("Teil1").QueryTables(1) .TextFilePromptOnRefresh = True On Error Resume Next .Refresh On Error GoTo 0 End With ActiveWorkbook.Save End Sub
dein letzter Vorschlag hat sehr gut funktioniert! danke vielmals! :18: :18:
Kannst du mir dort noch die Auswahl der Spalten A bis C und der Anwendung der Sonderzeichenlöschung (Leerzeichen nur links und rechts von Anfang/Ende löschen, keine Sonderzeichen, sonst nur erlaubte) sowie die Auwahl der Spalten D und E mit der Anwendung der Zeichenlöschung (keine Leerzeichen, keine Sonderzeichen, nur erlaubte) einbinden, s.u.?
Public Sub Zeichenloeschung() Dim i As Long Dim Start As String Dim Ende As String Dim Temp As String Dim erlaubt As String Start = Time ' <- hier wird eine Zeitmessung eingeleitet erlaubt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!§$%&/[]()=?*#ß\ÄÖÜ@,-_:.+;<>°'""" ' Groß-/Kleinschreibung wird ignoriert Application.ScreenUpdating = False ' Bildschirm-Aktualisierung wird hier deaktiviert; ' Ansonsten dauert der Vorgang noch ein wenig länger, da er sonst jede Änderung sofort anzeigt 'For Each C In Selection For Each C In Application.Intersect(Sheets("Teil1").Columns("A:C"), Sheets("Teil1").UsedRange) With C Temp = "" For i = 1 To Len(.Text) If InStr(1, erlaubt, Mid(.Text, i, 1), vbTextCompare) > 0 Then Temp = Temp & Mid(.Text, i, 1) End If Next i .Value = Temp End With Next C Application.ScreenUpdating = True ' Jetzt wird die Anzeige wieder aktualisiert Ende = Time ' <- hier wird die Zeitmessung gestoppt End Sub
Das rufst du dann einfach im Makro mit auf:
Sub Import_txt1() ' ' Import_txt1 Makro ' With Sheets("Teil1").QueryTables(1) .TextFilePromptOnRefresh = True On Error Resume Next .Refresh On Error GoTo 0 End With Zeichenloeschung ActiveWorkbook.Save End Sub