Blue Moon Fans

Plauderecke - Excelfrage

erml - Fr 10 Nov, 2006 00:30
Titel: Excelfrage
Vielleicht kann mir jemand bei einem Excelproblem helfen:

Gegeben sei eine aufsteigend sortierte Liste, zB in Spalte A, mit ein paar hundert Einträgen.
Ich möchte folgendes erreichen: Ich schreibe in eine Zelle, egal welche, zB A1, einen Wert, der in der Liste vorkommt, und möchte nun, dass der Bildausschnitt auf den betreffenden Wert in der Liste verschoben wird, also dass automatisch an die richtige Stelle gescrollt wird.

Hat jemand eine Idee, wie man das realisieren könnte? Ich nehme an, dass ein Makro notwendig sein wird, in dem der Wert gesucht und angesprungen wird. Vielleicht gehts aber auch einfacher...

lg und danke schon mal
erml
Mobbi - Fr 10 Nov, 2006 01:39
Titel:
Da benötigst Du tatsächlich ein Makro. Wenn Du nur schnell an die Stelle gelangen willst, an welcher Dein gesuchter Eintrag zu finden ist, dann kannst Du auch über die Menü-Leiste den entsprechenden Eintrag suchen.
Spalte markieren --> Menüleiste: Bearbeiten --> Suchen --> Suchvariable/Name/was auch immer eingeben. (noch schneller ist der Befehl Strg+f --> macht das Gleiche)).

Willst das tatsächlich automatisieren, so wird das um einiges komplizierter. Da kann ich Dir auf die Schnelle auch nicht weiterhelfen.
Frog - Fr 10 Nov, 2006 09:56
Titel:
Du trägst im Code deiner Arbeitsmappe folgendes ein
Zitat:
Private Sub Workbook_Open()
Application.OnEntry = "Eingabe"
End Sub

Damit wird bei jeder Eingabe die Prozedur "Eingabe" aufgerufen.


Dann musst du noch ein Modul einfügen und dort folgende Prozeduren hineinkopieren
Zitat:
Sub Eingabe()
Call JumpTo(ActiveSheet.Cells(1, 2))
End Sub

Sub JumpTo(wert As Integer)
Dim c As Integer

With ActiveSheet.Range("a1:a500")
Set f = .Find(wert, LookIn:=xlValues)
r = Mid(f.Address(), 2, 1)
c = CInt(Right(f.Address(), Len(f.Address()) - 3)) - 1
rc = CStr(r) & CStr(c)
If Not f Is Nothing Then
Range(rc).Select
End If
End With

End Sub

Der Code ist natürlich nur rudimentär und ziemlich fehleranfällig, kann dir aber mal einen Startpunkt geben. Ich habe angenommen, dass sich die Zielwerte in deinem aktiven Blatt in der Spalte "A" befinden und die überwachte Zelle auf B1. Ein Problem ist, dass er bei jeder Änderung dort hinspringt. Das ließe sich umgehen, indem du den Wert von B1 noch in eine andere Zelle kopiert und nur dann springst, wenn die Werte von B1 und (sagen wir mal) C1 unterschiedlich sind. Die Zieladressermittlung ist auch nicht sonderlich elegant, aber mir ist auf die Schnelle nichts Besseres eingefallen. Das Problem war, dass er immer eine Zeile zu weit nach unten gesprungen ist und ich daher das um 1 nach oben korrigieren musste.
erml - Fr 10 Nov, 2006 15:26
Titel:
Danke für eure Anteilnahme Very Happy

Ich möchte diese Funktion tatsächlich automatisieren, und der Code mit Application.OnEntry erfüllt diesen Zweck perfekt.

Die Adressermittlung bereitet mir noch Kopfzerbrechen. Ich hab den Eindruck, dass das Programm je nach Lust und Laune mal so, mal anders rechnet. Einmal springt es in die richtige Zeile, dann wieder eine Zeile drunter, je nachdem, ob ich die Prozedur aus der Tabelle starte oder in Einzelschritten im VB-Fenster debugge.

Ein anderes Problem: Die Liste ist absteigend sortiert, wenn ich nun 40 suche, findet das Prog zuerst zB 940, das sollte doch durch den Zusatz LookAt:=xlWhole in der .Find-Methode zu lösen sein, dann liefert Find allerdings gar kein Resultat mehr...
Frog - Sa 11 Nov, 2006 15:26
Titel:
Hmmm... Ich habe es gerade mit LookAt:=xlWhole ausprobiert und da funktioniert es problemlos. Meine Liste habe ich von 260 bis 0 in 5er-Schritten absteigend sortiert in der Spalte A drin. Das Phänomen beim Debuggen habe ich jetzt mangels Zeit nicht probiert.

Verbesserung bei der Erkennung der Eingabe:
Zitat:
Sub Eingabe()
If ActiveSheet.Cells(1, 2) <> ActiveSheet.Cells(1, 3) Then
Call JumpTo(ActiveSheet.Cells(1, 2))
ActiveSheet.Cells(1, 3) = ActiveSheet.Cells(1, 2)
End If
End Sub


Verbesserung bei Find:
Zitat:
Set f = .Find(wert, LookIn:=xlValues, LookAt:=xlWhole)

Frog - Mo 13 Nov, 2006 07:21
Titel:
Das "Find" funktioniert bei Nicht-Integer-Werten offensichtlich nicht. Da ist eine eigene Suchroutine gefragt.
erml - Fr 17 Nov, 2006 13:22
Titel:
Bin jetzt wieder um einiges schlauer Very Happy :

Anstelle der Find-Funktion hab ich eine einfache Suchroutine eingefügt, ist ja bei einer sortierten Liste ganz einfach.

Zitat:
Sub JumpTo(wert As Variant)
Dim adr As String, i As Integer
i = 4
vglwert = ActiveSheet.Cells(i, 1)
While vglwert > wert
i = i + 1
vglwert = ActiveSheet.Cells(i, 1)
Wend
adr = "A" & CStr(i - 1)
Range(adr).Select
End Sub


Die Suche beginnt in Zelle A4, gesucht wird die Variable "wert".
Dass das Prog immer eine Zeile zu weit nach unten springt (deshalb i-1) liegt daran, dass nach der Bestätigung der Eingabe in die Suchzelle die Markierung immer eine Zelle nach unten wandert. Und das passiert dummerweise nach Durchlauf des Makros.

Danke für deine Hilfe, Frog Very Happy
Alle Zeiten sind GMT + 1 Stunde
Powered by phpBB2 Plus and Kostenloses Forum based on phpBB