Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1360to1364
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

@fcz / Franz

@fcz / Franz
26.05.2014 21:42:36
Heike
Hallo Franz,
du hast mir vor einiger Zeit ein tolles Makro geschrieben, welches auch funktioniert.
Dieses Makro liest ALLE Spalten ein, nun ist es aber so, dass lediglich die Spalten A, C, E eingelesen werden sollen.
Habe versucht, dein Makro dahingehend umzustellen, leider ohne Erfolg.
Würdes du noch einmal darüber gucken? Das wäre klasse.
Datei, in der das Makro läuft:
https://www.herber.de/bbs/user/90854.xlsm
und die folgende soll eingelesen werden:
https://www.herber.de/bbs/user/90855.xls
Vielen Dank im voraus
Gruß
Heike

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: @fcz / Franz
27.05.2014 13:19:56
fcs
Hallo Heike,
wenn die Spalten Land, KZ und Preis2 in der Ergebnisliste entfallen, dann muss das Makro etwa wie folgt aussehen.
Gruß
Franz
Sub Einlesen_Tagesdaten()
Dim varTag As Variant, wkbTag As Workbook, wksTag As Worksheet, arrData
Dim rngFind As Range, varArtikel As Variant, lngZeile As Long
Dim wksListe As Worksheet, objList As ListObject
Dim lngSpalte As Long, lngListeZ As Long, lngListeS As Long, lngSpaArtikel As Long
Dim datDatum As Date, strDatum As String, varDatum
Dim varAuswahl
Set wksListe = ActiveSheet
Set objList = wksListe.ListObjects(1)
varAuswahl = Application.GetOpenFilename(Filefilter:="Excel (*.xls;*xlsx),*.xls;xlsx", _
Title:="Bitte einzulesende Datei auswählen-Mehrfachauswahl ist möglich", _
MultiSelect:=True)
If Not IsArray(varAuswahl) Then
'do nothing
Else
'Berechnungsmodus auf manuell und Bildschirmaktualisierung abschalten
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'ausgewählte Datei(en) abarbeiten
For Each varTag In varAuswahl
Set wkbTag = Application.Workbooks.Open(Filename:=varTag, ReadOnly:=True)
Set wksTag = wkbTag.Worksheets(1)
Application.ScreenUpdating = True
'Datum der einzulesenden Datei ggf. bestätigen
varDatum = Format(wksTag.Cells(2, 1).Value, "DD.MM.YYYY")
varDatum = VBA.InputBox("Datum der Datei?", _
Title:="Datum für Zeile 1 in Tabelle", Default:=varDatum)
Application.ScreenUpdating = False
If varDatum = "" Then
'do nothing - Eingabe wurde abgebrochen
ElseIf IsDate(varDatum) Then
'Daten der Tagesdatei in ein Array laden - beschleunigt bei Bearbeitung
With wksTag
arrData = .Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp).Offset(0, 4))
End With
datDatum = CDate(varDatum)
strDatum = Format(datDatum, "MM-DD") 'Datumsformat für Zeile 1 in Gesamtliste
'Spalte für nächstes Datum in Gesamtliste
lngSpalte = objList.Range.Column + objList.Range.Columns.Count
'Datum als Text einfügen - erforderlich für Listobject
wksListe.Cells(objList.Range.Row, lngSpalte).Value = "'" & strDatum
With wksListe
'Formel für Lief_Datum anpassen:==[@[01-14]] - Spaltenbereich
.Range(objList.Name & "[Lief_Datum]").FormulaR1C1 = _
"=[@[" & .Cells(objList.Range.Row, lngSpalte).Text & "]]"
'Spalte mit neuem Datum formatieren
With .Range(objList.Name & "[" & strDatum & "]")
.NumberFormat = "D. MMM YY"
.EntireColumn.ColumnWidth = 10
End With
'Spalte mit Artikelnummer
lngSpaArtikel = .Range(objList.Name & "[Artikel]").Column
'Zeilen der Tagestabelle abarbeiten
For lngZeile = 2 To UBound(arrData, 1)
'Land prüfen
If arrData(lngZeile, 2) = "DE" Then
'Lieferdatum prüfen
' If arrData(lngZeile, 1)  "" Then
'Artikelnummer aus Tagesliste in Gesamtliste suchen
varArtikel = arrData(lngZeile, 3)
Set rngFind = .Range(objList.Name & "[Artikel]").Find(what:=varArtikel, LookIn:= _
xlValues, _
lookat:=xlWhole)
If rngFind Is Nothing Then
'nächste freie Zeile in Artikelspalte ermitteln
lngListeZ = .Cells(.Rows.Count, lngSpaArtikel).End(xlUp).Row
If .Cells(lngListeZ, lngSpaArtikel)  "" Then
lngListeZ = lngListeZ + 1
End If
'neuen Artikel an Liste anfügen
For lngListeS = 1 To 6 'Spalten in Tagesdatei abarbeiten
Select Case lngListeS
Case 1 'Spalte A - Datum
.Cells(lngListeZ, 1).Value = arrData(lngZeile, lngListeS)
Case 3 'Spalte C - Artikel
.Cells(lngListeZ, 2).Value = arrData(lngZeile, lngListeS)
Case 5 'Spalte E - Preis1
.Cells(lngListeZ, 3).Value = arrData(lngZeile, lngListeS)
Case Else
'do nothing
End Select
Next
Else
lngListeZ = rngFind.Row
End If
.Cells(lngListeZ, lngSpalte).Value = arrData(lngZeile, 1) 'Lieferdatum
End If
' End If
Next
End With
Erase arrData 'Daten-Array leeren
Else
MsgBox "unzulässige Eingabe für ein Datum!"
End If
'Tagesliste ohne speichern wieder schließen
wkbTag.Close savechanges:=False
Set wkbTag = Nothing
Set wksTag = Nothing
Next
Set objList = Nothing
Set wksListe = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End If
End Sub

Anzeige
AW: @fcz / Franz
27.05.2014 14:28:33
Heike
Hallo Franz,
vielen Dank für deine Hilfe/Lösung. In meiner Testdatei funktioniert es auch prima (kleine Änderungen).
Nur ist mir erst jetzt bewusst geworden, dass in meiner echten Mappe von gesamt 30 Spalten NUR 2 nicht eingelesen werden dürfen.
Heißt: Wäre es möglichm, den umgekehrten Weg zu gehen? Dem Makro nicht zu sagen, was es einlesen soll, sondern, was nicht.
Sorry, hätte meine Eingangsfrage anders stellen müssen.
Vielen Dank Franz
Gruß
Heike

AW: @fcz / Franz
27.05.2014 17:55:09
fcs
Hallo Heike,
da zu jeder Spalte in der Tagesdatei vorgegeben werden muß in welche Spalte des Ergebnisblatts der Wert eingetragen werden soll, geht es nicht so einfach. Wenn die Reihenfolge der Spalten in in Tages- und Ergebinistabelle identisch ist, außer das bei Ergebnis 2 fehlen, dann kann man das in einer angepassten Case-Prüfung umsetzen.
Zur einfacheren Anpassung hab ich zu Beginn des Makros einen Block mit Konstanten eingefügt.
hier musst du die erforderlichen Anpassungen machen.
Gruß
Franz
Sub Einlesen_Tagesdaten()
Dim varTag As Variant, wkbTag As Workbook, wksTag As Worksheet, arrData
Dim rngFind As Range, varArtikel As Variant, lngZeile As Long
Dim wksListe As Worksheet, objList As ListObject
Dim lngSpalte As Long, lngListeZ As Long, lngSpalteZ  As Long
Dim lngListeS As Long, lngSpaArtikel As Long
Dim datDatum As Date, strDatum As String, varDatum
Dim varAuswahl
'In den nachfolgenden Const-Zeilen die Nummern/Anzahl der Spalten ggf. Anpassen
Const SpaLiefer = 1   'Spalte A - Spalte mit Datum in Tagesdatei
Const SpaLand = 2     'Spalte B - Spalte mit Land in Tagesdatei
Const SpaArtikel = 3  'Spalte C - Spalte mit Artikel in Tagesdatei
Const AnzahlSpa = 6  'Anzahl Spalten in Tagesdatei
Const SpaNicht1 = 2  'nicht auszulesende Spalte  in Tagesdatei
Const SpaNicht2 = 4  'nicht auszulesende Spalte  in Tagesdatei
Set wksListe = ActiveSheet
Set objList = wksListe.ListObjects(1)
varAuswahl = Application.GetOpenFilename(Filefilter:="Excel (*.xls;*xlsx),*.xls;xlsx", _
Title:="Bitte einzulesende Datei auswählen-Mehrfachauswahl ist möglich", _
MultiSelect:=True)
If Not IsArray(varAuswahl) Then
'do nothing
Else
'Berechnungsmodus auf manuell und Bildschirmaktualisierung abschalten
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'ausgewählte Datei(en) abarbeiten
For Each varTag In varAuswahl
Set wkbTag = Application.Workbooks.Open(Filename:=varTag, ReadOnly:=True)
Set wksTag = wkbTag.Worksheets(1)
Application.ScreenUpdating = True
'Datum der einzulesenden Datei ggf. bestätigen
varDatum = Format(wksTag.Cells(2, SpaLiefer).Value, "DD.MM.YYYY")
varDatum = VBA.InputBox("Datum der Datei?", _
Title:="Datum für Zeile 1 in Tabelle", Default:=varDatum)
Application.ScreenUpdating = False
If varDatum = "" Then
'do nothing - Eingabe wurde abgebrochen
ElseIf IsDate(varDatum) Then
'Daten der Tagesdatei in ein Array laden - beschleunigt bei Bearbeitung
With wksTag
arrData = .Range(.Cells(1, 1), .Cells(.Rows.Count, _
SpaArtikel).End(xlUp).Offset(0, AnzahlSpa - 1))
End With
datDatum = CDate(varDatum)
strDatum = Format(datDatum, "MM-DD") 'Datumsformat für Zeile 1 in Gesamtliste
'Spalte für nächstes Datum in Gesamtliste
lngSpalte = objList.Range.Column + objList.Range.Columns.Count
'Datum als Text einfügen - erforderlich für Listobject
wksListe.Cells(objList.Range.Row, lngSpalte).Value = "'" & strDatum
With wksListe
'Formel für Lief_Datum anpassen:==[@[01-14]] - Spaltenbereich
.Range(objList.Name & "[Lief_Datum]").FormulaR1C1 = _
"=[@[" & .Cells(objList.Range.Row, lngSpalte).Text & "]]"
'Spalte mit neuem Datum formatieren
With .Range(objList.Name & "[" & strDatum & "]")
.NumberFormat = "D. MMM YY"
.EntireColumn.ColumnWidth = 10
End With
'Spalte mit Artikelnummer
lngSpaArtikel = .Range(objList.Name & "[Artikel]").Column
'Zeilen der Tagestabelle abarbeiten
For lngZeile = 2 To UBound(arrData, 1)
'Land prüfen
If arrData(lngZeile, SpaLand) = "DE" Then
'Lieferdatum prüfen
' If arrData(lngZeile, 7)  "" Then
'Artikelnummer aus Tagesliste in Gesamtliste suchen
varArtikel = arrData(lngZeile, SpaArtikel)
Set rngFind = .Range(objList.Name & "[Artikel]").Find(what:=varArtikel, _
LookIn:=xlValues, lookat:=xlWhole)
If rngFind Is Nothing Then
'nächste freie Zeile in Artikelspalte ermitteln
lngListeZ = .Cells(.Rows.Count, lngSpaArtikel).End(xlUp).Row
If .Cells(lngListeZ, lngSpaArtikel)  "" Then
lngListeZ = lngListeZ + 1
End If
'neuen Artikel an Liste anfügen
For lngListeS = 1 To AnzahlSpa 'Anzahl Spalten in Tagesdatei abarbeiten
lngSpalteZ = 0
Select Case lngListeS
Case 1 To SpaNicht1 - 1: lngSpalteZ = lngListeS
Case SpaNicht1 + 1 To SpaNicht2 - 1: lngSpalteZ = lngListeS - 1
Case SpaNicht2 + 1 To AnzahlSpa: lngSpalteZ = lngListeS - 2
Case Else
'do nothing
End Select
If lngSpalteZ > 0 Then
.Cells(lngListeZ, lngSpalteZ).Value = arrData(lngZeile, lngListeS)
End If
Next
Else
lngListeZ = rngFind.Row
End If
.Cells(lngListeZ, lngSpalte).Value = arrData(lngZeile, SpaLiefer)
End If
' End If
Next
End With
Erase arrData 'Daten-Array leeren
Else
MsgBox "unzulässige Eingabe für ein Datum!"
End If
'Tagesliste ohne speichern wieder schließen
wkbTag.Close savechanges:=False
Set wkbTag = Nothing
Set wksTag = Nothing
Next
Set objList = Nothing
Set wksListe = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End If
End Sub

Anzeige
AW: @fcz / Franz
27.05.2014 20:24:35
Heike
Hallo Franz,
ich werde dein Makro morgen erst ausprobieren können. Aber jetzt schon einmal vielen Dank dafür.
Zumindest klappt ja deine erste Lösung und die zweite bestimmt auch. Anpassungen sind für mich kein Problem.
Vielen Dank für deine enorme Mühe und einen schönen Abend.
Liebe Grüße
Heike

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige