Zeilen / Spalten tauschen fehlerhaft (VBA)
#1
Hallo,

Ich hab mir ein Makro gebastelt, das es einem ermöglichen soll, auf zwei verschiedenen Tabellenblättern Eintragungen in Spalten bzw Zeilen untereinander zu tauschen.
Dazu sollen zuvor die Tabellenblätter entsperrt werden. In "Liste" wird eine Spalte kopiert, in eine Hilfsspalte eingefügt, die zweite Spalte wird kopiert und direkt in die erste eingefügt, dann die Zwischenspalte kopiert und in den Bereich der ersten eingefügt. Anschließend wird die Zwischenspalte geleert. Den Bereich erfährt das Makro über zwei Zellen, die über SVERWEIS den Bereich als Text enthalten. Gleiche Vorgehensweise gilt auch für das Blatt "Persönliche D", nur dass dort die Zwischenspalte (sowie die der betreffenden Tabelle darüber) aus verbundenen Zellen besteht, weshalb sie nach dem Vorgang wieder verbunden werden. Im Anschluss werden beide Blätter wieder gesperrt und mit ihrem Passwort versehen.

Erstmal funktioniert das auch ganz gut, aber es kommt immer wieder mal vor, dass auf dem Blatt "Persönliche D" an dem Punkt das Makro einen Sprung macht und die kopierten Daten nicht einfügt:

Code:
' Tauschbereich 1 kopieren und in Zwischenspeicher Daten einfügen

        DTauschBereich1.Copy
        Range("B18").Select
            ActiveSheet.Paste
       

Folglich verschwindet dann beim Tausch manchmal eine Zeile der Eintragungen in "Persönliche Daten".

Wenn ich schrittweise den Code ablaufen lasse, dann passiert es, dass der Bereich kopiert wird, aber nicht eingefügt wird. Der Bereich "B18" wird auch nicht ausgewählt. Gleiches passiert auch, wenn ich den Bereich erweitere und B18:P18 verwende.

Der Fehler ist nicht reproduzierbar.

Vielleicht hat jemand von euch eine Idee...

Danke!


(Zur Erklärung: Hellgraue Schrift sind die sonst unsichtbaren Daten, auf dem Blatt "Persönliche D" unten befindet sich der Button zum Tauschen, die Zahlen entsprechen denen der Positionen in der Liste darüber)


.xlsm   Test Tauschen Makro 2.xlsm (Größe: 31,19 KB / Downloads: 9)

Ui! Könnte Zwischenablage leeren helfen? Das habe ich im ersten Teil des Codes glaube ich vergessen... Wenn ja dann Grüße an Bosko Biati. 

Kann es aber grade nicht ausprobieren, weil ich einkaufen bin...
Antworten Top
#2
Hallo,
bei mir geht es.
Aber: Deine Konstruktion On Error Resume Next
    ActiveSheet.Unprotexct Password:="CEF"
ist kreuzgefährlich. On Error kann man verwenden, sollte es aber nach der Stelle des Verwendens von Err.Number mit On Error Goto 0 auch wieder aufheben. Sonst geht jeder Fehler locker durch...
Zum 2. empfehle ich Dir , an die 1. Zeile deines Codes Option Explicite einzufügen. Dann würden Schreibfgehler wie Unprotexct erkannt und nicht mittels On Error übergangen werden.
Zum 3. gibt es unzählige Forumsbeiträge, dass Select nicht notwendig ist. Macht den Code übersichtlicher.

Also: Code Aufräumen und dann erneut testen!
Gruß der AlteDresdner (Win11, Off2021)
Antworten Top
#3
Hi,

Off topic
>interessant, dass es jemanden gibt, der das NATO-Alphabet noch kennt<
/Off topic

Aber mal im Ernst, was soll das werden?
Was soll wohin getauscht werden?
Dein Makro ist so konfus, dass es nicht nachvollziehbar ist.
Im Übrigen, wenn Du sortieren willst reicht das:

Code:
With Sheets("Persönliche D")
     .Range("B2:P17").UnMerge
    .Range("B2:P17").Sort Key1:=.Range("B2"), Order1:=xlAscending, MatchCase:=False
End With
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#4
Interessant. Bei mir geht es auch bei der Beispieldatei nicht. Mir wird zu 50% eine der beiden Zeilen gelöscht.

Die Errorgeschichte schaue ich mir mal an. Kann mir noch nicht 100% vorstellen, was ich genau tun muss, aber ich probier mich mal aus.

Option Explicite habe ich schon mal gelesen, dass man das besonders als Anfänger machen soll, allerdings nicht, warum... Als ich es probiert habe, kamen aber Meldungen wie "Sub oder Function... ?!". Das würde dann bedeuten, dass ich einen Schreibfehler im Code hatte?

Select ist ein Überbleibsel, weil ich VBA hauptsächlich über die Makroaufnahme lerne und versuche zu verstehen und bisher hat es mich zumindest nicht gestört. Eher habe ich dadurch verstanden, was da passiert. Aber gut, nehme ich mir zu Herzen und setze es um, ich brauch die "Info" mittlerweile ja nicht mehr.
Antworten Top
#5
(18.05.2024, 18:20)BoskoBiati schrieb: Aber mal im Ernst, was soll das werden?
Was soll wohin getauscht werden?
Dein Makro ist so konfus, dass es nicht nachvollziehbar ist.
Im Übrigen, wenn Du sortieren willst reicht das:

Code:
With Sheets("Persönliche D")
     .Range("B2:P17").UnMerge
    .Range("B2:P17").Sort Key1:=.Range("B2"), Order1:=xlAscending, MatchCase:=False
End With

Ich will nicht sortieren, ich will tauschen^^

(18.05.2024, 18:20)BoskoBiati schrieb: Hi,
Off topic
>interessant, dass es jemanden gibt, der das NATO-Alphabet noch kennt<
/Off topic

Fällt mir leichter als mir deutsche Namen auszudenken oder das deutsche Alphabet zu verwenden...
Antworten Top
#6
Option Explicite ist auch für "Profis" gut!
Damit werden schwer zu findende Fehler durch Schreibfehler und nichterklärte Variablen entdeckt. Lohnt sich immer!
Zu On Error:
On Error Resume Next' Fehlerbehandlung ein
Sheets("xyz").unprotect Password:="abc"
if Err.number>0 then' das Passwort passt nicht
  MsgBox "so gehts nicht"
  Exit sub 'resp. End
End If
On Error goto 0'damit ist die Fehlerbehandlung wieder aus.

Und ohne Select:

Code:
DTauschBereich1.Copy
        Range("B18").Select
            ActiveSheet.Paste

wird dann zu

Code:
DTauschBereich1.Copy Destination:=Range("B18")
Gruß der AlteDresdner (Win11, Off2021)
[-] Folgende(r) 1 Nutzer sagt Danke an AlterDresdner für diesen Beitrag:
  • Sabotaz
Antworten Top
#7
Vielen Dank!

Jetzt wird einiges klarer! Interessante Kniffe, die man denke ich nicht mit Makro aufzeichnen lernen kann. Ich werde das umsetzen, aber erstmal möchte ich meinen ursprünglichen Code wegwerfen und einfach den benutzen:

Code:
Sub SwapRanges()
    Dim rng1 As Range
    Dim rng2 As Range
    Dim temp As Variant
   
    ' Set the ranges
    Set rng1 = Range("B1:B51")
    Set rng2 = Range("C1:C51")
   
    ' Swap the values
    temp = rng1.Value
    rng1.Value = rng2.Value
    rng2.Value = temp
End Sub

Der tauscht sehr schnell die Bereiche aus. Kannte ich noch nicht, ich hatte ursprünglich einen expliziten Befehl zum Tauschen erwartet, aber wenn es so funktioniert, dann ist das perfekt!
Antworten Top
#8
Hallo,

Code:
Sub Makro1()
  Range("B1:B51").Cut
  Range("D1:D51").Insert
End Sub

Gruß, Uwe
Antworten Top
#9
Moin!
Noch eine Erweiterung zur Aussage von @AlterDresdner:
(18.05.2024, 19:26)AlterDresdner schrieb: Option Explicite ist auch für "Profis" gut!
Damit werden schwer zu findende Fehler durch Schreibfehler und nichterklärte Variablen entdeckt. Lohnt sich immer!
Eine extrem wertvolle Hilfe beim Schreiben von Code mit gesetzter Option ist die verfügbare Intellisense!
Ich setze eine String-Variable mittels
Dim XylophonInstrument$
Den eigentlichen Code schreibe ich grundsätzlich in Kleinbuchstaben.
Der Editor korrigiert das, wenn er die Schlüsselwörter, Konstanten und Variablen erkennt.

Oops, wie war das gleich?
Habe ich XylophonInstrument mit ph oder f geschrieben?
Lösung:
Ich tippe xy und drücke Strg+Leertaste
VBA erkennt, dass nur die Variable XylophonInstrument mit xy beginnt und ergänzt den Variablennamen (korrekt mit Großbuchstaben).

Gebe ich nur x ein und drücke Strg+Leertaste, erscheint ein Dropdown mit Methoden, Eigenschaften und Variablen.
Diese wird kontextbezogen gefiltert.
   
Hilft noch nicht weiter, weil hier erst die ganzen xl-Konstanten erscheinen.
Also füge ich y hinzu und die Dropdownliste springt zum Ziel:
   
Durch Tabulatortaste wird die Variable übernommen.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Sabotaz
Antworten Top
#10
Da schreibe ich mir einen Wolf und hätte doch einfach nur einen Link setzen brauchen …
https://www.online-excel.de/excel/singsel_vba.php?f=4
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top


Gehe zu:


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