Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1620to1624
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

Kopieren wenn Registerkartenname = Zellenwert

Kopieren wenn Registerkartenname = Zellenwert
18.04.2018 16:32:27
Mario
Hallo liebes Forum,
ich habe ein Problem das meine bescheidenden VBA Kenntnisse leider übersteigt und hoffe hier einmal wieder fachkundige Hilfe zu finden.
Es geht um folgendes, ich möchte gerne das Werte von einer Arbeitsmappe (Sourcefile), in welchem sich auch das Makro befindet, in eine andere (Targetfile) kopiert werden und zwar nur wenn die Namen der Arbeitsblätter übereinstimmen.
Ich habe es mit folgendem VBA code versucht, leider funktioniert die Syntax in der Schleife nicht. Ich bekomme einen Anwendungsfehler in dieser Zeile:
Worksheets(ws.Name).Range(Cells(25, 3), Cells(25, 17)).Copy
Konnte im Internet leider aber auch nicht raus finden wie es richtig wäre
Zudem würde ich es gerne mit einer Schleife machen, anstatt mit zwei, damit das Makro schneller läuft. Ich beziehe mich in der Schleife für das Targetfile auf Range("N1").Value, weil dort der Name jeweiligen Arbeitsblätter eingetragen steht.
Option Explicit
Sub Import_Basisdatei()
Dim strPath As String, strDataName As String, strSearch As String
Dim ws As Worksheet
Dim Sourcefile As Workbook, Targetfile As Workbook
Dim raFind As Range
Dim i As Integer, WS_Count As Integer
Application.AskToUpdateLinks = False
Application.AutomationSecurity = msoAutomationSecurityLow
strPath = ThisWorkbook.Worksheets("Menu").Range("C52") 'Pfad Zieldatei
strDataName = ThisWorkbook.Worksheets("Menu").Range("C53") 'Name Zieldatei
Set Targetfile = Workbooks.Open(strPath & strDataName, UpdateLinks:=0, ReadOnly:=False)
WS_Count = ActiveWorkbook.Worksheets.Count
Set Sourcefile = ThisWorkbook
With Sourcefile
For Each ws In Worksheets
For i = 1 To WS_Count
If ws.Name = Targetfile.Worksheets(i).Range("N1").Value Then
Worksheets(ws.Name).Range(Cells(25, 3), Cells(25, 17)).Copy
Targetfile.Worksheets(i).Range("C23").PasteSpecial Paste:=xlPasteValues
End If
Next i
Next ws
End With
Targetfile.Close SaveChanges:=False
Application.AskToUpdateLinks = True
Application.AutomationSecurity = msoAutomationSecurityByUI
End Sub
Vielen Dank.
Mit freundlichen Grüßen
Mario

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopieren wenn Registerkartenname = Zellenwert
18.04.2018 18:13:18
ChrisL
Hi Mario
ws.Range(ws.Cells(25, 3), ws.Cells(25, 17)).Copy
Die zweite Schleife lässt sich m.E. nicht umgehen. Die Anzahl der Durchläufe könnte man leicht reduzieren, wenn du die innere Schleife einmalig in ein Datenfeld/Array oder Collection ("virtuelle Tabelle") einliest und anhand der Collection überprüfst, ob das Blatt existiert. Abhängig von der Anzahl Blätter, aber die Zeitersparnis wird im Millisekundenbereich sein, so dass sich der Aufwand nicht rechnet. Wenn du beschleunigen willst, würde ich mit Application.ScreenUpdating = False beginnen.
cu
Chris
AW: Kopieren wenn Registerkartenname = Zellenwert
19.04.2018 09:58:16
Mario
Hallo Chris,
vielen Dank für deine Hilfe. Der Code läuft jetzt tatsächlich durch, allerdings hat sich nun das Problem aufgetan das Excel nicht die gewünschten Zellen aus dem Sourcefile (ThisWorkbook) kopiert, sondern auf das Targetfile zugreift und dort die Zeilen kopiert und wieder einfügt. Ich dachte, ich hätte dieses Problem damit umgangen das ich vor die Schleifen ein With Command gesetzt habe, hat scheinbar nicht geklappt :(. Hättest du zufällig auch eine Lösung für dieses Problem.
Viele Grüße
Mario
Anzeige
AW: Kopieren wenn Registerkartenname = Zellenwert
19.04.2018 10:44:14
ChrisL
Hi Mario
Versuch mal mit Punkt. Dieser stellt den Bezug zum With-Rahmen her.
For Each ws In .Worksheets
cu
Chris
AW: Kopieren wenn Registerkartenname = Zellenwert
19.04.2018 16:00:51
Mario
Hallo Chris,
danke für deine Hilfe :). Letztendlich habe ich die Schleife jetzt folgendermaßen gebaut:
Sub Export() 
With ThisWorkbook
For Each ws In .Worksheets
For i = 1 To ws_count
If ws.Name = wbTarget.Worksheets(i).Range("N1").Value Then
ws.Range(ws.Cells(25, 3), ws.Cells(25, 17)).Copy Destination:=wbTarget.Worksheets(i) _
.Range("C23:Q23")
ws.Range(ws.Cells(94, 3), ws.Cells(94, 17)).Copy Destination:=wbTarget.Worksheets(i) _
.Range("C83:Q83")
ws.Range(ws.Cells(137, 3), ws.Cells(137, 17)).Copy Destination:=wbTarget.Worksheets( _
i).Range("C121:Q121")
End If
Next i
Next ws
End With 
End Sub
und es funktioniert. Die Darstellung ist wegen des begrenzten Textfensters etwas komisch.
Eine Frage hätte ich noch. Hast du zufällig eine Idee wie man einbauen könnte, dass das Makro alle Tabellenblätter auflistet die in ThisWorkbook vorkommen aber nicht in der Zieldatei (wbTarget)?
VG
Mario
Anzeige
AW: Kopieren wenn Registerkartenname = Zellenwert
19.04.2018 16:37:41
ChrisL
Hi Mario
Basierend auf deinem bestehenden Ansatz, ein True/False Variable.
Dim b As Boolean
For Each ws In .Worksheets
b = False
For i = 1 To ws_count
If ws.Name = wbTarget.Worksheets(i).Range("N1").Value Then
b = True
End If
Next i
if b = False Then MsgBox "Blatt nicht vorhanden"
Next ws

Hier noch ein Ansatz mit Datenfelder/Array:
Sub t()
Dim wkbSource As Workbook, wkbTarget As Workbook
Dim wks As Worksheet
Dim intCounter As Integer
ReDim arrDifferenz(0) As Variant
Set wkbSource = ThisWorkbook
Set wkbTarget = Workbooks("Mappe1.xlsx") ' abgekürzt
' alle Tabellen der Zieldatei in Array einlesen
ReDim arrTarget(wkbTarget.Worksheets.Count - 1) As Variant
For Each wks In wkbTarget.Worksheets
arrTarget(intCounter) = wks.Name
intCounter = intCounter + 1
Next wks
' alle Tabellen der Sourcedatei durchlaufen
intCounter = 0
For Each wks In wkbSource.Worksheets
If IsError(Application.Match(wks.Name, arrTarget, 0)) Then
' Differenz speichern
If arrDifferenz(0) = "" Then
arrDifferenz(0) = wks.Name
Else
ReDim Preserve arrDifferenz(intCounter)
arrDifferenz(intCounter) = wks.Name
End If
intCounter = intCounter + 1
Else
' Kopiervorgang
wks.Range("C25:Q25").Copy wkbTarget.Worksheets(wks.Name).Range("C23:Q23")
'usw.
End If
Next wks
' Differenz in Tabelle zurückschreiben
If arrDifferenz(0)  "" Then wkbSource.Worksheets("Menu").Range("A1:A" & intCounter) _
= Application.Transpose(arrDifferenz)
End Sub
cu
Chris
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige