Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1028to1032
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
Darf ich meine Frage nochmal stellen ?
03.12.2008 07:05:47
Dieter
Hi,
habe mal wieder ein schweres Problem:
ich möchte aus einer anderen Excel Datei ein paar Zeilen kopieren. das Ganze soll folgendermassen funktionieren:
Quelldatei : "IMPORT.XLS
Tabellenblatt : "DATEN" oder "FPC"
Zieldatei : "EXPORT.XLS
Tabelnneblatt : "EINGABE"
so, nun will ich per Makro bestimmte Zeilen aus Import.xls aus dem Tabellenblatt "DATEN" oder "FPC" in die Datei Export.xls/Eingabe kopieren, und zwar unter folgender Bedingung:
Immer wenn in den Tabellenblättern in der Spalte A eine Zahl drin steht (kann auch mal leer sein) oder wenn in Spalte A der Eintrag "UNIT" vorkommt, dann die komplatte zeile in die Datei Export.xls/Eingabe ab der zeile 5 reinkopieren. das Ganze immer untereinender.
Das Makro sollte von der Zieldatei aus gestartet werden.
Habe leider kein Ahnung, wie ich auf die Quell Datei zugreifen kann.
Dieter

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bedingtes Kopieren von Zeilen
03.12.2008 09:29:56
Zeilen
Hallo Dieter,
probier mal

Sub Uebertrag()
Dim strVz As String, strDQ As String, arrWQ, lngQ As Long, lngZ As Long
Dim wks As Worksheet
strVz = "c:\temp\"                  ' fest vorgegebenes Verzeichnis - anpassen
'   strVz = ThisWorkbook.Path & "\"    ' oder: Verzeichnis wie aktive Mappe
strDQ = "IMPORT.xls"
arrWQ = Array("DATEN", "FPC")
With Worksheets("EINGABE")
lngZ = 5
'     lngZ = Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
Workbooks.Open Filename:=strVz & strDQ, UpdateLinks:=False, ReadOnly:=True
For Each wks In ActiveWorkbook.Worksheets(arrWQ)
For lngQ = 1 To wks.Cells(wks.Rows.Count, 1).End(xlUp).Row
If wks.Cells(lngQ, 1).Value = "UNIT" Or _
Application.IsNumber(wks.Cells(lngQ, 1)) Then
'           If wks.Cells(lngQ, 1).Value = "UNIT" Or IsNumeric(wks.Cells(lngQ, 1)) Then
wks.Rows(lngQ).Copy .Cells(lngZ, 1)
lngZ = lngZ + 1
End If
Next lngQ
Next wks
ActiveWindow.Close
End With
End Sub

Mit strVz wird festgelegt, in welchem Verzeichnis die Quellmappe steht.
Da habe ich dir zwei Möglichkeiten geschrieben.
Wenn in EINGABE in den Zellen A5, A6 schon etwas steht, soll dann trotzdem in Zeile 5
oder erst in Zeile 7 begonnen werden?
Wenn in Zeile 5, dann verwende "lngZ=5", wenn in Zeile 7, dann verwende
lngZ = Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
Application.IsNumber(wks.Cells(lngQ, 1)) prüft, ob in Spalte A eine Zahl steht.
Wenn auch Texte, die aus Ziffern )und evtl. einem Komma) bestehen, erfasst werden sollen, verwende
IsNumeric(wks.Cells(lngQ, 1))
Das prüft nur, ob der Wert in eine Zahl umgewandelt werden kann.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
Wow, Spitze, vielen Dank
03.12.2008 10:18:00
Dieter
... funktioniert perfekt.
Vielen, vielen Dank
Gruss
Dieter
AW: Darf ich meine Frage nochmal stellen ?
03.12.2008 10:28:08
fcs
Hallo Dieter,
hier mein Lösungsvorschlag.
Gruß
Franz

Sub DatenImport()
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim wbZiel As Workbook, wksZiel As Worksheet
Dim lngZeileQ As Long
Dim lngZeileZ As Long
Dim varAuswahl, strVerzeichnisAktuell
Dim intI, arrBlatt() As String, strPrompt As String
'Verzeichnis der Quelldatei = Startverzeichnis für Dateiauswahl
Const strPfadQ As String = "C:\Lokale Daten\Test"           'ggf. Anpassen!!
'Aktuelles Verzeichnis merken
strVerzeichnisAktuell = VBA.CurDir
'Startverzeichnis für Importdatei-Auswahl setzen
VBA.ChDir strPfadQ
varAuswahl = Application.GetOpenFilename(FileFilter:="Excel(*.xls),*.xls)", _
Title:="Bitte Quelldatei für Daten-Import öffnen")
If Not varAuswahl = False Then
Set wbZiel = ActiveWorkbook
Set wksZiel = wbZiel.Worksheets("EINGABE")
'Zeile der Zieltabelle nach der Daten eingefügt werden sollen
lngZeileZ = 4
'Quelldatei schreibgeschützt öffnen
Set wbQuelle = Workbooks.Open(Filename:=varAuswahl, ReadOnly:=True)
'Array mit auszuwertenden Tabellenblättern in Quelldatei anlegen
'2. Spalte des Array dient zum Markieren der bereits eingelsenen Blätter
ReDim arrBlatt(1 To wbQuelle.Worksheets.Count, 1 To 2)
For intI = 1 To wbQuelle.Worksheets.Count
arrBlatt(intI, 1) = wbQuelle.Worksheets(intI).Name
Next
'    ReDim arrBlatt(1 To 2, 1 To 2)
'    arrBlatt(intI, 1) = "DATEN"
'    arrBlatt(intI, 1) = "FPC"
'Import Tabellenblatt wählen und auslesen
Do
'Auswahlliste für auszuwertendes Tabellenblatt erstellen
strPrompt = ""
For intI = LBound(arrBlatt) To UBound(arrBlatt)
If arrBlatt(intI, 2) = "" Then
strPrompt = strPrompt & vbLf & intI & "  =  " & arrBlatt(intI, 1)
End If
Next
If strPrompt = "" Then Exit Do 'Alle Blätter wurden eingelesen
strPrompt = "Aus welchem Blatt Daten einlesen?" & vbLf & strPrompt
varAuswahl = Application.InputBox(Prompt:=strPrompt, _
Title:="Daten-Import", _
Type:=1)
If varAuswahl >= LBound(arrBlatt) And varAuswahl 


Anzeige
AW: Darf ich meine Frage nochmal stellen ?
03.12.2008 11:32:11
Dieter
Hi Franz,
das ist natürlich echt ein toller Lösungsvorschlag, Funktioniert prima. Noch ne kleine Frage:
Wenn ich nicht nur nach einem Argument :
If Not IsEmpty(.Cells(lngZeileQ, 1)) And (.Cells(lngZeileQ, 1) = "Argument1" Or IsNumeric(.Cells(lngZeileQ, 1))) Then..
suchen will, sondern nach zwei , wie muss ich da den Code erweitern ?
Danke Dieter
AW: Darf ich meine Frage nochmal stellen ?
03.12.2008 12:26:26
Erich
Hallo Dieter,
in Franz' Rputine könntest du schreiben:

If Not IsEmpty(.Cells(lngZeileQ, 1)) And _
(.Cells(lngZeileQ, 1) = "UNIT" Or _
.Cells(lngZeileQ, 1) = "ANDERS" Or _
IsNumeric(.Cells(lngZeileQ, 1))) Then

Mein Vorschlag würde so aussehen:


Sub Uebertrag()
Dim strVz As String, strDQ As String, arrWQ, lngQ As Long, lngZ As Long
Dim wks As Worksheet
strVz = "c:\temp\"                  ' fest vorgegebenes Verzeichnis - anpassen
strVz = ThisWorkbook.Path & "\"    ' oder: Verzeichnis wie aktive Mappe
strDQ = "IMPORT.xls"
arrWQ = Array("DATEN", "FPC")
With Worksheets("EINGABE")
lngZ = 5
'     lngZ = Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
Workbooks.Open Filename:=strVz & strDQ, UpdateLinks:=False, ReadOnly:=True
For Each wks In ActiveWorkbook.Worksheets(arrWQ)
For lngQ = 1 To wks.Cells(wks.Rows.Count, 1).End(xlUp).Row
'           If wks.Cells(lngQ, 1).Value = "UNIT" Or _
wks.Cells(lngQ, 1).Value = "ANDERS" Or _
Application.IsNumber(wks.Cells(lngQ, 1)) Then
If wks.Cells(lngQ, 1).Value = "UNIT" Or _
wks.Cells(lngQ, 1).Value = "ANDERS" Or _
(Not IsEmpty(wks.Cells(lngQ, 1)) And IsNumeric(wks.Cells(lngQ, 1))) Then
wks.Rows(lngQ).Copy .Cells(lngZ, 1)
lngZ = lngZ + 1
End If
Next lngQ
Next wks
ActiveWindow.Close
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
Danke Erich, echt gut :-) oT
03.12.2008 13:08:36
Dieter
Hallo Erich, kann ich dich nochmal was fragen ?
04.12.2008 20:44:00
Dieter
..
mir ist da noch was eingefallen bezüglich Deiner (gut) funktionierenden Lösung.
Gruss
Dieter
AW: Erich vermutet, dass du das kannst
04.12.2008 20:53:00
Erich
Hi Dieter,
jetzt hast du mich ja eigentlich schon was gefragt (ob du mich was fragen kannst).
Warum stellst du nicht gleich die andere Frage? (Auf diese Frage brauche ich keine Antwort ;-))
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Danke , also folgendes...
04.12.2008 21:40:00
Dieter
..
wenn Du Dein Beispiel noch mal vor Augen nimmst, da werden aus den beiden Tabellenblätter die Daten raus gelesen und dann, ich vermute mal in ein Array gelesen und von dort in die EXPORT.XLS rein.
Das hat soweit funktioniert. Der Code wird ja erst ab Zeile 5 und ab der erste Spalte in die Export .xls eingelesen.
Das man die Daten aus dem Array auch erst in die zweite Spalte kopiern kann ist ja sicher kein Problem, aber wäre es möglich, vor die Datensätze, die aus den Tabellen "DATEN" und "FPC" kommen noch um eine information zu erweitern.
Also kurz gesagt, vor jeden Datensatz , der aus der tabelle "DATEN" kommt, noch die infortmation "Eingabe" und vor jeden datensatz, der aus der Tabelle "FPC" kommt noch die Information ""Ausgabe" hinmacht.
Also so
Daten aus "DATEN"
1 blabla vcvc vcvcv
2 blubb bcbc bcbc
3 brum vdv nvb
Daten aus "FPC"
1 bum bvbv
2 bam bcvd
3 bim bvgfd
Ergebnis nach EXPORT.XLS:
A______B_C
Eingabe 1 blabla vcvc vcvcv
Eingabe 2 blubb bcbc bcbc
Eingabe 3 brum vdv nvb
Ausgabe 1 bum bvbv
Ausgabe 2 bam bcvd
Ausgabe 3 bim bvgfd
Eingelesen in die EXPORT.XLS soll dann nachher wieder ab Spalte A bzw. Zeile 5
Konnte ich es verständlich erklären (so spät) ?
Danke Erich
GRuss
Dieter
Anzeige
AW: Danke , also folgendes...
04.12.2008 21:56:31
Erich
Hi Dieter,
probier mal (Zwei Zeilen geänderte Zeilen habe ich mit "## neu" markiert):

Option Explicit
Sub Uebertrag()
Dim strVz As String, strDQ As String, arrWQ, lngQ As Long, lngZ As Long
Dim wks As Worksheet
strVz = "c:\temp\"                  ' fest vorgegebenes Verzeichnis - anpassen
strVz = ThisWorkbook.Path & "\"    ' oder: Verzeichnis wie aktive Mappe
strDQ = "IMPORT.xls"
arrWQ = Array("DATEN", "FPC")
With Worksheets("EINGABE")
lngZ = 5
lngZ = Application.Max(5, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
Workbooks.Open Filename:=strVz & strDQ, UpdateLinks:=False, ReadOnly:=True
For Each wks In ActiveWorkbook.Worksheets(arrWQ)
For lngQ = 1 To wks.Cells(wks.Rows.Count, 1).End(xlUp).Row
'           If wks.Cells(lngQ, 1).Value = "UNIT" Or _
wks.Cells(lngQ, 1).Value = "ANDERS" Or _
Application.IsNumber(wks.Cells(lngQ, 1)) Then
If wks.Cells(lngQ, 1).Value = "UNIT" Or _
wks.Cells(lngQ, 1).Value = "ANDERS" Or _
(Not IsEmpty(wks.Cells(lngQ, 1)) And IsNumeric(wks.Cells(lngQ, 1))) Then
.Cells(lngZ, 1) = IIf(wks.Name = arrWQ(0), "Eingabe", "Ausgabe")  ' ## neu
wks.Cells(lngQ, 1).Resize(, 255).Copy .Cells(lngZ, 2)             ' ## neu
lngZ = lngZ + 1
End If
Next lngQ
Next wks
ActiveWindow.Close
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.: Konnte ich dir eine passende Lösung bieten - so spät? ;-))

Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige