Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Wenn Formel ?
#11
Hallo iamye,

ich gehe davon aus, dass du den Code in einem allgemeinen Modul abgelegt hast (falls nicht: das ist der richtige Platz dafür!).

Zitat:Letzte Frage.., ist es möglich die Sätze im Makro zu ändern ?
Ich nehme an, du meinst die 'Kommentare'. Alles, was im VisualBasicEditor grün angezeigt wird, sind Kommentare. Sie sind dadurch gekennzeichnet, dass sie rechts vom Apostroph (') stehen - oder anders ausgedrückt: nach einem Apostroph kommt in dieser Zeile nur noch ein Kommentar.
Kommentare werden nicht vom Computer interpretiert, sie sind ausschließlich dafür da, damit wir Menschen uns Hinweise in den Code schreiben können, die uns in irgendeiner Form jetzt oder später helfen.
Ich habe absichtlich so viele Kommentare in den Code geschrieben, weil ich den Eindruck habe, dass du sehr unerfahren mit VBA bist. So wollte ich dir erleichtern zu verstehen, was der Code / die einzelne Codezeile bewirkt, und dir damit helfen, den Code selbst an deine Bedürfnisse anzupassen.
Also: ja, natürlich du bist herzlich eingeladen, alles an dem Code oder seinen Kommentaren zu verändern.
Löscht du alle Kommentare oder fügst du welche hinzu, ändert sich nichts am Verhalten bei der Makroausführung.
Änderst du etwas am Code - ändert sich natürlich das Ergebnis des Makros (klar Wink ).



Ich habe gerade kein Excel zur Verfügung, konnte also nicht testen:
Code:
Sub nameSelbstAnpassen()
Dim lngLetzte2017 As Long, lngLetzte As Long, lZeile As Long, rngM As Range
'Wenn der Wert aus Zeile M (Sheet 2017) nicht in Zeile M (Sheet Update) auftaucht dann "hier im Beispiel Zeile 13" aus Sheet 2017 löschen.
   With Sheets("2017")
       'letzte benutzte Zeile in Spalte M finden
       For lZeile = .UsedRange.Rows.Count + .UsedRange.Row To 1 Step -1
           If Not IsEmpty(.Cells(lZeile, 13)) Then
               lngLetzte2017 = lZeile
               Exit For
           End If
       Next
                      
       For lZeile = lngLetzte2017 To 3 Step -1             ' Schleife über alle Zeilen
           If Not IsEmpty(.Cells(lZeile, 13)) Then         ' Wenn Zelle in Spalte M nicht leer
               set rngM = sheets("update").range("M:M").find(.cells(lzeile,13))
               if rngm is nothing then
                   .Rows(lZeile).Delete                    ' Zeile löschen
               else
                   .cells(lzeile,12).value=sheets("update").cells(rngm.row,12).value  ' Wert aus Spalte L übernehmen
               endif
           End If
       Next
   End With


' insert / update
   With Sheets("update")
       lngLetzte = .UsedRange.Rows.Count + .UsedRange.Row - 1                      ' letzte Zeile im Tabellenblatt "update"
       For lZeile = 1 To lngLetzte                                                 ' Schleife über alle Zeilen
           If Not IsEmpty(.Cells(lZeile, 13)) Then                                 ' Wenn Zelle in Spalte M nicht leer
               Set rngM = Sheets("2017").Range("M:M").Find(.Cells(lZeile, 13))     ' Nach Zellinhalt in '2017'!M:M suchen
               If rngM Is Nothing Then                                             ' Wenn nichts gefunden wurde
                   'Wenn der Wert aus Zeile M (Sheet Update) nicht in Zelle M (Sheet 2017) autaucht dann gesamte Zeilen-Linie aus (Sheet Update) in Sheet 2017 einfügen.
                   lngLetzte2017 = lngLetzte2017 + 1
                   Sheets("2017").Rows(lngLetzte2017).Insert , CopyOrigin:=xlFormatFromLeftOrAbove     ' Zeile einfügen
                   Sheets("2017").Range("A" & lngLetzte2017 & ":N" & lngLetzte2017).Value = .Range("A" & lZeile & ":N" & lZeile).Value  'Werte kopieren
               Else
                   'Wenn der Wert aus Zeile M (Sheet Update) in Zeile M (Sheet 2017) besteht, dann < Wert aus Zeile F (Sheet Update) in (Sheet 2017) übernehmen.
                   rngM.Offset(0, -7).Value = .Cells(lZeile, 6).Value              ' Wert aus Spalte F übernehmen
               End If
           End If
       Next
   End With

End Sub


Zitat:Wenn der Wert aus Spalte F (Seite - 2017) ändert, dann Zelle (aus Spalte A, Seite - 2017) löschen.
Dazu muss man ein "spezielles Makro" schreiben, das automatisch ausgeführt wird. Es muss in das Codefenster des Tabellenblattes "2017", sonst funktioniert es nicht.
Code:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Target.Column = 6 Then 'nur bei Änderung in Spalte F
        range(cells(target.row,1), cells(target.row+target.rows.count-1,1)).clearcontents
    End If
End Sub
Immer wenn du etwas in Spalte F veränderst, wird in Spalte A der entsprechenden Zeile gelöscht.


Zitat:-> envoyé // wenn dieses wort ausgewählt ist soll die Reihe A3 - N3 zb. gelb markiert werden.
Das könntest du doch bestimmt gut über eine benutzerdefinierte Formatierung erledigen. Meine Empfehlng: wenn du kaum Erfahrung mit VBA hast, dann benutze es zunächst sparsam - vor allem wenig Dinge, die automatisch passieren.

Grüße, Ulrich
Antworten Top
#12
Hallo Ulrich,

der 1ste Teil ist top, der 2. funzt nicht..

Ist klar ich bin Newbie aber ich glaube, wenn das alles eingestellt ist dann werde ich nicht mehr dran fummeln.. :)
Antworten Top
#13
Hallo,

Zitat:der 1ste Teil ist top, der 2. funzt nicht..
Was ist der erste Teil, was der zweite?
Betreffend dem, was nicht "funzt":
- Wo hast du welchen Code eingefügt?
- Welche Fehlermeldung tritt auf?
- Was hast du getan?
- Was macht der Code?
- Was hättest du vom Code erwartet?

Stell dir vor, du willst mir über das Internet helfen, mein Auto zu reparieren. Da benötigst du auch mehr Infos, als "es funzt nicht", oder?!
Ich benötige und erwarte deine Mithilfe - ohne kann ich dir nicht helfen.

Gute Nacht,
Ulrich
Antworten Top
#14
Hallo Ulrich,

im Anhang mein Excel-Dokument :)


Diese Funktionen sollen noch hinzu kommen:

- Wenn der Text aus Spalte L (Seite 2017) nicht gleich dem Text aus Spalte L (Seite update) ist, dann der Text aus Spalte L (Seite update) in Spalte L (Seite 2017)
überschreiben.


- Wenn durch das reinkopieren des Updates der Wert aus Spalte F (Seite 2017) ändert, dann der Text aus Spalte A (Seite 2017) löschen.
(Die Farbe soll dann wieder verschwinden)


Mit freundlichen Grüßen


Angehängte Dateien
.xlsm   rappels - 2017.xlsm (Größe: 27,06 KB / Downloads: 2)
Antworten Top
#15
Hallo iamye,

ich habe beides umgesetzt und an deinem Beispiel getestet:
Code:
Sub nameSelbstAnpassen3()
Dim lngLetzte2017 As Long, lngLetzte As Long, lZeile As Long, rngM As Range
'Wenn die Referenz aus Spalte M (Seite 2017) nicht in Spalte M (Seite update) vorhanden ist, dann die komplette Zeile auf (Seite 2017) löschen.
   With Sheets("2017")
       'letzte benutzte Zeile in Spalte M finden
       For lZeile = .UsedRange.Rows.Count + .UsedRange.Row To 1 Step -1
           If Not IsEmpty(.Cells(lZeile, 13)) Then
               lngLetzte2017 = lZeile
               Exit For
           End If
       Next
                      
       For lZeile = lngLetzte2017 To 3 Step -1             ' Schleife über alle Zeilen
           If Not IsEmpty(.Cells(lZeile, 13)) Then         ' Wenn Zelle in Spalte M nicht leer
               Set rngM = Sheets("update").Range("M:M").Find(.Cells(lZeile, 13))
               If rngM Is Nothing Then
                   .Rows(lZeile).Delete                    ' Zeile löschen
               Else
                   .Cells(lZeile, 12).Value = Sheets("update").Cells(rngM.Row, 12).Value ' Wert aus Spalte L übernehmen
               End If
           End If
       Next
   End With

'einfügen
   With Sheets("update")
       lngLetzte = .UsedRange.Rows.Count + .UsedRange.Row - 1                      ' letzte Zeile im Tabellenblatt "update"
       For lZeile = 1 To lngLetzte                                                 ' Schleife über alle Zeilen
           If Not IsEmpty(.Cells(lZeile, 13)) Then                                 ' Wenn Zelle in Spalte M nicht leer
               Set rngM = Sheets("2017").Range("M:M").Find(.Cells(lZeile, 13))     ' Nach Zellinhalt in '2017'!M:M suchen
               If rngM Is Nothing Then                                             ' Wenn nichts gefunden wurde
                    'Wenn die Referenz aus Zeile M (Seite update) nicht in Zelle M (Seite 2017) vorhanden ist, dann die gesamte Zeilen-Linie aus (Seite update) in (Seite 2017) einfügen.
                   lngLetzte2017 = lngLetzte2017 + 1
                   Sheets("2017").Rows(lngLetzte2017).Insert , CopyOrigin:=xlFormatFromLeftOrAbove     ' Zeile einfügen
                   Sheets("2017").Range("A" & lngLetzte2017 & ":N" & lngLetzte2017).Value = .Range("A" & lZeile & ":N" & lZeile).Value  'Werte kopieren
               Else
                    'Wenn die gleiche Referenz aus Zeile M (Seite update) in Zeile M (Seite 2017) gefunden wurde, dann < Wert aus Zeile F (Seite update) in (Seite 2017) übernehmen.
                    If rngM.Offset(0, -7).Value <> .Cells(lZeile, 6).Value Then
                        rngM.Offset(0, -7).Value = .Cells(lZeile, 6).Value              ' Wert aus Spalte F übernehmen
                        Sheets("2017").Cells(rngM.Row, 1).ClearContents                 ' Wert in Spalte A löschen
                   End If
               End If
           End If
       Next
   End With

End Sub

Wie läuft es bei dir?

Grüße, Ulrich
Antworten Top
#16
Es klappt einwandfrei ! TOPPP :)

Jetzt habe ich mich aber an die letze Spalte K und N erinnert :/


Wenn der Datum aus als Spalte K (Seite update) neuer *rezenter* ist als der Datum aus Spalte K (Seite 2017), dann Datum aus Spalte K (update) in Spalte K (Seite 2017) überschreiben.

Wenn der Wert aus Spalte N (Seite update) < als der Wert aus Spalte N (Seite 2017) ist, dann der Wert aus Spalte N (Seite update) in Spalte N (Seite 2017) überschreiben.


Der Rest soll genau sou bestehen bleiben..
Antworten Top
#17
Hallo,

wie ist das so:
Code:
Sub nameSelbstAnpassen4()
Dim lLetzte2017 As Long, lngLetzte As Long, lZeile As Long, rngM As Range, lrngMRow As Long
Dim Ws2017 As Worksheet
Set Ws2017 = Sheets("2017")
'Wenn die Referenz aus Spalte M (Seite 2017) nicht in Spalte M (Seite update) vorhanden ist, dann die komplette Zeile auf (Seite 2017) löschen.
   With Ws2017
        'letzte benutzte Zeile in Spalte M finden
        For lZeile = .UsedRange.Rows.Count + .UsedRange.Row To 1 Step -1
            If Not IsEmpty(.Cells(lZeile, 13)) Then
                lLetzte2017 = lZeile
                Exit For
            End If
        Next
                      
        For lZeile = lLetzte2017 To 3 Step -1               ' Schleife über alle Zeilen
            If Not IsEmpty(.Cells(lZeile, 13)) Then         ' Wenn Zelle in Spalte M nicht leer
                Set rngM = Sheets("update").Range("M:M").Find(.Cells(lZeile, 13))
                If rngM Is Nothing Then
                    .Rows(lZeile).Delete                    ' Zeile löschen
                Else
                    .Cells(lZeile, 12).Value = Sheets("update").Cells(rngM.Row, 12).Value ' Wert aus Spalte L übernehmen
                End If
            End If
        Next
      
        'letzte benutzte Zeile in Spalte M finden
        For lZeile = .UsedRange.Rows.Count + .UsedRange.Row To 1 Step -1
            If Not IsEmpty(.Cells(lZeile, 13)) Then
                lLetzte2017 = lZeile
                Exit For
            End If
        Next
   End With

'einfügen
   With Sheets("update")
       lngLetzte = .UsedRange.Rows.Count + .UsedRange.Row - 1                       ' letzte Zeile im Tabellenblatt "update"
       For lZeile = 1 To lngLetzte                                                  ' Schleife über alle Zeilen
           If Not IsEmpty(.Cells(lZeile, 13)) Then                                  ' Wenn Zelle in Spalte M nicht leer
               Set rngM = Ws2017.Range("M:M").Find(.Cells(lZeile, 13))              ' Nach Zellinhalt in '2017'!M:M suchen
               If rngM Is Nothing Then                                              ' Wenn nichts gefunden wurde
                    'Wenn die Referenz aus Zeile M (Seite update) nicht in Zelle M (Seite 2017) vorhanden ist, dann die gesamte Zeilen-Linie aus (Seite update) in (Seite 2017) einfügen.
                   lLetzte2017 = lLetzte2017 + 1
                   Ws2017.Rows(lLetzte2017).Insert , CopyOrigin:=xlFormatFromLeftOrAbove     ' Zeile einfügen
                   Ws2017.Range("A" & lLetzte2017 & ":N" & lLetzte2017).Value = .Range("A" & lZeile & ":N" & lZeile).Value  'Werte kopieren
               Else
                    'Wenn die gleiche Referenz aus Zeile M (Seite update) in Zeile M (Seite 2017) gefunden wurde, dann Wert aus Zeile F (Seite update) in (Seite 2017) übernehmen.^
                   lrngMRow = rngM.Row
                    If rngM.Offset(0, -7).Value <> .Cells(lZeile, 6).Value Then
                        rngM.Offset(0, -7).Value = .Cells(lZeile, 6).Value          ' Wert aus Spalte F übernehmen
                        Ws2017.Cells(lrngMRow, 1).ClearContents                     ' Wert in Spalte A löschen
                    End If
                  
                    'Wenn der Datum aus als Spalte K (Seite update) neuer *rezenter* ist als der Datum aus Spalte K (Seite 2017), dann Datum aus Spalte K (update) in Spalte K (Seite 2017) überschreiben.
                    If IsDate(.Cells(lZeile, 11)) And IsDate(Ws2017.Cells(lrngMRow, 11)) Then
                        If CDate(.Cells(lZeile, 11)) > CDate(Ws2017.Cells(lrngMRow, 11)) Then
                             Ws2017.Cells(lrngMRow, 11).Value = .Cells(lZeile, 11).Value
                        End If
                    End If
                  
                    'Wenn der Wert aus Spalte N (Seite update) < als der Wert aus Spalte N (Seite 2017) ist, dann der Wert aus Spalte N (Seite update) in Spalte N (Seite 2017) überschreiben.
                    If .Cells(lZeile, 14).Value < Ws2017.Cells(lrngMRow, 14).Value Then
                        Ws2017.Cells(lrngMRow, 14).Value = .Cells(lZeile, 14).Value
                    End If

               End If
           End If
       Next
   End With

End Sub
Wie lange benötigt der Code, um deine Daten zu bearbeiten?

Grüße, Ulrich
[-] Folgende(r) 1 Nutzer sagt Danke an losgehts für diesen Beitrag:
  • iamye
Antworten Top
#18
Hallo Ulrich,

alles klappt einwandfrei.

Super Arbeit !

Nur +- 2 sec. ich habe aber nur 50 Zeilen momentan.. Warum fragst du ? Huh

Kennst du dich auch mit VBA in Word aus ? - Da muss auch noch etwas machen..


Mit freundlichen Grüßen
Antworten Top
#19
Hallo,

ich frage, weil ich mich für Techniken entschieden habe, die relativ langsam sind (bei großen Datenmengen macht sich das erst richtig bemerkbar). Der Grund meiner Entscheidung: die Entscheidung hatte ich zu Beginn des Themas gefällt, als das Makro noch nicht so viel können musste (=nicht sooo viel langsame Techniken). Diese Techniken haben den Vorteil, dass ich nicht so viel über deinen Aufbau wissen muss und so ziemlich 1 zu 1 deine Vorstellungen in Code überführen konnte.

Wenn du mit der Geschwindigkeit zufrieden bist, ist ja alles gut!


Nein, für Word interessiere ich mich nicht.

Grüße, Ulrich
[-] Folgende(r) 1 Nutzer sagt Danke an losgehts für diesen Beitrag:
  • iamye
Antworten Top
#20
Ich melde mich morgen wieder !

Vielen Dank
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste