Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
540to544
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
540to544
540to544
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Application.Sendkeys schreibt in falsches Blatt

Application.Sendkeys schreibt in falsches Blatt
02.01.2005 18:08:55
Niels
Hallo VBA-Könner!
Ich hatte mein Problem schon in ähnlicherer Form am 02.01.05 um 00:13:02 beschrieben.
Sämtliche Lösungsvorschläge haben jedoch nicht funktioniert.
Ich habe nun das Programm weiter vereinfacht, es steht nur hier zum Download unter dem Dateinamen "15511.xls" bereit, damit Ihr es diesmal leicht selber ausprobieren könnt.
Hier ist das nicht wie gewünscht funktionierende VBA-Programm:

Sub Test()
Sheets("Tabelle1").Activate
Range("A1").Activate
Application.SendKeys "1" + "{RETURN}"
Rem Exit Sub
Sheets("Tabelle2").Activate
Range("A2").Activate
End Sub

Die Arbeitsmappe besteht aus den Blättern "Tabelle1" und "Tabelle2" sosie dem obigem VBA-Code. Beide Blätter sind vollkommen leer.
Das Programm aktiviert das Blatt Tabelle1 und anschließend die Zelle A1.
Application.SendKeys soll nun eine 1 in diese Zelle schreiben.
Anschließend wird die Tabelle2 aktiviert und dort die Zelle A2.
Leider macht das Programm nicht das, was ich will, denn die 1 wird in die Zelle A2 des Blattes Tabelle2 geschrieben.
Der Tastaturpuffer wird also anscheinend zu spät ausgelesen. (erst nach Programm-Ablauf ?)
Wird das Programm nach Application.SendKeys mit Exit

Sub abgebrochen, so steht die 1 wie gewünscht in Zelle A1 der Tabelle1.
Ich bin kein VBA-Anfänger sondern babe schon über 5000 Zeilen in VBA programmiert. Mir ist also absolut klar, das ich die 1 auch einfacher in die Zelle A1 der Tabelle1 bekommen kann, z.B, mir Range("A1")="1". Dies ist jedoch nur ein Beispiel um ein Problem zu zeigen, was ich in gleicher Form in einem komlexen Programm habe.
Wer ist ein echter VBA-Könner und hat eine Lösung unter Verwendung der SendKeys Anweisung?
Bitte probiert eure Lösung, bitte nach Möglichkeit vorher aus, den nicht funktionierende Vorschläge habe ich schon genug.
Danke.

		
AW: Application.Sendkeys schreibt in falsches Bla
02.01.2005 18:19:10
Matthias
Hallo Niels,
gib dem Rechner mit DoEvents Zeit, den Befehl auch abzuarbeiten:
Sub Test()
Sheets("Tabelle1").Activate
Range("A1").Activate
Application.SendKeys "1" + "{RETURN}"
DoEvents
Rem Exit Sub
Sheets("Tabelle2").Activate
Range("A2").Activate
End Sub
Gruß Matthias
Danke Matthias G. - Problem gelöst !!!
02.01.2005 18:36:49
Niels
Danke Matthias für Deine schnelle Lösung.
Sie funktionniert!!!
Du hast es drauf!
Den Befehl DoEvents kannte ich noch nicht. Man lernt nie aus.
Nochmals vielen Dank, ich habe mich schon viele Stunden mit dem Problem gequält!
Grüsse
Niels F.
AW: Danke Matthias G. - Problem gelöst !!!
02.01.2005 18:42:58
Matthias
Hallo Niels,
Danke für die Rückmeldung!
DoEvents verwendet man z.B. auch, wenn man ein nichtmodales UserForm (ShowModal = False) anzeigen und das Makro anschließend weiterarbeiten lassen will (z.B. ein Bitte warten-Fenster). So ist gewährleistet, dass das Userform komplett gezeichnet wird und nicht nur ein weißes Fenster erscheint.
Viele Grüße,
Matthias
Anzeige
AW: Danke Matthias G. - Problem gelöst !!!
Ramses
Hallo Matthias
"Do Events" ist meines Erachtens völlig überflüssig, vor allem danach.
Application.SendKeys "1" + "{RETURN}", True
Und Excel wartet automatisch bis die gesamte Zeichenfolge übergeben ist.
Gruss Rainer
AW: Danke Matthias G. - Problem gelöst !!!
02.01.2005 19:00:42
Matthias
Hallo Rainer,
Excel wartet vielleicht, bis die Zeichenfolge übergeben ist, aber scheinbar nicht mit dem Auslesen...
Jedenfalls funktioniert das Makro mit Sendkeys "....",TRUE nicht, nur mit DoEvents.
Gruß Matthias
AW: Danke Matthias G. - Problem gelöst !!!
Ramses
Hallo
Du hast recht, ich habe das Makro nicht getestet.
Die 1 taucht dann in der Tabelle2 auf
Anyway,... ich bleibe dabei:
Dafür ist "SendKeys" definitiv nicht zu gebrauchen, ebenso wie die ganze "Aktivierung" völlig unnötig ist.
5000 Zeilen Code hin oder her ... ;-))
Gruss Rainer
Anzeige
AW: Danke Matthias G. - Problem gelöst !!!
02.01.2005 19:18:26
Matthias
Hallo Rainer,
naja dafür freilich nicht, ich warte ja auch noch auf Niels' Mitteilung des eigentlichen Problems...
:-)
Gruß Matthias
Eigentliches Problem !!! Streitet euch nicht !!!
02.01.2005 21:03:27
Niels
Hallo Ihr VBA-Könner und Möchtegern-Könner!
Steitet euch nicht!
Die eigentliche Anwendung ist kommerziell und über 1000 Zeilen lang und kann deshalb nicht veröffentlicht werden.
Ich habe mir nun aber 90 Minuten Zeit genommen um eine kleine Anwendung zu schreiben, die einem Teilbereich der kommerziellen Anwendung sehr ählich ist und das Problem verdeutlicht. (Datei: 15518.xls steht zum Download bereit)
Es geht um eine Artikelverwaltung, in welcher der Benutzer in einer Artikel-Gruppenliste sich mit der Cursor-Up und der Cursor-Down-Taste bewegen kann.
Die entsprechenden Artikel aus einer Artikelliste werden dann automatisch angezeigt.
Mit der Ende Taste springt das Programm dann auf den ersten Artikel der Artikel-Gruppe.
Hier geht das Originalprogramm dann weiter, wo man dann zum Beispiel den Einkaufspreis, den Lieferanten usw. einsehen kann oder zum Beispiel einen Verkaufsauftrag genenieren kann.
Die Excel-Tabelle muß mit Makros aktivieren gestartet werden, damit das Programm funktioniert!!! Ist aber garantiert virenfrei!
Mein Grundproblem war also, wie ich in einer gefilterten Liste auf den ersten oder z.B den lezten gefilterten Datensatz springen kann.
Ich Finde den Befehl
Application.SendKeys "{DOWN}"
dafür ziemlich kurz (1 Befehl).
Wer mit nur einer Befehlszeile auf den ersten gefilterten Artikel springen kann, soll hier bitte posten.
Also Ihr VBA-Könner und Möchtegern-Könner: Wer kann es ohne SendKeys mit nur einem Befehl!!!
Meinetwegen könnt Ihr auch Lösungen posten die mit bis zu 10 Zeilen auskommen, nur damit ich mal sehen kann, wie es auch ohne SendKeys geht.
Matthias nochmals vielen Dank, Du hast mir sehr geholfen.
Viele Grüsse
Niels
Anzeige
AW: Eigentliches Problem !!! Streitet euch nicht !
Ramses
Hallo

Sub test()
'Dein Datenbereich geht von A2:A10
Debug.Print Range("A2:A10").SpecialCells(xlCellTypeVisible).Address
End Sub

Darauf kann ich alle Range-Methoden anwenden ;-)
Ich behaupte weiterhin, dass SendKeys nicht nötig ist.
Herzliche Grüsse vom Möchtegern-Könner
Rainer
AW: Eigentliches Problem !!! Streitet euch nicht !!!
PeterW
Hallo Niels,
ein Streit in der Sache ist immer okay - und um nichts anderes geht es hier. ;-)
Wenn du kommerziellen Code schreibst erwartest du bestimmt von mir als Möchtegern-Kenner nicht, dass ich den Link zur Datei zusammenbastele und mich möglicherweise durch etliche Makros und Funktionen durcharbeite.
Obwohl ich den Eindruck habe, dass Excel hier als Datenbankprogramm missbraucht werden soll lassen sich die beschrieben Aufgaben recht komfortabel über Userforms realisieren. Damit ist es auf jeden Fall nicht nötig, in der Mappe etwas zu aktivieren, SendKeys zu benutzen und hin und her zu hüpfen. Statt auf den ersten gefilterten Artikel zu springen ließe sich beispielsweise über das Filterkriterium eine Listbox füllen und der erste Eintrag auswählen. Und für den Fall, dass es sich um größere Datenmengen handelt lassen sich diese, wie dir bestimmt bekannt ist, in Arrays recht flott ver- bzw. bearbeiten.
Nichts für ungut, du hast ja inzwischen, was du willst.
Gruß
Peter
Anzeige
AW: Eigentliches Problem !!! Streitet euch nicht !
02.01.2005 21:43:49
Matthias
Hallo Niels,
ich hatte und habe eigentlich nicht den Eindruck, dass wir uns gestritten haben.
Man diskutiert halt ein wenig...
Und dass du - indirekt - Rainer als "Möchtegern-Könner" bezeichnest, verzeih' ich dir deshalb, weil du recht selten im Forum bist.
Und Rainer nimmt es dir sicher auch nicht übel :-)
Viele Grüße,
Matthias
AW: Eigentliches Problem !!! Streitet euch nicht !
02.01.2005 22:19:51
Niels
Hallo Matthias!
Ich habe Rainer nicht als Möchtegern-Könner bezeichnet.
Das war lediglich eine provokative allgemeine Anrede.
Ich hoffe Ihr versteht Spass!
Ich habe diese Anrede gewählt, weil bei meinem vorherigen Posting vom 02.01.05 00:13:02
eine Menge absolut unbrauchbare Lösungen dabei waren, die einfach falsch wareen.
Außerdem bin ich überrascht, daß von einigen hier die sendkeys Anweisung wie Gift gemieden wird.
Ich bin kein Programmierer!!!
Ich habe lediglich den ganzen Tag mit Excel zu tun und habe mir für meine Firma ein Programm geschrieben um es selbst zu nutzen, aber nicht um es zu verkaufen.
Mein Beispielprogramm steht unter:
https://www.herber.de/bbs/user/15518.xls
zur Einsicht zur Verfügung.
Ich kannte dieses Forum bisher nicht, werde es in Zukunft aber sicherlich häufiger nutzen
wenn ich Probleme habe, aber natürlich auch um anderen zu helfen.
Du hast mich gebeten, das eigentliche Problem zu schildern.
Das habe ich getan. - Und das hat mich 90 Minuten meiner Zeit gekostet.
Ist aber Ok, da ich durch das Forum zu einer Lösung meines Problemes gekommen bin.
Ich wollte euch ja nicht auf die Folter spannen, nachdem so eine rege Beteiligung entstanden ist.
Einen kurzen Programmcode, der ohne die Sendkeys-Anweisung in meiner Beispiel-Anwendung die Zelle mit dem ersten gefilterten Artikel aktiviert und die Procedure Ende-Taste() ersetzt habe ich aber bisher nicht bekommen.
Also zurück zur sachlichen Diskussion.
Herzliche Grüsse auch an Rainer
Niels F.
Anzeige
AW: Eigentliches Problem !!! Streitet euch nicht !
Ramses
Hallo
"...Also zurück zur sachlichen Diskussion...."
Ich wüsste nicht, dass wir etwas anderes getan hätten.
"...Einen kurzen Programmcode, der ohne die Sendkeys-Anweisung in meiner Beispiel-Anwendung die Zelle mit dem ersten gefilterten Artikel aktiviert ..."
Habe ich dir in meinem vorherigen Beitrag schon geschrieben
"...und die Procedure Ende-Taste() ersetzt habe ich aber bisher nicht bekommen..."
Diese Procedur wäre meines Erachtens gar nicht nötig, weil die ganzen "Application.Onkey" Anweisungen überflüssig sind.
Willst du es ausprobieren ?
Dann lösche die Auto-Open Procedur und kopiere den Code in die Tabelle deiner Beispiel-Tabelle. Nun kannst du einen der 4 Werte auswählen.
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
If Target.Row > 1 And Target.Row < 6 And Target.Column = 1 Then
Range("b9").AutoFilter Field:=2, Criteria1:=Target.Value
If InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ",") = 0 Or _
InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ":") = 0 Then
MsgBox "Der erste gefilterte Artikel lautet: " & _
Range("a10:A20").SpecialCells(xlCellTypeVisible).Value
Else
If InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ":") < _
InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ",") Then
MsgBox "Der erste gefilterte Artikel lautet. " & _
Range(Left(Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, _
InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ":") - 1)).Value
Else
MsgBox "Der erste gefilterte Artikel lautet. " & _
Range(Left(Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, _
Len(Range("A10:A20").SpecialCells(xlCellTypeVisible).Address) - _
InStr(1, Range("A10:A20").SpecialCells(xlCellTypeVisible).Address, ","))).Value
End If
End If
End If
Application.EnableEvents = True
End Sub

... damit erreiche ich das gleiche wie du mit deiner ganzen "AutoOpen" Procedur und den damit verbundenen OnKey-Umlenkungen.
Dies mal als Beispiel wie es ein Möchtegern-Könner machen würde :-)
Damit betrachte ich den Thread als geschlossen, .... ich wünsch' Dir weiterhin viel Spass
Gruss Rainer
Anzeige
OT sorry
PeterW
Hallo Rainer,
hat mir auch keine Ruhe gelassen ;-) aber du warst wie so oft schneller und umfangreicher.
Gruß
Peter
No problem....
Ramses
Hallo Peter
Schön dass es dir auch so ging ;-)
Intersect ist besser :-), da hab ich nicht mehr dran gedacht.
Gruss Rainer
AW: Eigentliches Problem !!! Streitet euch nicht !
PeterW
Hallo Niels,
ein Ansatz ohne SendKeys bezogen auf deine Beispielmappe könnte so aussehen (ist nicht besonders elegant, soll nur zeigen, wie es gehen könnte), dass du auf deinen gesamten Code verzichtest und statt dessen folgendes in das Modul der Tabelle1 kopierst:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A2:A5")) Is Nothing Then
Range("A9:D18").AutoFilter Field:=2, Criteria1:=ActiveCell
Range(Left(Range("A10:A18").SpecialCells(xlCellTypeVisible).Address, 5)).Select
End If
End Sub

Um deine Frage nach der Verteufelung der Sendkeys-Anweisung zu beantworten: was passiert, wenn man zeitgleich in einer anderen Datei mit den Richtungstasten arbeiten will während die SendKeys noch auf Application-Ebene aktiv sind?
Gruß
Peter
Anzeige
AW: Application.Sendkeys schreibt in falsches Bla
Ramses
Hallo
Peter w. hat dir doch die richtige Anweisung gegeben !
Ich verstehe nicht wozu das "SendKeys" hier gut sein soll ?
Der Code funktioniert egal in welcher Tabelle du dich befindest

Sub Test()
Worksheets("Tabelle1").Range("A1") = 1
End Sub

... und das ganze SendKeys ist überflüssig !
Oder was willst du sonst erreichen ?
Gruss Rainer
AW: Application.Sendkeys schreibt in falsches Bla
02.01.2005 18:46:19
Matthias
Hallo Rainer,
Zitat aus seinem Posting:
Ich bin kein VBA-Anfänger sondern babe schon über 5000 Zeilen in VBA programmiert. Mir ist also absolut klar, das ich die 1 auch einfacher in die Zelle A1 der Tabelle1 bekommen kann, z.B, mir Range("A1")="1". Dies ist jedoch nur ein Beispiel um ein Problem zu zeigen, was ich in gleicher Form in einem komplexen Programm habe.
Welches Problem genau, hat er hier glaub' ich nicht verraten...
Gruß Matthias
Anzeige
AW: Application.Sendkeys schreibt in falsches Bla
Ramses
Hallo Matthias
Egal welches Problem er hat,... "SendKeys" ist mit Sicherheit nicht die richtige Lösung
Gruss Rainer
AW: @Rainer und @Niels
02.01.2005 18:57:20
Matthias
Hallo Rainer,
..., "SendKeys" ist mit Sicherheit nicht die richtige Lösung.
so wie On Error Resume Next? ;-)
Naja, kann schon sein. manchmal verhakt man sich in eine Lösungsmöglichkeit und ist blind für andere, vielleicht einfachere...
Also, Niels:
Schildere deim Problem mal, vielleicht gibt es eine bessere Lösung als SendKeys!
Grüße an euch beide,
Matthias

41 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige