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

Makro kopiert nicht alle Dateien und Zellen

Makro kopiert nicht alle Dateien und Zellen
05.12.2014 07:40:25
Selma
Hallo,
ich habe mehrere Probleme mit meinem Code und hoffe hier Tipps zu bekommen. Bin ein Neuling und hangel mich irgendwie durch.
Es geht darum, dass ich mit meinem Code Dateien öffne und dort bestimmte Bereiche herauskopiere und in eine neue Datei einfüge. Das sollte möglichst mit einer Verknüpfung passieren, da sich Daten evtl. ändern könnten und es zu mühsam wäre jedes mal aufs neue die Daten zusammenzuführen. Wie das funktioniert, weiss ich aber nicht. Aber das ist erstmal zurückgestellt.
In erster Linie habe ich das Problem, dass mir in meiner neuen Datei immer mindestens von einer Datei die Daten fehlen. Diese also nicht auftauchen in der zusammengeführten Datei.
Außerdem werden nicht alle Zellen kopiert von den anderen Dateien.(Zieldatei: ab Q11).
Kann mir jemand erklären was ich falsch mache? (ausser dass meine Kopierkünste extrem unelegant sind :) )
Mein offset-Teil klappt z.B. auch gar nicht wie ich will. Kopiert mir Verweise, aber nicht Werte (+ evtl. Verknüpfungen).
Sub Vergleich()
Dim DateiName As Variant
Dim i As Integer
Dim strFileFilter As String
Dim wsTemplate As Worksheet            'Template Tabellenblatt
Dim wsZiel As Worksheet                'Ziel
Dim wbQuelle As Workbook               'Quelle
Dim Spalte As Long
Dim SpalteTemp As Long
'Dim a As Integer
'Dim b As Integer
'Dim c As Integer
'Dim d As Integer
Dim strString As String
Dim rngCell As Range
'Fehlermeldungen, Events und Bildschirmaktualisierung deaktivieren
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Template Tabellenblatt definieren
Set wsTemplate = ActiveSheet
'Datum und Runde eingeben
datum = InputBox(prompt:="Geben Sie das aktuelle Datum ein!")
If datum = "" Then
MsgBox "Ohne Datum können Sie nicht fortfahren!" & vbCr & "Erstellung wurde abgebrochen! _
_
_
", vbOKOnly, "Abbruch"
Exit Sub
End If
ActiveSheet.Range("A3").Value = datum
runde = InputBox(prompt:="Geben Sie die Runde des Projekts ein")
If runde = "" Then
MsgBox "Ohne Angabe der Runde können Sie nicht fortfahren!" & vbCr & "Erstellung wurde   _
_
_
abgebrochen!", vbOKOnly, "Abbruch"
Exit Sub
End If
ActiveSheet.Range("B1").Value = runde
'Dateinamen (mit Pfad)
'über mehrere Ordner realisieren!!
strFileFilter = "ExcelDateien,*.xls;*.xlsx;*.xlsm, Alle Dateien,*.*"
DateiName = Application.GetOpenFilename(strFileFilter, , , , True)         'Dateinamen  _
einlesen
If VarType(DateiName) = vbBoolean Then Exit
'Falls auf abbrechen geklickt wurde
'Schleife über alle Dateinamen
Spalte = 3
SpalteTemp = Spalte
For i = 1 To UBound(DateiName)
'Datei öffnen
Set wbQuelle = Workbooks.Open(DateiName(i), ReadOnly:=True, UpdateLinks:=False)
If i = 1 Then
'Tabellenblatt kopieren
wsTemplate.Copy
Set wsZiel = ActiveSheet
Else
'Teamleiter muss an 1.Stelle stehen!!!!
If wbQuelle.Worksheets("Deckblatt").Range("C4").Value = "Teamleiter" Then
SpalteTemp = Spalte
Spalte = 3
End If
End If
'Kopiervorgang.
wsZiel.Cells(8, Spalte).Value = wbQuelle.Worksheets("Deckblatt").Range("C4").Value       _
_
_
'Name
wsZiel.Cells(2, 2).Value = wbQuelle.Worksheets("Deckblatt").Range("C2").Value            _
_
_
'Projektname
wsZiel.Cells(10, Spalte).Resize(1, 4).Value = wbQuelle.Worksheets("Mannschaft").Range("  _
_
_
C8:F8").Value 'MannschaftVolumen
' Leistung wird kopiert ######################################################################## _
_
_
' kopiert die Verlinkung statt den Werten (brauche beides)
strString = "Leistung"
Set rngCell = ActiveSheet.Columns(2).Find(strString, lookat:=xlWhole, LookIn:=xlValues,  _
MatchCase:=True)
If Not rngCell Is Nothing Then
rngCell.Offset(1, 1).Resize(11, 5).Copy Destination:=wsZiel.Cells(355, Spalte)
Else
MsgBox "Leistung von " + wbQuelle.Name + " wurde nicht kopiert"
End If
'** Mannschaft Platzbezeichnung - Versuch unteren Teil zu vereinfachen fehlgeschlagen
'        a = 9
'        For a = 9 To 45
'         b = 3
'        For b = 3 To 79
'        wsZiel.Cells(a, 1).Value = wbQuelle.Worksheets("Mannschaft").Range(6, b).Value
'   If a 

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro kopiert nicht alle Dateien und Zellen
05.12.2014 15:24:35
fcs
Hallo Selma,
ich hab jetzt mal das Makro soweit aufbereitet, dass die Übernahme der Werte in For-Next-Schleifen erfolgt und dass die Logik in der Schleife über die Dateien passt (musst du nochmals prüfen).
Der besseren Übersicht halber hab ich für jedes Tabellenblatt, das vorkommt eine Variable angelegt.
Gruß
Franz
Sub Vergleich()
Dim DateiName As Variant
Dim i As Integer
Dim strFileFilter As String
Dim wsTemplate As Worksheet            'Template Tabellenblatt
Dim wsZiel As Worksheet                'Ziel
Dim wbQuelle As Workbook               'Quelle
Dim wksDeckblatt As Worksheet
Dim wksMannschaft As Worksheet
Dim Zeile As Long, SpalteQ As Long
Dim Spalte As Long
Dim SpalteTemp As Long
Dim strString As String
Dim rngCell As Range
Dim Datum
Dim Runde
'Fehlermeldungen, Events und Bildschirmaktualisierung deaktivieren
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Template Tabellenblatt definieren
Set wsTemplate = ActiveSheet
'Datum und Runde eingeben
EingabeDatum:
Datum = InputBox(prompt:="Geben Sie das aktuelle Datum ein!", _
Title:="Eingabe Datum", Default:=Date)
If Datum = "" Then
MsgBox "Ohne Datum können Sie nicht fortfahren!" & vbCr _
& "Erstellung wurde abgebrochen! ", vbOKOnly, "Abbruch"
Exit Sub
ElseIf Not IsDate(Datum) Then
MsgBox "Eingabe ist kein gültiger Datumswert!", _
vbOKOnly, "Eingabewiederholung"
GoTo EingabeDatum
End If
wsTemplate.Range("A3").Value = CDate(Datum)
Runde = InputBox(prompt:="Geben Sie die Runde des Projekts ein")
If Runde = "" Then
MsgBox "Ohne Angabe der Runde können Sie nicht fortfahren!" & vbCr _
& "Erstellung wurde abgebrochen!", vbOKOnly, "Abbruch"
Exit Sub
End If
wsTemplate.Range("B1").Value = Runde
'Dateinamen (mit Pfad)
'über mehrere Ordner realisieren!!
strFileFilter = "ExcelDateien,*.xls;*.xlsx;*.xlsm, Alle Dateien,*.*"
DateiName = Application.GetOpenFilename(strFileFilter, , , , True)         'Dateinamen _
einlesen
If VarType(DateiName) = vbBoolean Then Exit Sub 'Falls auf Abbrechen geklickt wurde
'Schleife über alle Dateinamen
For i = 1 To UBound(DateiName)
'Datei öffnen
Set wbQuelle = Workbooks.Open(DateiName(i), ReadOnly:=True, UpdateLinks:=False)
Set wksDeckblatt = wbQuelle.Worksheets("Deckblatt")
Set wksMannschaft = wbQuelle.Worksheets("Mannschaft")
If i = 1 Then
'Tabellenblatt kopieren
wsTemplate.Copy
Set wsZiel = ActiveSheet
End If
'Teamleiter muss an 1.Stelle stehen!!!!
If wksDeckblatt.Range("C4").Value = "Teamleiter" Then
'1. Einfügespalte für Daten aus Datei
Spalte = 3 + (i - 1) * 14
Else
'Daten aus Datei nicht einlesen
GoTo Next_i
End If
'Kopiervorgang.
wsZiel.Cells(8, Spalte).Value = wksDeckblatt.Range("C4").Value 'Name
wsZiel.Cells(2, 2).Value = wksDeckblatt.Range("C2").Value 'Projektname
'        wsZiel.Cells(2, Spalte).Value = wksDeckblatt.Range("C2").Value 'Projektname - Test
wsZiel.Cells(10, Spalte).Resize(1, 4).Value _
= wksMannschaft.Range("C8:F8").Value  'MannschaftVolumen"
' Leistung wird kopiert ##############################################################
' kopiert die Verlinkung statt den Werten (brauche beides)
strString = "Leistung"
Set rngCell = wksDeckblatt.Columns(2).Find(strString, lookat:=xlWhole, _
LookIn:=xlValues, MatchCase:=True) '###### wksDeckblatt ggf. wksMannschaft ersetzen
If Not rngCell Is Nothing Then
rngCell.Offset(1, 1).Resize(11, 5).Copy
With wsZiel.Cells(355, Spalte)
.PasteSpecial Paste:=xlPasteFormats
.PasteSpecial Paste:=xlPasteValues
End With
Else
MsgBox "Leistung von " + wbQuelle.Name + " wurde nicht kopiert"
End If
' Landbezeichnungen der Mannschaft werden kopiert ########################################### _
### _
_
_
' ist ok, aber nicht elegant
'** Mannschaft Platzbezeichnung -
With wksMannschaft
'Daten aus Bereich C6:CA6 nach Spalte A übernehmen
SpalteQ = 3
For Zeile = 9 To 85 Step 4
wsZiel.Cells(Zeile, 1).Value = .Cells(6, SpalteQ).Value
SpalteQ = SpalteQ + 4
Next Zeile
' Mannschaft (WERTE) ** VEREINFACHEN!!! ... + x
'Daten aus Bereichen C8:CD8
'                    C11:CC11
'                    C14:CC14
' in Blöcken 3 bzw. 4 Zellen übernehmen
SpalteQ = 3
For Zeile = 10 To 88 Step 4
Call prcCopyValue(wksZ:=wsZiel, ZeileZ:=Zeile, SpalteZ:=Spalte, _
rngValues:=.Range(.Cells(8, SpalteQ), .Cells(8, SpalteQ + 3)))
Call prcCopyValue(wsZiel, Zeile + 1, Spalte, _
.Range(.Cells(11, SpalteQ), .Cells(11, SpalteQ + 2)))
Call prcCopyValue(wsZiel, Zeile + 2, Spalte, _
.Range(.Cells(14, SpalteQ), .Cells(14, SpalteQ + 2)))
SpalteQ = SpalteQ + 4
Next Zeile
'### Umfang TASK
' muss noch programmiert werden
'### Umfang WERTE
' muss noch programmiert werden
End With 'wksMannschaft
Next_i:
'Datei schließen
wbQuelle.Close savechanges:=False
'nächste Datei
Next i
'### Cherry-Picking programmieren (niedrigsten Aufwand der Zeile suchen)
'Aufruf  Zeilen Ausblenden
Call ausblendenMannschaft_Plaetze
Call ausblendenMannschaft_Land
Call ausblendenUnterschiede
'Buttons löschen
wsZiel.Shapes("Abgerundetes Rechteck 1").Delete
'ActiveSheet.Shapes("Abgerundetes Rechteck 2").Delete
'bisschen aufräumen
Set wksMannschaft = Nothing
Set wksDeckblatt = Nothing
Set wsTemplate = Nothing
Set wsTemplate = Nothing
Set wsZiel = Nothing
Set wbQuelle = Nothing
'Fehlermeldungen, Events und Bildschirmaktualisierung aktivieren
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Sub prcCopyValue(wksZ As Worksheet, ByVal ZeileZ As Long, ByVal SpalteZ As Long, _
rngValues As Range)
'Werte eines Bereiches in eine Zieltabelle übernehmen
'wksZ       = Zieltabellenblatt
'ZeileZ     = Zielzeile
'SpalteZ    = 1. Spalte ab der eingefügt werden soll
'rngValues  = Zellbereich dessen Inhalte als Werte übernommen werden sollen
'GoTo Weiter01
Dim AnzZ As Long, AnzS As Long
AnzZ = rngValues.Rows.Count
AnzS = rngValues.Columns.Count
With wksZ
.Range(.Cells(ZeileZ, SpalteZ), _
.Cells(ZeileZ + AnzZ - 1, SpalteZ + AnzS - 1)).Value = rngValues.Value
End With
Exit Sub
Weiter01:
'Alternative:
rngValues.Copy
With wksZ
.Cells(ZeileZ, SpalteZ).PasteSpecial Paste:=xlPasteValues
End With
End Sub

Anzeige

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige