Hinweis b. Aufrufen d. Tabelle?

Hallo zusammen,
habe eine Tabelle „Kalkulation Reisekosten“ gebastelt und das Blatt so weit geschützt, dass nur noch bestimmte Felder ausgefüllt werden können.
Ich möchte nun verhindern, dass meine lieben KollegInnen sich mit der Maus von Feld zu Feld quälen, und sie darauf hinweisen, dass sie sich bitte mit der Tab-Taste von Eingabefeld zu Eingabefeld bewegen mögen.
Wie baue ich diesen Hinweis so ein, dass er am besten direkt beim Aufrufen der Tabelle erscheint, ohne allerdings hinterher mit ausgedruckt zu werden? (Mit Kommentaren oder Eingabemeldungen zu arbeiten halte ich nicht für sinnvoll, weil die ja jeweils nur dann erscheinen, wenn man mit der Maus die entsprechende Zelle anklickt.)
Danke im voraus für Eure Hilfe!

in das betreffende Tabellenblatt:

Private Sub Worksheet_Activate()
MsgBox „Bitte beim Wechseln der Zellen nur die TAB-Taste verwenden“, _
vbInformation, „Information“
End Sub

mfg
Spaguzzi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Akki,
wir wär’s mit einem Kommentar ‚Bitte mit der Tab-Taste die nächsten Felder ansteuern‘ o.ä. in der ersten Zelle, die beschrieben werden muss?

Gruß Angel

Hallo Akki,
du kannst deinen Kollegen den Tipp mit der Tab-Taste (geht auch mit drei Richtungspfeilen) z. B. in die erste Zeile schreiben. Damit der Tipp nicht auf dem Ausdruck erscheint, lässt du den Druckbereich in Zeile 2 beginnen, das geht mit

Datei - Seite einrichten - Reiter „Tabelle“
Für den Druckbereich kannst du z. B. A2:G35 eingeben oder den zu druckenden Bereich mit der Maus auswählen.

Eine Mini-Beispieltabelle findest du unter
http://www.egier.de/w-w-w/Tipp+Schutz.xls

Grüße aus Kamp-Lintfort
Erich

Dank an Spaguzzi, Angel, Erich
Ihr habt mir echt geholfen!
Einen schönen Tag noch,
Acki

DIE Lösung mit VBA, geht aber auch ohne :smile:

habe eine Tabelle „Kalkulation Reisekosten“ gebastelt und das
Blatt so weit geschützt, dass nur noch bestimmte Felder
ausgefüllt werden können.
Ich möchte nun verhindern, dass meine lieben KollegInnen sich
mit der Maus von Feld zu Feld quälen, und sie darauf
hinweisen, dass sie sich bitte mit der Tab-Taste von
Eingabefeld zu Eingabefeld bewegen mögen.

Hallo Akki,
wer achtet schon auf einmalige Hinweise beim Programmstart, vergib über Extras—Scutz–Blattschutz das Passwort „xyz“ und lass einmalig das folgende Makro laufen. Danach klickt keiner mehr mit der Maus im Zellenbereich herum, alles andere geht logo noch mit der Maus.
„xyz“ ist nicht so richtig toll als Passwort, ändere es gleich ab im Code. Es muss exakt mit dem übereinstimmen das du manuell eingibst.
Gruß
Reinhard

Sub MausInTabelleDeaktivieren()
With ActiveSheet
 ActiveSheet.Unprotect Password:="xyz"
 ActiveWindow.DisplayGridlines = False
 .Range("iu6534:iv65536").CopyPicture Appearance:=xlScreen, Format:=xlPicture
 ActiveWindow.DisplayGridlines = True
 .Pictures.Paste.Select
 .Shapes(1).Top = 0
 .Shapes(1).Left = 0
 .Shapes(1).LockAspectRatio = msoFalse
 .Shapes(1).Width = .Rows(1).Width
 .Shapes(1).Height = .Columns.Height
End With
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=False, Scenarios:=False
End Sub

Falls du schon Shapes in deiner Tabelle hast (Bilder, Buttons, Objekte aller Art usw) dann lass VORHER das Makro hier laufen:

sub anzahl()
for each bild in activesheet.shapes
 n=n+1
next bild
msgbox n
end sub

Dann wird ja das Bild was mein Makro einfügt, eine Nummer größer sein als die Zahl diedir angezeigt wurde. Daraufhin änderst du überall im Code Shapes(1) in z.B. Shapes(8) um wenn dir 7 angezeigt wurde in dem kleine Makro hier.
Achja, und im Vb-Editor kannst du auch den Code mit einem Passwort belegen, gibt überall neugierige Kollegen :smile:

für die guten VBAler hier
Hallo Wissende,
bevor mir einer den Tipp mit
.Shapes(1).Height = .Columns.Height
gab bastelte ich stundenlang mit
.Shapes(1).Height = .Rows(.UsedRange.Rows.Count + 1).Top
herum. Es hat nie geklappt, die Höhe des Bildes war zu klein, unten schaute Text heraus.

Ich hatte bis in Zeile 18 Text stehen und dachte bei
msgbox .UsedRange.Rows.Count + 1
käme demzufolge 19 heraus.

Pustkuchen, es wird 14 angezeigt, auch nach ner stunde ausprobieren, komme ich nicht auf meinen Fehler:frowning:
Habt ihr nen Tipp?
Danke
Reinhard

Hi,
ich mach in solchen Fällen immer ein recht großes Textfeld und schön knallfarbig, damits auch ja keiner übersieht. In den Eigenschaften kann man einstellen, daß es nicht gedruckt werden soll.
Gruß Jack

Hallo Reinhard,
trotz des Titels „für die guten VBAler hier“ und der Anrede „Wissende“ hab ich mal versucht, dem Problem auf die Schliche zu kommen. Ob’s mir gelungen ist, kannst du wohl nach dem nächsten Satz sagen:

Ich vermute, dass das (oder der?) UsedRange in deiner Tabelle nicht in Zeile 1, sondern in Zeile 6 beginnt. Da das Ende in Zeile 18 ist, liefert UsedRange.Rows.Count 13, und du verwendest die Oberkante der Tabellenzeile 14 als Grafikhöhe.

Die erste Zeile unterhalb des UsedRange - Zeile 19 - bekommst du mit

.Rows(.UsedRange.Rows(.UsedRange.Rows.Count).Row + 1).Row

und ihre Oberkante mit

.Rows(.UsedRange.Rows(.UsedRange.Rows.Count).Row + 1).Top

Leichter gehts mit

.Shapes(1).Height = .UsedRange.Top + .UsedRange.Height
.Shapes(1).Width = .UsedRange.Left + .UsedRange.Width

Noch eine Bemerkung zur Erzeugung der Grafik. Ist der Bereich in „.Range(„iu6534:iv65536“).CopyPicture“ nicht unnötig groß? Da später ohnehin die Größe neu festgelegt wird, würde doch auch eine einzelne Zelle reichen, also etwa „.Range(„iu65535:iu65535“).CopyPicture“.

Und eine Bemerkung zu deiner Lösung insgesamt: Einfach eine unsichtbare Grafik über die Zellen zu legen, die per Maus nicht erreichbar sein sollen - genial!

Grüße aus Kamp-Lintfort
Erich

P.S.: Ich weiß, dass ich nichts weiß. Bin ich nun ein Wissender?

wow

Ich vermute, dass das (oder der?) UsedRange in deiner Tabelle
nicht in Zeile 1, sondern in Zeile 6 beginnt. Da das Ende in
Zeile 18 ist, liefert UsedRange.Rows.Count 13, und du
verwendest die Oberkante der Tabellenzeile 14 als Grafikhöhe.

Hallo Erich,
ich habe ein schlechtes Gewissen, ja, ich du hast völlig Recht. Das schlechte Gewissen kommt daher dass ich die Lösung auch schon gestern hatte und zwar dachte sie hier zu posten aber irgendwie dachte hat Zeit, weil die findet keiner heraus. Respekt. Du bist sedhr gut und zäh. Ich stierte gestern laufend auf die 14, verstand die Welt nicht mehr. Logisch schon erklärbar, bis dato hatte ich bei uswededrange immer was in zeile 1 stehen, nur gestern in der testdatei halt erst ab zeile 6:frowning:

Wenn du magst, im Zuge dieser Anfrage, also keine Mausaktionen im Blatt, fand ich den/das nachfolgende API. Das klappt auch bei Direktaufruf oder per F5 im Editor. Bei WB_open tut sich allerdings gar nix:frowning: Wieder was was ich nicht kapiere. Sicher, im Sinne der Nutzbarkeit wär noch zu klären wie man die Maus wieder sichtbar macht wenn man ausserhalb des internen Zellbereichs ist, aber Mausposition abfragen, bezogen aufs Tabellenblatt oder das "window scheint auch nicht so einfach zu sein.
Da ich ja eine perfekte Lösung fand, also die mit dem Bild darüber liegt, ist das angefragte Problem gelöst, aber ich häng hier und frage mich warum ein Makro läuft wenn ich es starte, aber nicht läuft wenn workbook_open es startet.
Bin ein übler Crossposter :smile:, habe das schon gestern woanders gefragt aber noch keine Antwort.
Gruß
Reinhard
Diese Arbeitsmappe

Private Sub Workbook_Activate()
Call aus
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ein
End Sub

Private Sub Workbook_Deactivate()
Call ein
End Sub

Private Sub Workbook_Open()
Call aus
End Sub

Modul1

Private Declare Function ShowCursor Lib „user32“ (ByVal bShow As Long) As Long

Sub aus()
ShowCursor 0
End Sub

Sub ein()
ShowCursor 1
End Sub

Hallo Reinhard,
zunächst noch ein Tipp zur Einstellung der Grafikgröße:
Wenn die Grafik nicht nur den benutzten Bereich, sondern das ganze Tabellenblatt überdecken soll, geht das mit

.Shapes(1).Width = .Cells.Width
.Shapes(1).Height = .Cells.Height

Aber nun zu

ich habe ein schlechtes Gewissen …

Bin ein übler Crossposter :smile:, habe das schon gestern woanders gefragt …

Warum schreibst du nicht, was sich hinter dem „woanders“ verbirgt? Meine erste Idee - Herbers Excelforum - erwies sich gleich als Treffer. Gefunden habe ich dort außerdem noch einen Thread, in dem deine Lösung „DIE Lösung mit VBA - …“ weiterentwickelt wurde, bevor du sie hier veröffentlicht hast.

Crossposten finde ich im Prinzip gar nicht übel - unter der Voraussetzung, dass es öffentlich geschieht. Wenn sich der User eines Forums über ein Problem Gedanken macht, sollte er/sie wissen, dass sich auch andere damit beschäftigen. Sinnlose Doppelarbeit ist vermeidbar, man braucht nur mal kurz im anderen Forum reinzuschauen, ob’s dort schon hilfreiche Antworten/Anregungen/Ideen gibt. (Auch das hat mit Respekt zu tun.)

Mich beschleicht ein wenig das ungute Gefühl, dass für schwierigere Fragen zunächst mal Herbers Forum zuständig sein soll und dieses Forum für die weniger komplizierten Dinge geeignet erscheint und fertige Lösungen zu sehen bekommt. Ich habe überhaupt nichts gegen andere Foren (schaue ab und zu auch dort nach), aber diese Form der Zweigleisigkeit gefällt mir nicht.

Wer nachsehen möchte, worüber ich hier so schreibe:
http://www.herber.de/forum/archiv/608to612/t610384.htm
http://www.herber.de/forum/archiv/608to612/t610261.htm

Das klang jetzt hart. Aber meine (hoffentlich) klaren Worte sind wirklich nicht böse gemeint. In diesem Sinne
freundliche Grüße aus Kamp-Lintfort
Erich

Hallo Reinhard,
vielleicht hast du bei Herber ja schon meine Ergüsse zu deinem Problem gelesen (Link kommt am Ende dieses Beitrags).

Bei WB_open tut sich allerdings gar nix
… warum ein Makro läuft wenn ich es
starte, aber nicht läuft wenn workbook_open es startet.

Ich denke, dein Makro läuft auch beim Start über Workbook_Open usw.
Aber es bringt nicht den gewünschten Effekt, weil sich die API-Funktion ShowCase etwas anders als erwartet verhält.

ShowCursor ändert einen Zähler: Bei jedem Aktivierungsaufruf für den Mauszeiger wird er um 1 erhöht, bei jedem Deaktivierungsaufruf um 1 vermindert. Solange der Zähler nicht negativ ist, ist der Mauszeiger sichtbar.

Beim Schließen der Mappe werden mehrere Ereignisse ausgelöst, auch Deactivate und Close. Wenn der ShowCursor-Zähler vorher auf 0 stand, wird er durch diese beiden Ereignisse beim Schließen auf 2 gebracht, durch die beiden Ereignisse beim Öffnen dann wieder auf Null - und der Mauszeiger bleibt sichtbar.

Mit dem folgenden Code kannst du sehen, wie die Ereignisse abgearbeitet werden und wie sich der Zähler dabei entwickelt. (Den Zähler kannst du ja auch durch z. B. Starten der Activate- oder Deactivate-Makros per Hand beeinflussen.)

in „Diese Arbeitsmappe“:

Dim ii%

Private Sub Workbook\_Open()
 For ii = 1 To 5
 MsgBox "WB\_Open Nr " & ii
 If um(0) = 0 Then Exit For
 Next ii
End Sub

Private Sub Workbook\_BeforeClose(Cancel As Boolean)
 For ii = 1 To 5
 MsgBox "WB\_BefClose Nr " & ii
 If um(1) \>= 0 Then Exit For
 Next ii
End Sub

in Modul1:

Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

Function um(EinAus As Long) As Long
 Dim zwi&
 zwi = ShowCursor(EinAus)
 MsgBox "ShowCurser = " & zwi
 um = zwi
End Function

' nur zum leichteren Per-Hand-Einschalten beim Test
Sub MausEin()
 Dim ii%
 For ii = 1 To 5
 MsgBox "MausEin Nr " & ii
 If um(1) \>= 0 Then Exit For
 Next ii
End Sub

Grüße aus Kamp-Lintfort
Erich

P.S.:
Der Code steht auch unter http://www.herber.de/forum/archiv/608to612/t610261.htm

Hallo Erich,

Bin ein übler Crossposter :smile:, habe das schon gestern woanders gefragt …

Warum schreibst du nicht, was sich hinter dem „woanders“
verbirgt? Meine erste Idee - Herbers Excelforum - erwies sich
gleich als Treffer. Gefunden habe ich dort außerdem noch einen
Thread, in dem deine Lösung „DIE Lösung mit VBA - …“
weiterentwickelt wurde, bevor du sie hier veröffentlicht hast.

ich sehe keinerlei Handlungsbedarf anzugeben in welchen anderen Forum ich die Frage stellte, egal herber, spotlight oder in amerikanischen Foren, wobei es da bei mir oft am Englischen hapert :frowning:

Crossposten finde ich im Prinzip gar nicht übel - unter der
Voraussetzung, dass es öffentlich geschieht. Wenn sich der
User eines Forums über ein Problem Gedanken macht, sollte
er/sie wissen, dass sich auch andere damit beschäftigen.
Sinnlose Doppelarbeit ist vermeidbar, man braucht nur mal kurz
im anderen Forum reinzuschauen, ob’s dort schon hilfreiche
Antworten/Anregungen/Ideen gibt. (Auch das hat mit Respekt zu
tun.)

*zustimm* und wenn der Fragesteller sich korrekt verhält wissen die im anderen Forum sobald er es mitbekommt auch sofort, ob und welche Lösung andernorts gefunden wurde, auch Teillösungen sind hilfreich um darauf aufzubauen als Ansatz.

Mich beschleicht ein wenig das ungute Gefühl, dass für
schwierigere Fragen zunächst mal Herbers Forum zuständig sein
soll und dieses Forum für die weniger komplizierten Dinge
geeignet erscheint und fertige Lösungen zu sehen bekommt. Ich
habe überhaupt nichts gegen andere Foren (schaue ab und zu
auch dort nach), aber diese Form der Zweigleisigkeit gefällt
mir nicht.

Naja, wie soll ichs sagen. De facto tat ich folgendes, ich las hier eine Frage, versuchte sie zu lösen, kam nicht weiter und fragte irgendwo nach. Durch die Antworten auf die Nachfrage konnte ich die Fragestellung lösen und postete die Lösung hier.
Somit profitierte der Fragesteller davon, denn hier löste sie ja keiner *glaub*
Du oder andere engagierte Antworter mögen mir verzeihen, vom Mitlesen hier wie dort habe ich halt das subjektive Gefühl, dass dort viel mehr Profis auskunftbereit und -fähig sind.
Einen „Nepumuk“ eine „K.Rola“ oder „Boris“ (das ist der eine von den Zweien von www.excelformeln.de) mit seinen Arrayformeln auf die ich nie im Leben kommen würde, las ich hier noch nie.
lg
Reinhard

Wer nachsehen möchte, worüber ich hier so schreibe:
http://www.herber.de/forum/archiv/608to612/t610384.htm
http://www.herber.de/forum/archiv/608to612/t610261.htm

Das klang jetzt hart. Aber meine (hoffentlich) klaren Worte
sind wirklich nicht böse gemeint. In diesem Sinne
freundliche Grüße aus Kamp-Lintfort
Erich