26.07.2016, 15:26 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2016, 15: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, 16:32 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2016, 16: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