2.7k Aufrufe
Gefragt in Tabellenkalkulation von tmpusr Einsteiger_in (25 Punkte)
Hallo allerseits,

ich möchte gerne in die Zwischenablage kopierte Werte in Spalte B einer Excel Tabelle (MS Excel 2003) suchen, und:

1) bei Nichtvorhandensein in die nächste frei Zelle kopieren, oder
2) bei Vorhandensein den doppelten Wert anspringen / selektieren.

Teil 1 bekomme ich bereits hin. Bei Teil 2 kann ich zwar den doppelten Eintrag - wenn vorhanden - nach dem Einfügen gleich wieder löschen, jedoch den doppelt gefundenen Eintrag zu selektieren bekomme ich einfach nicht hin.
Hier mal der bisherige Makro-Code:
---
Range("B65536").End(xlUp).Offset(1, 0).Select
If Application.WorksheetFunction.CountIf(Range("B:B"), Range("B65536").End(xlUp)) > 1 _
Then Selection.ClearContents
---
Das kann doch kein Hexenwerk sein. Bitte helft mir blindem Huhn!

Ganz liebe Grüße

Karl

8 Antworten

0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Karl,

schreibe anstelle ClearContents dieses: Select

Bis später,
Karin
0 Punkte
Beantwortet von tmpusr Einsteiger_in (25 Punkte)
Hi Karin,

vielen Dank für die schnelle Antwort!

Wenn ich das richtig sehe, würde die letzte Zeile dann so aussehen:
---
Then Selection.Select
---
was ich auch schonmal probiert hatte. Das Ergebnis ist, dass sich daraufhin - im Gegensatz zu vorher - Mehrfacheinträge untereinander erzeugen lassen.
Die letzte Zeile soll ja temporär nur verhindern, dass doppelte Einträge überhaupt erzeugt werden können, indem es den Content der selektierten Zelle (also da wo ich die Zwischenablage einfüge) wieder leert.

Sorry, aber das haut so leider nicht hin :(

Liebe Grüße

Karl
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

aus deinem Codeschnipsel kann man leider absolut nichts entnehmen was du da eigentlich machen willt. Warum müssen Daten überhaupt erst doppelt eingetragen werden, wenn sie sowieso wieder gelöscht werden? Man kann doch vorher prüfen ob ein Wert schon vorhanden ist und wenn ja - ihn gar nicht erst ein weiteres Mal eintragen.

Bis später,
Karin
0 Punkte
Beantwortet von tmpusr Einsteiger_in (25 Punkte)
Huhu,

zunächst tut es mir leid, dass ich mich für die erste Frage in einem Forum etwas unbeholfen anstelle.

Ich fasse daher zusammen.

Der oben stehende Makro-Code ist tatsächlich nur ein Snippet.
Der unten stehende Code ist in einem Modul eingefügt (und z. B. mit einer Tastenkombination belegt) voll einsatzfähig.

Der Code soll genau Folgendes tun:
---
'Selektiere (von unten her gesehen) die erste unbeschriebene Zelle in Spalte B.
Range("B65536").End(xlUp).Offset(1, 0).Select
'Füge den Inhalt der Zwischenablage in unformatierter Textform ein.
ActiveSheet.PasteSpecial Format:="Text", Link:=False, _
DisplayAsIcon:=False
'Wenn der eingefügte Inhalt (von der Selektierung nach oben gesehen) doppelt vorkommen sollte
If Application.WorksheetFunction.CountIf(Range("B:B"), Range("B65536").End(xlUp)) > 1 _
'Dann lösche den eingefügten Inhalt wieder
Then Selection.ClearContents
---

Statt dem letzten Teil würde ich gerne zu dem doppelt gefundenen Eintrag (irgendwo darüber in Spalte B) springen, sprich den Doppeleintrag selektieren.

Ich meine nur schon bis hierhin gekommen zu sein, nicht das dieser Code das Beste ist was es hierzu gibt. Sicherlich gibt es geschmeidigere (aber vielleicht nicht unbedingt performantere) Ansätze hierzu.

Da ich jedoch stagniere, wende ich mich an Euch. Bitte bewaffnet mich mit besserem Code.

Liebe Grüße

Karl
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Karl,

jeder hat mal mit einer ersten Frage angefangen und es ist noch kein Meister vom Himmel egfallen :-)
Dieser Tipp sollte dir für die Zukunft helfen: denke bei der Beschreibung eines Problems immer daran, dass nur du ganz allein deine Arbeitsmappe kennst und nur du weißt, was du erreichen willst. Je besser deine Beschreibung für einen Außenstehenden nachvollziehbar ist, desto einfacher ist es, eine konkrete Antwort zu geben.

Versuche es mal mit diesem (ergänzten) Code:
Dim raZelle As Range
'Selektiere (von unten her gesehen) die erste unbeschriebene Zelle in Spalte B.
Range("B65536").End(xlUp).Offset(1, 0).Select
'Füge den Inhalt der Zwischenablage in unformatierter Textform ein.
ActiveSheet.PasteSpecial Format:="Text", Link:=False, _
DisplayAsIcon:=False
'Wenn der eingefügte Inhalt (von der Selektierung nach oben gesehen) doppelt vorkommen sollte
If Application.WorksheetFunction.CountIf(Range("B:B"), Range("B65536").End(xlUp)) > 1 Then
' ersten vorhandenen Eintrag in Spalte B suchen, genaue Übereinstimmung
Set raZelle = Columns("B:B").Find(Selection, lookat:=xlWhole)
' gefundene Zelle selektieren
raZelle.Select
End If
' letzten Eintrag (Inhalt) löschen
Range("B65536").End(xlUp).ClearContents
' Variable leeren
Set raZelle = Nothing

Bis später,
Karin
0 Punkte
Beantwortet von tmpusr Einsteiger_in (25 Punkte)
Hallo Karin,

vielen herzlichen Dank für Deine Mühen!

Dein aktueller Code springt zwar nach wie vor die letzte freie Zelle in Spalte B an,
fügt daraufhin einen Wert ein und löscht ihn jedoch kurz darauf wieder - egal ob er doppelt vorkommt oder nicht. Der Fokus bleibt jedoch leider auf der letzten freien aktiven Zelle :(

Liebe Grüße

Karl
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Karl,

angenommen in B1:B9 stehen folgende Angaben:

a
s
d
f
g
Selektiere
i
j
k

Jetzt markiere ich in deinem Beitrag vom 10.05.10 14:10 das Wort "Selektiere", kopiere es mit Strg+C (füge es somit in die Zwischenablage ein) und führe dann den von mir geposteten Code im Einzelschrittmodus aus. Dabei sehe ich, dass das Wort "Selektiere" in Zelle B10 eingetragen wird, anschließend springt der Cursor in Zelle B6 (wo das erste Mal "Selektiere" steht) und danach wird B10 wieder geleert - das ist genau das was ich deiner Beschreibung entnommen habe.

Bis später,
Karin
0 Punkte
Beantwortet von tmpusr Einsteiger_in (25 Punkte)
Karin,

ich falle Dir gleich um den Hals! Ich DANKE Dir tausendfach!!!

Du hast völlig Recht. Ich habe Deinen angepassten Code in eine neue Excel-Tabelle eingefügt und siehe da - hier funktioniert die Selektierung wunderbar.

In meiner existierenden Tabelle verhielt es sich nach wie vor exakt wie im Beitrag vom 11.05.2010, 12:51 Uhr beschrieben. Seltsam!

Allerdings konnte ich keine neuen Einträge mehr hinzufügen, sollten sie nicht bereits vorhanden sein, da alle neuen Einträge die hinzu kamen gleich wieder gelöscht werden.
Hierzu stellte ich Deinen Code etwas um, sodass es final so ausieht:
---
Sub PasteIrgendwas()

Dim raZelle As Range
Range("B65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.PasteSpecial Format:="Text", Link:=False, _
DisplayAsIcon:=False
If Application.WorksheetFunction.CountIf(Range("B:B"), Range("B65536").End(xlUp)) > 1 Then
Set raZelle = Columns("B:B").Find(Selection, lookat:=xlWhole)
Range("B65536").End(xlUp).ClearContents
raZelle.Select
End If
Set raZelle = Nothing

End Sub
---
Darüber hinaus wird Zeile 1 nicht berücksichtigt. Ich könnte also in deinem vorhergehenden Beispiel nicht 'a' selektieren. Dies ist in meinem konkreten Falle jedoch egal, da in Zeile 1 bei mir eine Überschrift tront, welche nicht berücksichtigt werden muss.

Als ich den Code dann als neues Modul verpackt mein altes Modul ersetzen ließ, funktionierte es auch in meiner produktiven Tabelle - HURRA!

Ich bin Dir echt sowas von super dankbar, dass Du mir so fleißig beigestanden hast!

Liebe Grüße

Karl
...