Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

excel

excel
16.07.2020 19:59:00
Jörg
Hallo,
habe eine komplexe Kalkulationstabelle mit sehr vielen numerischen Eingabefeldern.
Und auch sehr vielen Dropdownauswahlisten direkt im Sheet.
Die Dropdowns werden werden über Selection_Change aufgerufen und der Inhalt dann jeweils
über Macros berechnet und befüllt
Wenn ich nun mit den Pfeiltasten mich im sheet hoch, runter, links und rechts bewege, bleibe ich an den Dropdowns - Zellen "hängen" bis diese geladen sind, das dauert immer ca. 0,1 bis 0,9 sec je nach dem.
Das Navigieren im sheet über die Pfeiltasten ist deshalb zäh wie Honig.
Das Problem habe ich in den simplen Code übersetzt mit einem Lösungsansatz der aber nicht funktioniert.
'------------------------
' im Worksheet
' damit wird das Navigieren mit den Pfeiltasten sehr zäh
' -----------------------

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i
For i = 1 To  3000
If ArrowKeyPress Then Exit For   ' sollte den "Ladevorgang" abbrechen
[a1] = i
Next
End Sub

'------ in Modul
'------ funktioniert aber nicht

Private Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Long) As Integer
Private Const VK_LEFT = &H25 ' Linke Pfeiltaste
Private Const VK_UP = &H26 ' Obere Pfeiltaste
Private Const VK_RIGHT = &H27 ' Rechte Pfeiltaste
Private Const VK_DOWN = &H28 ' Untere Pfeiltaste


Public Function ArrowKeyPress() As Boolean
' funktioniert so nicht
' If GetAsyncKeyState(VK_UP)   0 Then ArrowKeyPress = True
End Function

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
VBA gut ? Sicher ?
16.07.2020 20:07:31
onur
"Die Dropdowns werden werden über Selection_Change aufgerufen" - und du wunderst dich, dass alles so langsam ist?
For i = 1 To 3000 ?
AW: excel Tastaturabfrage während Code läuft
16.07.2020 22:20:36
Jörg
Die Tabelle ist 9 MB gross, kann ich schlecht hochladen.
Das hier ist in der Tat nur ein sinnloser aber möglichst kurzer Beispielcode der nur das Problem aufzeigen soll. Mit dieser Schleife im selection change wird das navigieren mit den Pfeiltasten im sheet zäh.
Wenn man aber während die Schleife läuft durch drücken einer Pfeiltaste mit einer Function wie "ArrowKeyPress" rausspringen könnte, würde man wieder flüssig(er) mit den Pfeiltasten durchs sheet navigieren können. Wenn ich nur über die Zelle drübermuss zur übernächsten intressiert mich ja
das Dropdownmenue dieser Zelle im Moment gar nicht nicht.
Anzeige
AW: excel Tastaturabfrage während Code läuft
16.07.2020 23:19:25
Daniel
Hi
Besser wäre es zu überlegen, wann die Dropdowns wirklich befüllt werden müssen
Gruß Daniel
AW: excel
17.07.2020 08:59:27
Daniel
Hi
man könnte ausnutzen, dass beim Benutzen der Cursortasten der Zeilen- und Spaltenabstand zwischen alter und neuer Zelle immer 1 ist.
Dh wenn man sich die zuletzt selektierte Zelle statisch merkt, kann man diesen Vergleich machen um das festzustellen.
der Code kann natürlich nicht erkennen, wenn du mit der Maus die Nachbarzelle anklickst:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Static rngAlt As Range
If rngAlt Is Nothing Then Set rngAlt = ActiveCell
If Abs(Target.Row - rngAlt.Row) + Abs(Target.Column - rngAlt.Column)  1 Then
'--- hier der Code zum Befüllen
End If
Set rngAlt = Target(1)
End Sub
Gruß Daniel
Anzeige
AW: excel
17.07.2020 09:35:41
Jörg
Hallo Daniel, danke für die Idee
die Tabelle hat hinter und vor den Eingabezellen und Dropdownzellen immer jede Menge ausgeblendete Zellen. Bei den Spalten hat der Abstand einen Rythmus da könnte die Idee Sinn machen aber die abgeblendeten Zeilenzahlen sind sehr unterschiedlich.
Anfänglich arbeite ich beim Kalkulieren ja auch meist mit der Maus und die numerischen Zahlen kommen von einem Digitalisierungsbrett über "keysend" was prima funktioniert. Da ist das Problem nicht wirklich relevant.
Danach aber, Feintuning, Prüfung, mehrfache Überarbeitung da liegt meine Hand auf dem Tastaturblock da will man nicht gerne ständig zur Maus greifen.
Meine Idee dass wenn im Tastaturpuffer noch ein Pfeil hoch runter links rechts ansteht,
wird die Dropbox erst gar nicht geladen bzw der Ladevorgang abgebrochen.
Dies erscheint mir von der Logik bis jetzt immernoch am Besten.
Anzeige
AW: excel
17.07.2020 10:13:01
Daniel
Ja, hat nur ein Problem, VBA kann das nicht.
Die Frage wäre, müssen die DropDowns bei jedem SelectionChange neu berechnet werden?
Wenn nein, wann müssen sie neu berechnet werden? Vielleicht kann man das ja günstiger gestalten und das nur durchführen, wenn notwendig.
Dann gäbs immer noch die Option, die Events zu deaktivieren (Entwurfsmodus), wenn solche Arbeiten anstehen.
Gruß Daniel
Excel Tastaturabfrage während Code läuft
17.07.2020 11:25:36
Jörg
Hi,
Event abzuschalten ist keine gute Idee.
Wenn ich die Listbox sehen will ( ein prüfender Blick ob alles auch wirklich so passt ), navigiere ich mit der Pfeiltaste kurz auf die Zelle dann muss sie ja sofort aufgehen,
wenn ich aber nur drüber will, also im Tastaturpuffer nochmal ein weiter Pfeil "links" in der Schlange ansteht macht ja das Warten auf die Listbox steht keinen sinn. Denn dann blitzt die sowieso nur auf und zu.
Userbild
Anzeige
AW: Excel Tastaturabfrage während Code läuft
17.07.2020 11:50:36
Luschi
Hallo jörg,
Events/Ereignisse müssen doch erst ausgelöst werden, wenn bestimmte Zellen selektiert werden.
Und ob eine Gültigkeitsliste davon betroffen ist, kann man mit INTERSECT sehr gut abfassen.
Alles Andere ist totaler Quatsch - bei jede Zellpositionierung x-Schleifen zu durchlaufen, ist kein durchdachtes Konzept.
Gruß von Luschi
aus klein-Paris
AW: Excel Tastaturabfrage während Code läuft
20.07.2020 10:20:53
Jörg
Hallo Luschi,
das tut es auch nicht in der echten Kalkulationstabelle.
Dies war nur ein möglichst simpler Code.
Allerdings hat fast jede sichtbare Zeile in 7 Spalten eine Listbox,
auch nur in diesen Zellen starten die Schleifen ...
Wenn man in einer diese spalten senkrecht fährt, dann ist es fast jede,
horizontal ist es jede dritte.
Gruß jo
Anzeige
AW: Excel Tastaturabfr whrd Code läuft - geht!
17.07.2020 12:12:38
Daniel
Hi
ich habe jetzt mal prinzipiell sowas hingezimmert, das das gewünschte Verhalten zeigt.
man kann nämlich mit DoEvents ein laufendes Makro kurz unterbrechen, um zu schauen was zwischenzeitlich in Excel so passiert ist und anfallende Events sofort auszuführen und nicht erst, wenn das Makro durchgelaufen ist.
Damit kann man dann auch ein laufendes Makro anhalten.
im Modul des Tabellenblatts dieser Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Anhalten = True
Application.OnTime Now, "MarkroStarten"
End Sub
in einem allgemeinen Modul dann diese beiden, das zweite ist die Schleife zum erstellen der Listbox.
Option Explicit
Public Anhalten As Boolean
Sub MarkroStarten()
Anhalten = False
Application.OnTime Now, "ListboxFüllen"
End Sub
Sub ListboxFüllen()
Dim t As Double
t = Timer + 1
Do While Timer 
das zweite Makro ist dann dein Arbeitsmakro.
hier kannst du dann anstelle der Timer-Schleife mit Do_Loop (hab ich eingebaut, um eine definierte Wartezeit zu bekommen) deine Arbeitsschleife einstellen.
Wichtig ist, dass das DoEvents und das IF...Exit Sub innerhalb dieser Schleife vorkommt.
beim schnellen durchklicken erscheint keine Messagebox, erst wenn du länger als die Wartezeit auf der Zelle bleibst wird sie angezeigt, also so wie gewünscht.
Gruß Daniel
Anzeige
AW: Excel Tastaturabfr whrd Code läuft - geht!
17.07.2020 23:58:56
Jörg
Hi
super .... hab es getestet ... es funktioniert ! Danke !
Habe dazugelernt ! .... dann hat mich dein Vorschlag auf diesen Lösungsansatz gebracht.
Gibt es einen funktionalen Unterschied ?

Dim AnhaltenA As String
Dim AnhaltenB As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
AnhaltenB = AnhaltenA
ListboxFüllen
AnhaltenA = Target.Row & Target.Column
End Sub
Sub ListboxFüllen()
Dim i
For i = 1 To 9999
'Schleife zum befüllen
DoEvents
If AnhaltenA  AnhaltenB Then Exit Sub
Cells(ActiveCell.Row, ActiveCell.Column) = i
Next i
End Sub

Anzeige
AW: Excel Tastaturabfr whrd Code läuft - geht!
18.07.2020 11:18:43
Daniel
Hi
Der funktionale Unterschied ist, dass per OnTime aufgerufen Makros erst dann starten, wenn das aufrufende Makro und alle weiteren anstehenden VBA-Prozesse vollständig beendet wurden.
Direkt aufgerufene Makros starten sofort, als wären sie Teil des aufrufenden Makros.
Meine Befürchtung war, dass so die Änderung der Globalen Variablen nicht richtig erkannt wird. Das ist aber falsch wie deine Umsetzung zeigt.
Was allerdings zum Problem werden könnte ist folgendens:
Wenn du schnell hintereinander mehrere Zellen selektiert, kann wie bei einem rekursiven Selbstaufruf das zuerst gestartete Makro erst weiter ausgeführt werden, wenn das zweite Makro und alle nachfolgenden auch beendet wurden.
Du bekommst also eine wachsende Reihe von aufgerufenen Makros, die darauf warten weiter laufen zu können.
Die Variableninhalte dieser Makros werden in der Zwischenzeit im Stapelspeicher hinterlegt, damit der richtige Wert verwendet wird, wenn das jeweilige Makro wieder dran ist.
Dieser Stapelspeicher könnte irgendwann vollaufen und zu einem Fehlerabbruch führen.
Das sollte aber nur dann zum Problem werden, wenn du sehr viele Zellen direkt hintereinander abfährst und die Variablen in deinem Makro viel Platz benötigen, so dass der Stapelspeicher schnell volläuft.
Gruß Daniel
Anzeige
AW: Excel Tastaturabfr whrd Code läuft - geht!
20.07.2020 10:07:59
Jörg
Hi Daniel
leider funktioniert weder die Ontime- noch die globale Varaiblenvariante in meiner Kalkulationstabelle. Beim Navigieren mit den Pfeiltasten zeigen beide Varianten den gleichen Fehler: Oft bleibt die Listbox sichtbar mit den korrekten Daten an einer Zelle zurück welche bereits verlassen wurde, die selektierte Zelle ist bereits 3 oder 4 weiter....
Das Modul welche die Listbox erzeugt ist relativ komplex mehr als 4.000 Zeilen. Viele Subs, welche untereinander mit globalen Variablen und Arrays kommunizieren. Eigentlich sind es 4 bis 35 Textshapes welche alle pixelgenau berechnet an der "Selektierten Zelle" andocken und eine ActivXListbox, welche dann jeweils über .onAction die zugehörige Teilauswahlmöglichkeiten des Textshapes anzeigt. Ist eine Art interkative logisch verknüpfte Baumstruktur über die Listbox gesteuert. Dabei werden u.a. 4 oder 5 Tabellenblöcke mit je ca. 6000 Zellen blockweise in Arrays geladen und ausgewertet. Das ganze ist sehr ausgefeilt geschwindigkeitsoptimiert programmiert. Trotz das auch noch Farben und Textbreiten berechnet werden, benötigt das bis zur Anzeige
nur 0,03 bis 0,5 sec.
Sind es die globalen Variablen die hier nicht mehr korrekt zusammenspielen,
wenn Prozesse sich überlagern ?
Sowohl die DoEvents, wie auch OnTime bremst etwas ... stiehlt mir ca. 0,1 sec, und erzeugt
ein flackern am Cursor.
Gruß jo
Anzeige
AW: Excel Tastaturabfr whrd Code läuft - geht!
20.07.2020 10:14:39
peterk
Hallo Jo
Hast Du Dir mein Beispiel einmal angeschaut?
Peter
AW: Excel Tastaturabfr whrd Code läuft - geht!
20.07.2020 10:34:27
Jörg
Hi Peterk
Sorry hatte ich übersehen.
Auf den ersten Blick könnte das funktionieren, da es den Ladevorgang erst gar nicht startet und in folge auch keine Probleme durch einen "Sub Exit" auftauchen können.
Muss ich mal in meine Tabelle einbauen.
Allerdings sollte ich jetzt mal produktiv arbeiten.
Vielleicht schaff ich einen Test heute Nacht.
Rückmeldung kommt.
Danke !
jo
AW: Excel Tastaturabfr whrd Code läuft - geht!
21.07.2020 10:29:13
Jörg
Hallo Peter,
ja super, das funktioniert einwandfrei ! Danke !
Noch eine Frage kann man den Tastaturpuffer leeren ?
Wenn man etwas zu langsam ist und die Listbox befüllt sich und wird sichtbar
und man drückt zeitgleich auf die Tasten, springt man danach dann über Ziel hinaus, da im Tasturpuffer dann 2.. 3 oder 4 "Pfeil links" anstehen. Nach dem schließen der Listbox müsste eigentlich der Puffer geleert werden wenn mehr als 1 Tastendruck ansteht.
Mir sind deswegen schon Eingabefehler passiert, da ich Zahlen ins falsche Feld eingetippt habe.
Andere Mitarbeiter haben's glücklicherweise gemerkt.. .war ein 50.000,- Fehler.
Gruß jo
AW: Excel Tastaturabfr whrd Code läuft - geht!
21.07.2020 13:19:34
peterk
Hallo Jo
Ich kenne leider keinen Weg :-(
AW: Excel Tastaturabfr whrd Code läuft - geht!
20.07.2020 10:46:52
Daniel
sorry, das ist mir zu komplex.
da brauchst du wahrscheinlich einen Profi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige