PDA

Vollständige Version anzeigen : Zellen von einer Tabelle an die andere Kopieren


chaelo
17.04.2009, 09:29
Hallo zusammen,

ich habe folgendes Problem. Ich möchte von zwei verschiedene Mappen die in verschiedenen PCs Zellen in eine Bestimmte Mappe (die auf dem Server liegt) kopieren, dafür habe ich einen Beispiel hier hochgeladen:

mit Knopfdruck soll von der Mappe (Test1.xls bzw Test3.xls) bestimmte Zellen von der Tabelle1 an der Tabelle2 in der Mappe (Test2.xls, sie ist im Server), das alles habe ich mit dem Code unten gemacht, mein Problem: die Zellen von den beiden Mappen löschen sich gegenseitig und werden nicht nach einander eingefügt sondern überschrieben. Kann mir bitte jemand helfen.

Anbei eine Bespieldatei.

Schöne Grüsse
Sub test()
Dim a As Long, i As Long
Dim n As Integer, n1 As Integer
Application.ScreenUpdating = False
Workbooks.Open ("C:\test2.xls")
a = 2
For i = 1 To 10000
With Worksheets("Tabelle1")
If .Cells(i, "G") = "1" Then

Workbooks("Test2.xls").Sheets("Tabelle2").Cells(a, 1).Value = Workbooks("Test1.xls").Sheets("Tabelle1").Cells(i, 1).Value
Workbooks("Test2.xls").Sheets("Tabelle2").Cells(a, 2).Value = Workbooks("Test1.xls").Sheets("Tabelle1").Cells(i, 2).Value
Workbooks("Test2.xls").Sheets("Tabelle2").Cells(a, 3).Value = Workbooks("Test1.xls").Sheets("Tabelle1").Cells(i, 3).Value

a = a + 1
Else
End If
End With
Next i
Workbooks("test2.xls").Save
Workbooks("test2.xls").Close

Application.ScreenUpdating = True
End Sub

BoskoBiati
17.04.2009, 10:13
Hallo chaelo,

du solltest beim Öffnen der Mappe Test2.xls auf die letzte gefüllte Zeile in Tabelle2 prüfen und a=letzteZeile einsetzen.

chaelo
17.04.2009, 12:17
Hallo BoskoBiati,

Danke für die Antwort,

ich habe es nicht richtig verstanden, soll ich mein Code in den beiden Tabellen so verändern:

Workbooks.Open ("C:\test2.xls")
a = letzteZeile
For i = 1 To 10000
With Worksheets("Tabelle1")

ich habe es so versucht, es hat leider nicht fonktioniert.

kannst du mir den code so anpassen wie du es meinst bitte?

Gruss

BoskoBiati
17.04.2009, 13:01
Hallo chaelo,

zum ersten wäre ein realer Name nicht unangenehm, ich habe auch einen in meiner Signatur.

Zum Problem:
als erstes mußt Du die letzte Zeile erst einmal suchen (mit googlen findet man das ganz leicht.):
z.B.:

a = Workbooks("Test2.xls").Sheets("Tabelle2").Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row + 1

chaelo
17.04.2009, 14:44
Hallo Edgar,

Sorry, für die "Unhöflichkeit"

Es hat funktioniert danke, aber ich habe dabei eine Denkfehler gemacht, mein Code kopiert mir bei jedem Knopfdruck alles neu, ich will aber erreichen die Zellen die schon mal kopiert sind und in der test2.xls existieren sollen aktualisiert werden und die noch nicht existieren eingefügt werden, damit soll vielleicht der ganze Code umgestellt werden.

Hast du eine Idee, googlen hat leider nicht geholfen.


Vielen Dank und Sorry noch einmal

Chaelo

BoskoBiati
17.04.2009, 15:23
Hallo chaelo,

dafür tauchen jetzt aber doch einige Fragen auf:
1. Was willst Du damit bezwecken?
2. Wie verändern sich Daten in der Ursprungstabelle?
3. Gibt es eindeutige Kriterien, nach denen die Daten auffindbar sind?
4. Wie sieht der gesamte Code aus, der jetzt die Daten kopiert (ich sehe nirgendwo eine Mappe test3.xls)?

chaelo
19.04.2009, 19:26
Hallo Edgar,


1. Was willst Du damit bezwecken?
Wir sind 2 Verkäufer, jeder von uns hat eine Tabelle auf seinem PC (Test1.xls) und (Test3.xls) hier sollen die Verkäufe eingetragen werden, da jeder seine Kunden und sein gebiet hat, brauchen wir eine Zentraltabelle auf dem Server, wo sich die Verkäufe sammeln (test2.xls)
2. Wie verändern sich Daten in der Ursprungstabelle?
Wie gesagt auf test1.xls tabelle1 und test3.xls tabelle1 werden die Daten wie: Produkt, Beschreibung, Preis, Menge, Seriennummer, Verkäufernummer …. Eingetragen. Auf die beiden Mappen befindet sich der Code, nach dem Schließen und speichern sollen manche Daten in die Mappe test2.xls Tabelle1 transferiert bzw. aktualisiert werden.
3. Gibt es eindeutige Kriterien, nach denen die Daten auffindbar sind?
Nach Verkäufer und die Seriennummern.
4. Wie sieht der gesamte Code aus, der jetzt die Daten kopiert (ich sehe nirgendwo eine Mappe test3.xls)?
Der Code ist der gleiche und befindet sich in test1.xls und test3.xls (aber für jede Mappe angepasst). Ich habe wieder die Mappen hochgeladen.

Ich hoffe, ich habe meine Angelegenheit besser erklärt.

Schöne Grüsse

BoskoBiati
19.04.2009, 22:41
Hallo chaelo,

hier mal ein Entwurf, Du mußt die Pfade entsprechend anpassen:

chaelo
20.04.2009, 09:50
Hallo Edgar,

Danke vielmals für deine Bereitschaft und dein Geduld mir zu helfen,

ich brauche aber nicht die ganze Zeile sondern nur bestimmte Zellen von den beiden Tabellen1 (aus test1 und test3), was ich auch am Anfang angefragt habe. (die Zellen D und E müssen nicht kopiert werden.
Es soll nach dem Verkäufer „Heinz“ (dein Beispiel) in der Spalte G gesucht werden, wenn es gefunden worden, sollen die Zellen A, B, C, F und G transferiert werden, aber wenn der Wert in der Zelle F schon existiert sollen die Zellen nur aktualisiert werden.

Schöne Grüsse

BoskoBiati
20.04.2009, 10:20
Hallo Chaelo,

ändere folgende Zeilen:
wsh1.Rows(loZeile1).Copy Destination:=wsh2.Rows(loZeile2)
entweder so, dass Du jede zu kopierende Zelle einzeln ansprichst "wsh2.Cells(lozeile2,1)=wsh1.Cells(lozeile1,1)"
oder über eine Schleife.

chaelo
21.04.2009, 14:35
Hallo Edgar,

es klappt leider nicht, es wird nichts kopiert.
Ich glaube ich soll das ganze vergessen, es ist zu kompliziert oder ich bin so doof für so was.

Danke vielmals.

BoskoBiati
21.04.2009, 16:09
Hallo chaelo,

kompliziert ist die Angelegenheit auf jeden Fall nicht. Kannst Du vielleicht erläutern, was nicht klappt und evtl. noch die Codezeilen reinstellen, die Du geändert hast?

BoskoBiati
21.04.2009, 16:39
Hallo Chaelo,

ersetze in beiden Makros die Zeilen zwischen:

Suchbegriff2 = wsh1.Cells(loZeile1, 6)

und:

Workbooks("test2.xls").Save

durch die folgenden:

Do Until loZeile2 = lozeile3


If wsh2.Cells(loZeile2, 5) = Suchbegriff1 And wsh2.Cells(loZeile2, 4) = Suchbegriff2 Then

wsh2.Cells(loZeile2, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(loZeile2, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(loZeile2, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(loZeile2, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(loZeile2, 5) = wsh1.Cells(loZeile1, 7)
loZeile2 = lozeile3 - 1
blXA = True
End If
loZeile2 = loZeile2 + 1

Loop
If blXA <> True Then
lozeile3 = wsh2.Cells(Rows.Count, 1).End(xlUp).Row + 1

wsh2.Cells(lozeile3, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(lozeile3, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(lozeile3, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(lozeile3, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(lozeile3, 5) = wsh1.Cells(loZeile1, 7)


End If
blXA = False
loZeile2 = 2
Next

jinx
21.04.2009, 18:07
Moin, Edgar,

interessante Abfrage:

If blXA <> True Then
Eine Boolesche Variable hat doch nur die Stati True oder False, oder irre ich mich?

If Not blXA Then
Und der Code für eine Schaltfläche (CommandButton1_Click) gehört auf sicher nicht in DieseArbeitsmappe, sondern hinter die Tabelle, auf der sich die Schaltfläche befindet, wenn sie denn aus der Symbolleiste Steuerelement-Toolbox wäre...

BoskoBiati
21.04.2009, 18:37
Hallo jinx,

dass boolesche Variable nur zwei Stati haben können ist klar, aber ich habe ein Problem mit Deiner Syntax. Nach dieser müsste blxa prinzipiell true sein, oder aber ich begreife hier etwas nicht. vielleicht kannst Du mir auf die Sprünge helfen.
Auf die Platzierung des Codes habe ich nicht geachtet, da ich ihn nur umgeändert habe. Aber auch hier wieder was dazu gelernt.

jinx
21.04.2009, 18:52
Moin, Edgar,

diese Art Abfrage kann nur in VBA genutzt werden, weil dort per se der boolesche Wert ohne Zuweisung immer auf falsch steht

Sub test()
Dim bWert As Boolean

Debug.Print bWert
End Sub
Meine Art der Darstellung besagt doch nur, dass der Wert True negiert wird und dann eine Aktion folgt - es kann sowohl die Langform
If blXA = False Then
als auch
If Not blXA Then
eingesetzt werden, um die Variante False abzufragen.

BoskoBiati
21.04.2009, 21:09
Hallo jinx,

danke für die Info. Es fällt mir verdammt schwer, mich in eine If-Anweisung ohne Gleichheitszeichen hineinzuversetzen. Die Anweisung bedeutet also, wie ich es interpretiere, dass die Negation des Istzustandes der Variablen blXA verglichen wird mit dem vorprogrammierten Zustand und wenn das Ergebnis wahr ist, wird das Ereignis ausgelöst

jinx
21.04.2009, 22:34
Moin, Edgar,

um die Verwirrung komplett zu machen: wird eine boolesche Variable ohne weitere Angabe verglichen, wird immer auf den Wert True verglichen. Vielleicht machen es die beiden folgenden Beispiele etwas verständlicher:

Sub test2A()
Dim bWert As Boolean

If bWert Then
Debug.Print bWert
Else
Debug.Print "Teil für FALSCH" 'wird ausgeführt, weil bWert FALSCH/FALSE
End If

End Sub
<hr>
Sub test2B()
Dim bWert As Boolean

If Not bWert Then
Debug.Print bWert 'wird ausgeführt, weil bWert FALSCH/FALSE
Else
Debug.Print "Teil für WAHR"
End If

End Sub
Und wegen des Weglassens des Vergleichs: das ist Ansichtssache. Wenn es leichter und für dem Threadersteller verständlicher sein sollte, kann natürlich auch die Langform gewählt werden (aber nach wie vor gilt für mich: Wenn die Sonne scheint ist wahr, dann als übersetzte Anweisung klingt einfach nicht so, wie es mein Sprachempfinden erwarten würde... :grins: ).

BoskoBiati
22.04.2009, 05:33
Hallo jinx,

dieser Satz:
wird immer auf den Wert True verglichen
ist der Satz, der mir das Ganze erst logisch macht.
"If not" ist dann nur die Verschlankung von "if not is true" . Ich habe in Deinem vorhergehenden Beitrag versucht, mit der Aussage, der boolsche Wert ist immer Falsch, wenn er nicht zugewiesen ist, mit dem Hintergrund von "if not" zu verbinden.:top:

chaelo
22.04.2009, 12:39
Hallo ihr Beiden,

Danke für die tolle Diskussion und die Teilnahmen an meinen Beitrage.

Ich habe leider nichts kapiert. Wie sieht das ganze jetzt aus?

Schöne Grüße

BoskoBiati
22.04.2009, 15:06
Hallo Chaelo,

ich hatte Dir einen Code zur Verfügung gestellt, der Deine Probleme löst. Du mußt ihn nur noch einbauen. Du kannst dann auch das Thema der Diskussion berücksichtigen und die Zeile ändern, die jinx beanstandet hat. Zudem solltest Du, wie jinx empfohlen hat, die Codes hinter Deine Tabelle legen und nicht in Deine Arbeitsmappe.

chaelo
24.04.2009, 14:37
Hallo Edgar,

es wird leider nichts übertragen, die Tabelle2 in der Mappe Test2.xls bleibt immer leer. Mein Code sieht wie folgt aus, ist das richtig?

Option Explicit
Option Compare Text
Public Sub CommandButton1_Click()

Dim wsh1 As Worksheet
Dim wsh2 As Worksheet
Dim strC As String
Dim strD As String
Dim Suchbegriff1 As String
Dim Suchbegriff2 As String
Dim loZeile1 As Long
Dim loZeile2 As Long
Dim lozeile3 As Long
Dim blXA As Boolean
Application.ScreenUpdating = False
loZeile2 = 2
blXA = False

Workbooks.Open ("C:\Entwurf\Test2.xls")
Set wsh1 = Workbooks("Test1.xls").Worksheets("Tabelle1")
Set wsh2 = Workbooks("Test2.xls").Worksheets("Tabelle2")
lozeile3 = wsh2.Cells(Rows.Count, 1).End(xlUp).Row + 1
For loZeile1 = 2 To wsh1.Cells(Rows.Count, 7).End(xlUp).Row
Suchbegriff1 = wsh1.Cells(loZeile1, 7)

Suchbegriff2 = wsh1.Cells(loZeile1, 6) ' Cells(i, "O") = "7861"

Do Until loZeile2 = lozeile3


If wsh2.Cells(loZeile2, 5) = Suchbegriff1 And wsh2.Cells(loZeile2, 4) = Suchbegriff2 Then

wsh2.Cells(loZeile2, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(loZeile2, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(loZeile2, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(loZeile2, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(loZeile2, 5) = wsh1.Cells(loZeile1, 7)
loZeile2 = lozeile3 - 1
blXA = True
End If
loZeile2 = loZeile2 + 1

Loop
If Not blXA Then
lozeile3 = wsh2.Cells(Rows.Count, 1).End(xlUp).Row + 1

wsh2.Cells(lozeile3, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(lozeile3, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(lozeile3, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(lozeile3, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(lozeile3, 5) = wsh1.Cells(loZeile1, 7)


End If
blXA = False
loZeile2 = 2
Next




Workbooks("test2.xls").Save
Workbooks("test2.xls").Close




Application.ScreenUpdating = True
End Sub


Sorry für die Mühe
Danke und bis Bald

jinx
24.04.2009, 14:59
Moin, chaelo,

vielleicht solltest Du kundtun, in welcher Mappe sich Dein Makro befindet?

Bei mir befindet sich der Code in Modul1 der Mappe Test1:

Public Sub CommandButton1_Click()

Dim wsh1 As Worksheet
Dim wsh2 As Worksheet
Dim wbData As Workbook
Dim strC As String
Dim strD As String
Dim Suchbegriff1 As String
Dim Suchbegriff2 As String
Dim loZeile1 As Long
Dim loZeile2 As Long
Dim lozeile3 As Long
Dim blXA As Boolean
Application.ScreenUpdating = False
loZeile2 = 2
blXA = False

Set wbData = Workbooks.Open(ThisWorkbook.Path & Application.PathSeparator & "Test2.xls")
Set wsh1 = ThisWorkbook.Worksheets("Tabelle1")
Set wsh2 = wbData.Worksheets("Tabelle2")
lozeile3 = wsh2.Cells(Rows.Count, 1).End(xlUp).Row + 1
For loZeile1 = 2 To wsh1.Cells(Rows.Count, 7).End(xlUp).Row
Suchbegriff1 = wsh1.Cells(loZeile1, 7)
Suchbegriff2 = wsh1.Cells(loZeile1, 6) ' Cells(i, "O") = "7861"

Do Until loZeile2 = lozeile3
If wsh2.Cells(loZeile2, 5) = Suchbegriff1 And wsh2.Cells(loZeile2, 4) = Suchbegriff2 Then
wsh2.Cells(loZeile2, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(loZeile2, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(loZeile2, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(loZeile2, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(loZeile2, 5) = wsh1.Cells(loZeile1, 7)
loZeile2 = lozeile3 - 1
blXA = True
End If
loZeile2 = loZeile2 + 1
Loop
If Not blXA Then
lozeile3 = wsh2.Cells(Rows.Count, 1).End(xlUp).Row + 1
wsh2.Cells(lozeile3, 1) = wsh1.Cells(loZeile1, 1)
wsh2.Cells(lozeile3, 2) = wsh1.Cells(loZeile1, 2)
wsh2.Cells(lozeile3, 3) = wsh1.Cells(loZeile1, 3)
wsh2.Cells(lozeile3, 4) = wsh1.Cells(loZeile1, 6)
wsh2.Cells(lozeile3, 5) = wsh1.Cells(loZeile1, 7)
End If
blXA = False
loZeile2 = 2
Next

wbData.Close savechanges:=True

Set wsh2 = Nothing
Set wsh1 = Nothing
Set wbData = Nothing

Application.ScreenUpdating = True
End Sub
Und da werden Daten aus Test1 nach Test2 (im gleichen Verzeichnis wie Test1) übertragen... ;)

BoskoBiati
24.04.2009, 15:12
hallo chaelo,

kann es sein, dass Du das Makro in Deine Tabelle kopierst und dann mit der Schaltfläche startest?

chaelo
29.04.2009, 11:33
Hallo jinx,

Schönen Dank es funktioniert.

Danke auch Edgar.