Hallo Leute,
ich habe zwei Fragen :
Dieser Makro-VBA-Code prüft eine Spalte von 2 verschiedenen Tabellenblättern und markiert Übereinstimmungen im aktiven Blatt grün.
For ZeileB1 = 3 To 150
For ZeileB2 = 3 To 150
If ThisWorkbook.ActiveSheet.Range("B" & ZeileB1) = Sheets("8.KW").Range("B" & ZeileB2) Then
ThisWorkbook.ActiveSheet.Range("B" & ZeileB1 & ":" & "B" & ZeileB1).Select
With Selection.Interior
.Color = 5287936
End With
End If
Next ZeileB2
Next ZeileB1
1. Frage :
Wie bringe ich das Makro dazu, statt zu Färben gleich die komplette Zeile zu übernehmen?
2. Frage :
Wie bringe ich das Makro dazu, Spalte B des aktiven Blattes mit Spalte B des vorherigen Blattes miteinander zu vergleichen ?
Erklärung dazu : In der Mappe kommt jede Woche ein neues Blatt hinzu, welches nur mit der Vorwoche verglichen werden muss. Im oberen Code wird der Vergleich zwischen ActiveSheet und 8.KW angestoßen, ich benötige aber eher Vergleich zw. ActiveSheet und ActiveSheet-1.
Vielen Dank.
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
1.
komplette Zeile im Sinne der ganzen Row?
2.
Über ActiveWorkbook.Worksheets findest du alle Sheets,
deine Aufgabe ist es die darin beiden zu finden die du vergleichen möchtest.
Das beste Kriterium ist wahrscheinlich der Name.
@PaoloP :
zu 1.
Es wird Spalte B des letzten (9.KW) mit dem vorletzten (8.KW) Tabellenblatt verglichen.
Aktuell wird bei Übereinstimmung der entsprechende Wert im letzten Tabellenblatt farbig gekennzeichnet.
Noch schöner wäre es, wenn bei Übereinstimmung die komplette Zeile aus der "Vorwoche" auf die entsprechende Zeile der "aktuellen Woche" kopiert wird.
Die Werte können aber jede Woche in einer anderen Zeile innerhalb von Spalte b stehen.
zu 2.
Den Teil habe ich lösen können mit
Worksheets(Sheets.Count) und Worksheets(Sheets.Count - 1) .
Nun werden in meinem Makro immer Spalte B des letzten und des vorletzten Blattes verglichen.
Vielen Dank.
Sicher nicht die eleganteste Lösung aber mehr ist aus dem Stand nicht drin.
Benutzt sich hoffentlich Selbsterklärend. Ungetestet.
Private Sub CopyRowValues(SourceSheet As Excel.Worksheet, lRowSourceIndex As Long, _
DestinationSheet As Excel.Worksheet, lRowDestIndex As Long)
Dim rSource As Excel.Range
Set rSource = SourceSheet.Rows(lRowSourceIndex)
Dim rDest As Excel.Range
Set rDest = SourceSheet.Rows(lRowDestIndex)
Dim rCell As Excel.Range
For Each rCell In rSource.Cells
rDest.Cells(, rCell.Column).Value = rCell.Value
Next rCell
End Sub
@PaoloP :
Vielen Dank für Deine Antwort - leider bin ich ihrer nicht würdig, weil : ich komm nicht klar...
For ZeileB1 = 3 To 150
For ZeileB2 = 3 To 150
If Worksheets(Sheets.Count).Range("B" & ZeileB1) = Worksheets(Sheets.Count - 1).Range("B" & ZeileB2) Then
Worksheets(Sheets.Count).Range(ZeileB1 & ":" & ZeileB1).Select
With Selection.Interior
.Color = 5287936
End With
End If
Next ZeileB2
Next ZeileB1
Die ist mein aktueller Code, welcher Spalte B von Blatt X innerhalb der Zeilen von 3 bis 150 mit Spalte B von Blatt X-1 vergleicht und bei gefundenen gleichen Werten die Zeilen in Blatt X farbig markiert.
In der genannten Excel-Mappe werden Woche für Woche Aufträge geprüft (für jede KW ein Blatt) und manuell um weitere Informationen ergänzt. Einige Aufträge aus der Vorwoche sind noch nicht erledigt -stehen also im aktuellen Blattmit drin-, andere sind erledigt und wiederum andere sind hinzugekommen.
Damit aber wirklich nur die neu hinzugekommenen Aufträge geprüft werden, benötige ich diese Funktion des Vergleichens und Kopieren/Einfügen.
Danke und Grüße.
Wo genau hakt es denn nun jetzt noch? Das sieht doch optisch erstmal gar nicht so schnelcht aus. Hab allerdings gerade kein Excel zur Verfügung zum testen...
Wenns eine Fehlermeldung beim ausführen gibt solltest Du uns die genaue Position angeben an der sie gemeldet wird.
Gruß
Borlander
Lieber ThisWorkbook verwenden - das bezieht sich immer auf die Arbeitsmappe in der das Makro gespeichert ist. Wird auch in der Excel-VBA-Referenz so empfohlen ;-)
Da war was hinsichtlich der ThisObjects in Excel ich erinner mich.
Es ist so das Excel für den programmatischen Zugriff und für den User
während der Ausführung eines Makros gesperrt ist. Das gilt wie gesagt nur
für die Makro Ausführung d.h. =FunctionBlub() in einer Zelle. die ThisObjects soll man
im Makro dann nur zur späteren Verwendung wegspeichern.
Ruft man die gleiche Funktion über einen platzierten Button auf ist das unkritischer.
Ruft man also eine eigene VBA Funktion als Formel in einer Zelle auf wird sie zum Makro und kann je nach Code dann auf einmal scheitern. Ganz schön crazy :-)
@ Borlander :
zu ActiveWorkbook.Worksheets :
Danke - geändert .
zu "Wo hakt es ?" :
Der Code "färbt" nur - das funktioniert gut !
For ZeileB1 = 3 To 150
For ZeileB2 = 3 To 150
If ActiveWorkbook.Worksheets(Sheets.Count).Range("B" & ZeileB1) = ActiveWorkbook.Worksheets(Sheets.Count - 1).Range("B" & ZeileB2) Then
ActiveWorkbook.Worksheets(Sheets.Count).Range(ZeileB1 & ":" & ZeileB1).Select
With Selection.Interior
.Color = 5287936
End With
End If
Next ZeileB2
Next ZeileB1
Er soll aber bei Übereinstimmung die komplette Zeile aus der "Vorwoche"(.Count - 1) auf die entsprechende Zeile der "aktuellen Woche"(.Count) kopieren, "damit aber wirklich nur die neu hinzugekommenen Aufträge geprüft werden".
Danke und Grüße.
Ich versteh dich nicht, du musst doch nur noch das da rausschmeissen:
ActiveWorkbook.Worksheets(Sheets.Count).Range(ZeileB1 & ":" & ZeileB1).Select
With Selection.Interior
.Color = 5287936
End With
und stattdessen die Funktion die oben von mir geschrieben steht aufrufen also:
CopyRowValues(ActiveWorkbook.Worksheets(Sheets.Count - 1), ZeileB2 , _
ActiveWorkbook.Worksheets(Sheets.Count), ZeileB1 )
Whats the Problem?
*schulterzuck*
@PaoloP :
Ich versteh das auch nicht ...
wenn ich aus
For ZeileB1 = 3 To 150
For ZeileB2 = 3 To 150
If ActiveWorkbook.Worksheets(Sheets.Count).Range("B" & ZeileB1) = ActiveWorkbook.Worksheets(Sheets.Count - 1).Range("B" & ZeileB2) Then
ActiveWorkbook.Worksheets(Sheets.Count).Range(ZeileB1 & ":" & ZeileB1).Select
With Selection.Interior
.Color = 5287936
End With
End If
Next ZeileB2
Next ZeileB1
das mache :
For ZeileB1 = 3 To 50
For ZeileB2 = 3 To 50
If ActiveWorkbook.Worksheets(Sheets.Count).Range("B" & ZeileB1) = ActiveWorkbook.Worksheets(Sheets.Count - 1).Range("B" & ZeileB2) Then
CopyRowValues(ActiveWorkbook.Worksheets(Sheets.Count - 1), ZeileB2 , _
ActiveWorkbook.Worksheets(Sheets.Count), ZeileB1 )
End If
Next ZeileB2
Next ZeileB1
bekomme ich einen Syntax-Fehler gemeldet in der Zeile.
Im Klartext :
Ich weiß nicht, was ich da machen kann. Ich bekomme Deinen Code nicht zum laufen in meiner Mappe.
Thats the Problem!
*schulterzuck*
Danke und Grüße.
Set wks1 = ThisWorkbook.Worksheets(Sheets.Count)
Set wks2 = ThisWorkbook.Worksheets(Sheets.Count - 1)
For ZeileB1 = 3 To 100
For ZeileB2 = 3 To 100
If wks1.Range("B" & ZeileB1) = wks2.Range("B" & ZeileB2) Then
CopyRowValues(wks2, ZeileB2, wks1, ZeileB1)
End If
Next ZeileB2
Next ZeileB1
Hab den Code etwas aufgehübscht.
Deine Zeile CopyRowValues(ActiveWorkbook.Worksheets(Sheets.Count - 1), ZeileB2 , _
ActiveWorkbook.Worksheets(Sheets.Count), ZeileB1 ) sieht dann ja so aus :
CopyRowValues(wks2, ZeileB2, wks1, ZeileB1)
Wenn diese wie im Code oben eingefügt wird, meldet VB :
"Fehler beim Kompilieren - Erwartet : = " .
Beim Durchlauf kommt eben auch der Syntaxfehler für diese Zeile.
Da ich ein Laie bin, komme ich hier nicht weiter.
Vielen Dank für die bisherige Hilfe und fürs Verständnis.
Grüße.
Dieser Code erfüllt meine Wünsche :
Sub Vergleich()
Set wks1 = ThisWorkbook.Worksheets(Sheets.Count)
Set wks2 = ThisWorkbook.Worksheets(Sheets.Count - 1)
For ZeileB1 = 3 To 100
For ZeileB2 = 3 To 100
If wks1.Range("B" & ZeileB1) = wks2.Range("B" & ZeileB2) Then
wks2.Range(ZeileB2 & ":" & ZeileB2).Copy Destination:=wks1.Range(ZeileB1 & ":" & ZeileB1)
End If
Next ZeileB2
Next ZeileB1
MsgBox "Vergleich abgeschlossen...", vbInformation
Range("D3").Select
End Sub
Vielen Dank.
grüße
Ich hab das hier jetzt mal durch Excel gejagt, und es geht.
Private Sub CommandButton1_Click()
For ZeileB1 = 3 To 50
For ZeileB2 = 3 To 50
If ActiveWorkbook.Worksheets(Sheets.Count).Range("B" & ZeileB1) = ActiveWorkbook.Worksheets(Sheets.Count - 1).Range("B" & ZeileB2) Then
CopyRowValues ActiveWorkbook.Worksheets(Sheets.Count - 1), ZeileB2, ActiveWorkbook.Worksheets(Sheets.Count), ZeileB1
End If
Next ZeileB2
Next ZeileB1
End Sub
Du hast die Sub CopyRowValues mit Klammern um die Parameter also als Funktion aufgerufen
geht auch okay wenn man ein Call davor setzt bzw. besser einfach die Klammern weg nehmen.
@PaoloP:
Du wirst wieder mit der Schulter zucken, aber ich habe Deinen Code
probiert , und ... "Argumenttyp ByRef unverträglich".
Gezeigt wird auf den Wert "ZeileB2" in "CopyRowValues ...(Sheets.Count - 1), ZeileB2 ..." .
*ahnungslosschulterzuck*
Grüße.
Das kann sein ja, die Auflistungsobjekte sind erstmal nur Variant und ByRef kann er das natürlich nicht implizit konvertieren. Ändere mal den Funktionskopf zu:
Private Sub CopyRowValues(ByVal SourceSheet As Excel.Worksheet, lRowSourceIndex As Long, _
ByVal DestinationSheet As Excel.Worksheet, lRowDestIndex As Long)