Hilfe bei Makro: InputBox, Abfrage 'Abbrechen'
Moderator: Moderatoren
Hilfe bei Makro: InputBox, Abfrage 'Abbrechen'
Hi Leute,
kann mir jemand helfen, folgendes Makro zum Laufen zu bringen?
Ich möchte bei einer InputBox die Schaltfläche 'Abbrechen' abfragen, aber ich finde die dazu nötige Methode einfach nicht heraus...
InputVal = InputBox("Bitte geben Sie das Passwort ein:", "Passwortabfrage")
If InputVal = passthrough Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Exit Sub
End If
If InputVal = password Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Else
Beep
MsgBox ("Falsches Passwort !", 48, "Passwortabfrage")
Exit Sub
End If
Vielen Dank im Voraus
Scandal
PS: Was muss ich tun, um einen Makrocode richtig anzeigen zu lassen?
kann mir jemand helfen, folgendes Makro zum Laufen zu bringen?
Ich möchte bei einer InputBox die Schaltfläche 'Abbrechen' abfragen, aber ich finde die dazu nötige Methode einfach nicht heraus...
InputVal = InputBox("Bitte geben Sie das Passwort ein:", "Passwortabfrage")
If InputVal = passthrough Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Exit Sub
End If
If InputVal = password Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Else
Beep
MsgBox ("Falsches Passwort !", 48, "Passwortabfrage")
Exit Sub
End If
Vielen Dank im Voraus
Scandal
PS: Was muss ich tun, um einen Makrocode richtig anzeigen zu lassen?
Packen wir's an
Code: Alles auswählen
Sub abfrage_passwort
Dim InputVal as String
Dim password as String
Dim fehler
Dim hinweis as String
Dim Cell as object
Dim Sheet2 as object
'========================
hinweis = "Bitte geben Sie das Passwort ein:"
'
'hier Passwort vorgeben
password = "DeinPasswort"
'
'hier Zelle und Tabellenblatt initialisieren
'Beispiel:
Sheet2 = stardesktop.currentcomponent.Sheets().getByName("Tabelle2")
'Zelle A1 auf erstem Tabellenblatt
Cell = stardesktop.currentcomponent.Sheets(0).getCellByPosition(0,0)
'========================
Do
InputVal = InputBox(hinweis, "Passwortabfrage", "<Passwort>")
If InputVal = password Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Exit Do
Else
'InputBox abgebrochen
if InputVal = "" Then Exit Do
End If
hinweis = "Falsches Passwort!" & Chr(13) _
& "Bitte geben Sie das richtige Passwort ein."
fehler = 1
Loop While fehler = 1
'hier weiterer Code bei Bedarf
End Sub
Eine definierte Abfrage der Schaltfläche 'Abbrechen' der InputBox ist bei Starbasic NICHT möglich. Ausgewertet als Ereignis für 'Abbrechen' wird der Leerstring "". Falls das Abbrechen-Ereignis definiert von der Eingabe eines Leerstring unterschieden werden muß mußt Du einen Basic-Dialog verwenden.
markiere den Code und drücke Schaltfläche CodeWas muss ich tun, um einen Makrocode richtig anzeigen zu lassen?
Gruß
Stephan
Hi Stephan,
erstmal vielen Dank für deine Mühe
Ich habe mich etwas ungenau ausgedrückt, denn ich brauchte keine Hilfe um das Makro lauffähig zu bekommen - ist auch nur ein kleiner Auszug aus einem größeren Makro gewesen.
Das Makro an sich funktioniert problemlos, leider stört mich und die Leute, für die ich es geschrieben habe, die quasi Funktionslosigkeit der 'Abbrechen'-Taste. Das Programm interpretiert diese Taste einzig als 'Ok' und nicht zum Abbruch des Makros, so wie es eigentlich sein müsste...
Und es gibt wirklich keinen Weg? Den einzigen, den ich noch wüsste, wäre eine Maske mit Eingabefeld, 'Ok' und 'Abbrechen' zu erstellen. Das habe ich auch schon getan, ist aber meiner Meinung nach ein ziemlich großer Aufriss für eine einfache Passwortabfrage.
Vielen Dank
Scandal
erstmal vielen Dank für deine Mühe
Ich habe mich etwas ungenau ausgedrückt, denn ich brauchte keine Hilfe um das Makro lauffähig zu bekommen - ist auch nur ein kleiner Auszug aus einem größeren Makro gewesen.
Das Makro an sich funktioniert problemlos, leider stört mich und die Leute, für die ich es geschrieben habe, die quasi Funktionslosigkeit der 'Abbrechen'-Taste. Das Programm interpretiert diese Taste einzig als 'Ok' und nicht zum Abbruch des Makros, so wie es eigentlich sein müsste...
Und es gibt wirklich keinen Weg? Den einzigen, den ich noch wüsste, wäre eine Maske mit Eingabefeld, 'Ok' und 'Abbrechen' zu erstellen. Das habe ich auch schon getan, ist aber meiner Meinung nach ein ziemlich großer Aufriss für eine einfache Passwortabfrage.
Vielen Dank
Scandal
Packen wir's an
Du hast Dich nicht ungenau ausgedrückt, aber die ABBRECHEN-Schaltfläche funktioniert doch mit meinem Makro genau so wie Du es willst. Der Code:Ich habe mich etwas ungenau ausgedrückt, denn ich brauchte keine Hilfe um das Makro lauffähig zu bekommen - ist auch nur ein kleiner Auszug aus einem größeren Makro gewesen.
Das Makro an sich funktioniert problemlos, leider stört mich und die Leute, für die ich es geschrieben habe, die quasi Funktionslosigkeit der 'Abbrechen'-Taste. Das Programm interpretiert diese Taste einzig als 'Ok' und nicht zum Abbruch des Makros, so wie es eigentlich sein müsste...
InputVal = InputBox(hinweis, "Passwortabfrage", "<Passwort>")
ergibt für Drücken auf die Schaltfläche ABBRECHEN:
InputVal = ""
das wird dann hier ausgewertet:
if InputVal = "" Then Exit Do
und falls InputVal tatsächlich "" ist wird abgebrochen. Falls das Exit Do stört (tut es nicht wenn Du mein vorgegebenes Makro verwendest) kannst Du es prinzipiell durch Exit sub ersetzen.
Mein Code ist so geschrieben das der Nutzer in der Do-While-Schleife gehalten wird solange er kein richtiges Passwort eingibt ODER ABBRICHT. Das habe ich nur deshalb so gemacht, weil Deine Lösung mit der MsgBox etwas unelegant ist. Prinzipiell spricht nichts gegen die MsgBox wenn Du das so haben willst.
Nochmals: das prinzipielle Problem ist nur das sowohl Drüchen der Schaltfläche ABBRECHEN als auch Eingabe von "" und Drücken von OK den selben Wert für InputVal nämlich = "" liefern. Für eine Passwortabfrage ist das jedoch meiner Meinung nach völlig ohne Relevanz das es ja nur mit dem Passwort "" Probleme gäbe (jedes beliebige andere Passwort funktioniert). Oder willst Du wirklich den Leerstring als Passwort benutzen? Falls Du das willst ist die einzige Möglichkeit genau das was Du schreibst:
Ich weiß das es in VBA möglich ist zwischen Leerstring und ABRECHEN explizit zu unterscheiden, in Starbasic geht das (derzeitig) noch nicht.Den einzigen, den ich noch wüsste, wäre eine Maske mit Eingabefeld, 'Ok' und 'Abbrechen' zu erstellen.
Sollte ich immer noch falsch liegen, frage gerne nochmal nach.
Gruß
Stephan
Mhhh, da fehlt ja noch ein bisschen mehr
Die Starbasicentwickler haben da auch scheinbar überhaupt nicht an das Thema Passworteingabe gedacht, denn man kann die Eingabe ja nicht verdeckt vornehmen. Das wäre ja meine erste Stolperfalle gewesen.
Ciao
Niels
Ciao
Niels
Hi,
noch einmal vielen Dank für deine Mühe, Stephan.
Ich sehe momentan ebenfalls nur die Möglichkeit einer Do-While-Schleife, und einen Leerstring als Abbruchsignal... Das ist trotzdem etwas unelegant, weil die Schaltfläche 'Abbrechen' immer als 'Ok' gewertet wird - also z.B. Passwort eingeben und 'Abbrechen' drücken ergibt immer eine Bestätigung anstatt einen Abbruch...
Man kann halt nicht alles haben
Viele Grüße
Scandal
noch einmal vielen Dank für deine Mühe, Stephan.
Ich sehe momentan ebenfalls nur die Möglichkeit einer Do-While-Schleife, und einen Leerstring als Abbruchsignal... Das ist trotzdem etwas unelegant, weil die Schaltfläche 'Abbrechen' immer als 'Ok' gewertet wird - also z.B. Passwort eingeben und 'Abbrechen' drücken ergibt immer eine Bestätigung anstatt einen Abbruch...
Man kann halt nicht alles haben
Viele Grüße
Scandal
Packen wir's an
@Niels
Ich habe mal hier schnell etwas zusammengeschrieben, was im Prinzip funktioniert, aber noch nicht perfekt (und noch nicht komplett) ist. Mache Dir einen Basic-Dialog names "PASSWORT" dort ein Textfeld namens "feld" und ordne das Makro "passwordfeld" dem Ereignis 'taste loslassen' des textfeldes zu:
Es bleibt natürlich das Problem das das Vergleichspasswort zunächst offen im Code stünde und Du nur das Modul schützen kannst. Der Passwortschutz bei MS-Office ist allgemein relativ leicht zu brechen, da jedoch der Quellcode von OpenOffice offen liegt sollte es möglich sein herauszubekommen wie stark die implementierten Schutzmaßmahmen sowohl für Dokumente allgemein als auch für Module sind. Sonst müßte man es mal mit externen "PlugIns" versuchen, das ist z.B. das Mittel der Wahl um Access-Datenbanken (zumindest bis Version 2000) zu schützen ohne sich allein auf die in Access implementierten Mechanismen zu verlassen.
@Scandal
Ich habe das Thema InputBox hier im Forum schon in einem anderen Thread diskutiert und ich bin mit Dir einer Meinung das der Leerstring zum Erkennen des Abbruchs möglicherweise ungünstig gewählt ist.
ABER was bedeutet denn das hier:
InputBox ist eine ("festverdrahtete") Funktion in Starbasic, eine solche Funktion liefert jedoch einen Rückgabewert. Wie müßte denn dieser Rückgabewert beschaffen sein, das er keine Bestätigung darstellt bzw. warum bist Du der Meinung das jede Rückgabe von InputBox eine Bestätigung darstellt?
Um nicht falsch verstanden zuwerden:
Natürlich ist das Ganze als Makro lösbar. Aber ich weiß nicht wie das als Funktion gehen soll, denn diese kann doch höchstens die Information zurückgeben das ein Ereignis stattgefunden hat, jedoch nicht das Ereignis selbst. Oder liege ich da falsch?
Gruß
Stephan
Die Starbasicentwickler haben da auch scheinbar überhaupt nicht an das Thema Passworteingabe gedacht, denn man kann die Eingabe ja nicht verdeckt vornehmen. Das wäre ja meine erste Stolperfalle gewesen.
Ich habe mal hier schnell etwas zusammengeschrieben, was im Prinzip funktioniert, aber noch nicht perfekt (und noch nicht komplett) ist. Mache Dir einen Basic-Dialog names "PASSWORT" dort ein Textfeld namens "feld" und ordne das Makro "passwordfeld" dem Ereignis 'taste loslassen' des textfeldes zu:
Code: Alles auswählen
Dim oDialog1 AS Object
Dim oForm As Object
Dim versteckt
Dim offen
Sub StartDialog1
oForm = DialogLibraries.Standard.PASSWORT
oDialog1 = CreateUnoDialog( oForm )
oDialog1.execute
end sub
Sub passwortfeld
inhalt = oDialog1.GetControl("feld")
offen = offen & Right(inhalt.text,1)
versteckt = versteckt & "*"
inhalt.text = versteckt
'msgbox offen
End Sub
@Scandal
Ich habe das Thema InputBox hier im Forum schon in einem anderen Thread diskutiert und ich bin mit Dir einer Meinung das der Leerstring zum Erkennen des Abbruchs möglicherweise ungünstig gewählt ist.
ABER was bedeutet denn das hier:
Was ist denn in diesem Sinne Dein Kriterium um zwischen 'OK' und 'Abbrechen' zu unterscheiden?Das ist trotzdem etwas unelegant, weil die Schaltfläche 'Abbrechen' immer als 'Ok' gewertet wird - also z.B. Passwort eingeben und 'Abbrechen' drücken ergibt immer eine Bestätigung anstatt einen Abbruch...
InputBox ist eine ("festverdrahtete") Funktion in Starbasic, eine solche Funktion liefert jedoch einen Rückgabewert. Wie müßte denn dieser Rückgabewert beschaffen sein, das er keine Bestätigung darstellt bzw. warum bist Du der Meinung das jede Rückgabe von InputBox eine Bestätigung darstellt?
Um nicht falsch verstanden zuwerden:
Natürlich ist das Ganze als Makro lösbar. Aber ich weiß nicht wie das als Funktion gehen soll, denn diese kann doch höchstens die Information zurückgeben das ein Ereignis stattgefunden hat, jedoch nicht das Ereignis selbst. Oder liege ich da falsch?
Gruß
Stephan
Hi Stephan,
ich meine damit, dass User gewöhnt sind, durch die Schaltfläche 'Abbrechen' einen Abbruch des Makros hervorzurufen.
Wenn ein User quasi aus Versehen eine Schaltfläche in der Tabelle anklickt, die den Sinn hat, Referenzbereiche für Berechnungen sichtbar zu machen bzw. frei zu schalten, er dafür aber das nötige Passwort nicht kennt, kann er den Dialog einzig abbrechen, indem er einen Leerstring eingibt.
Natürlich ist klar, dass er, nachdem er zum Xten mal das falsche Passwort eingegeben hat und immer wieder zum Dialog zurückkehren muss, irgendwann einmal einen Leerstring stehen läßt und dadurch zum Abbruch des Dialoges gelangt.
Die Diskussion um die 'Abbrechen'-Schaltfläche klingt für mich auch wie Kleinkram, und ich kann mich damit auch abfinden, mein Chef jedoch nicht...
Laut ihm muss sich ein Programm immer selbst erklären, was grundsätzlich ja auch richtig ist. Wenn es also eine 'Abbrechen'-Schaltfläche gibt, erwartet er, dass diese augenblicklich auch zu einem Abbruch führt.
Wie gesagt kann ich mich mit dem Leerstring problemlos abfinden, mein Geldgeber aber leider nicht
Viele Grüße
Scandal
ich meine damit, dass User gewöhnt sind, durch die Schaltfläche 'Abbrechen' einen Abbruch des Makros hervorzurufen.
Wenn ein User quasi aus Versehen eine Schaltfläche in der Tabelle anklickt, die den Sinn hat, Referenzbereiche für Berechnungen sichtbar zu machen bzw. frei zu schalten, er dafür aber das nötige Passwort nicht kennt, kann er den Dialog einzig abbrechen, indem er einen Leerstring eingibt.
Natürlich ist klar, dass er, nachdem er zum Xten mal das falsche Passwort eingegeben hat und immer wieder zum Dialog zurückkehren muss, irgendwann einmal einen Leerstring stehen läßt und dadurch zum Abbruch des Dialoges gelangt.
Die Diskussion um die 'Abbrechen'-Schaltfläche klingt für mich auch wie Kleinkram, und ich kann mich damit auch abfinden, mein Chef jedoch nicht...
Laut ihm muss sich ein Programm immer selbst erklären, was grundsätzlich ja auch richtig ist. Wenn es also eine 'Abbrechen'-Schaltfläche gibt, erwartet er, dass diese augenblicklich auch zu einem Abbruch führt.
Wie gesagt kann ich mich mit dem Leerstring problemlos abfinden, mein Geldgeber aber leider nicht
Viele Grüße
Scandal
Packen wir's an
Hallo Scandal,
ich war zunächst über Deine "Sturheit" verärgert, habe jetzt jedoch nachgedacht und mir kam der Einfall das Du mit:
vielleicht meinst das die InputBox nicht automatisch schließt (ohne das dazu im Code Anweisungen nötig wären) wenn der Nutzer auf ABBRECHEN klickt, in dem Sinne wie das z.B. bei MsgBox mit der OK-Schaltfläche ist.
Trifft meine Vermutung zu?
Falls ja solltest Du aber verstehen, das damit in keinem der Fälle das Makro beendet wird sondern nur der Dialog geschlossen, z.B.:
Außerdem ist es doch für einem reinen Benutzer irrelevant, wie Dein Code aufgebaut ist solange nur die Funktion des Ganzen in Ordnung ist.
Wenn Du das von mir gepostete Makro verwendest wird dieses Problem definitiv nicht auftreten. Ich habe in dem entsprechenden Post darauf hingewiesen das Du auch 'Exit Do' durch 'Exit sub' ersetzen kannst. Aber für das Makro ist das im konkreten Fall nicht einmal notwendig.
Es gibt also keine Gefahr der Fehlbedienung durch den Nutzer wie Du sie vermutest. Du mußt bei Verwendung meines Codes auch keinen Leerstring eingeben, klicke ABBRECHEN und es ist sofort "Schluß"
Ich würde meine Ansichten bezüglich dieser Thematik jederzeit auch gegenüber Deinem Chef verteidigen (wenn ich seine Adresse hätte), aber daran wirst Du wohl kein Interesse haben.
Gruß
Stephan
ich war zunächst über Deine "Sturheit" verärgert, habe jetzt jedoch nachgedacht und mir kam der Einfall das Du mit:
ich meine damit, dass User gewöhnt sind, durch die Schaltfläche 'Abbrechen' einen Abbruch des Makros hervorzurufen.
vielleicht meinst das die InputBox nicht automatisch schließt (ohne das dazu im Code Anweisungen nötig wären) wenn der Nutzer auf ABBRECHEN klickt, in dem Sinne wie das z.B. bei MsgBox mit der OK-Schaltfläche ist.
Trifft meine Vermutung zu?
Falls ja solltest Du aber verstehen, das damit in keinem der Fälle das Makro beendet wird sondern nur der Dialog geschlossen, z.B.:
Code: Alles auswählen
sub test
msgbox "test"
'kommt hier noch irgendwelcher Code wird er
'nach dem Schließen der MsgBox mit OK
'noch ausgeführt
end sub
Wenn ein User quasi aus Versehen eine Schaltfläche in der Tabelle anklickt, die den Sinn hat, Referenzbereiche für Berechnungen sichtbar zu machen bzw. frei zu schalten, er dafür aber das nötige Passwort nicht kennt, kann er den Dialog einzig abbrechen, indem er einen Leerstring eingibt.
Natürlich ist klar, dass er, nachdem er zum Xten mal das falsche Passwort eingegeben hat und immer wieder zum Dialog zurückkehren muss, irgendwann einmal einen Leerstring stehen läßt und dadurch zum Abbruch des Dialoges gelangt.
Wenn Du das von mir gepostete Makro verwendest wird dieses Problem definitiv nicht auftreten. Ich habe in dem entsprechenden Post darauf hingewiesen das Du auch 'Exit Do' durch 'Exit sub' ersetzen kannst. Aber für das Makro ist das im konkreten Fall nicht einmal notwendig.
Es gibt also keine Gefahr der Fehlbedienung durch den Nutzer wie Du sie vermutest. Du mußt bei Verwendung meines Codes auch keinen Leerstring eingeben, klicke ABBRECHEN und es ist sofort "Schluß"
mich stört die Diskussion (ich halte interessante Grundsatzdiskussionen auch nicht für kleinlich) nicht, ich war nur an einem Punkt wo ich Dich wirklich nicht mehr verstehen konnte, aber vielleicht habe ich Dich ja jetzt verstanden -->siehe Anfang dieses Post hierDie Diskussion um die 'Abbrechen'-Schaltfläche klingt für mich auch wie Kleinkram, und ich kann mich damit auch abfinden, mein Chef jedoch nicht...
Ich würde meine Ansichten bezüglich dieser Thematik jederzeit auch gegenüber Deinem Chef verteidigen (wenn ich seine Adresse hätte), aber daran wirst Du wohl kein Interesse haben.
Gruß
Stephan
Hi Stephan,
nur eine kurze Endbemerkung, dann dürfte das Thema endlich durch sein, denke ich Ich ging zu Anfang davon aus, dass ich die 'Abbrechen'-Schaltfläche in etwa wie folgt abfragen kann: If cancel = true The Exit Sub... oder irgentwie so in der Art.
Ich verändere mein Makro nach deinen Vorgaben. Vielen Dank für deine Hilfe
Viele Grüße aus dem kalten Norddeutschland
Scandal
nur eine kurze Endbemerkung, dann dürfte das Thema endlich durch sein, denke ich Ich ging zu Anfang davon aus, dass ich die 'Abbrechen'-Schaltfläche in etwa wie folgt abfragen kann: If cancel = true The Exit Sub... oder irgentwie so in der Art.
Ich verändere mein Makro nach deinen Vorgaben. Vielen Dank für deine Hilfe
Viele Grüße aus dem kalten Norddeutschland
Scandal
Packen wir's an