Discussion:
UserForm soll Code anhalten wie Inputbox
(zu alt für eine Antwort)
Robert Jakob
2006-12-18 18:10:57 UTC
Permalink
Hallo NG,

habe einen sehr langen Code der mit Select Case in Häppchen aufgeteilt ist.

Je nach Select Case ist jedoch eine Handeingabe erforderlich.
Mit einer Inputbox funktioniert das alles einwandfrei.

Ich möchte das Ganze aber etwas komfortabeler machen und die Handeingabe
über eine Textbox auf einer Userform statt mit einer Inputbox machen.
Auf der Userform kann ich mir durch Anklicken die Auswahl in die Textbox
übergeben und habe somit keine formelle Fehleingaben.

Der Inhalt der Textbox soll dann an den Code übergeben werden, mit dem die
Userform aufgerufen wurde und dann soll der restliche Code aus diesem
Häppchen bis Exit Sub weiterlaufen, genau so wie es eine Inputbox machen
würde.

Kann mir da bitte jemand einen Tipp geben ?

MfG
Robert
Guido Hesterberg
2006-12-18 20:24:09 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
Ich möchte das Ganze aber etwas komfortabeler machen und die Handeingabe
über eine Textbox auf einer Userform statt mit einer Inputbox machen.
Auf der Userform kann ich mir durch Anklicken die Auswahl in die Textbox
übergeben und habe somit keine formelle Fehleingaben.
Der Inhalt der Textbox soll dann an den Code übergeben werden, mit dem die
Userform aufgerufen wurde und dann soll der restliche Code aus diesem
Häppchen bis Exit Sub weiterlaufen, genau so wie es eine Inputbox machen
würde.
aber ist es nicht ohnehin so, daß Code anhält, bis eine Userform vom
Benutzer deaktiviert wurde? Oder fehlt Dir eine generelle Anleitung?
Könnte wie folgt aussehen:

Dein Dialogfeld frmDialog enthält ein Listenfeld lstAuswahl, in dem
Deine Werte stehen. Außerdem enthält es zwei Schaltflächen cmdOK und
cmdAbbrechen.

' Im Hauptmodul

Public strListboxinhalt As String
Public blnAbbruch As Boolean

' Mach dies und das, zeige dann das Dialogfeld:
frmDialog.Show

----------------

' Im Dialogfeld

Private Sub UserForm_Initialize()
' Wenn Benutzer abbricht, ist blnAbbruch = True
blnAbbruch = True
End Sub

Private Sub cmdOK_Click()
' Benutzer hat OK geklickt
blnAbbruch = False
' Auswahl aus Listenfeld übernehmen
strListboxinhalt = lstAuswahl.Value
' Erst dann Dialogfeld entladen und mit restlichem Code fortfahren
Unload Me
End Sub

Private Sub CommandButton1_Click()
' Benutzer hat Dialogfeld abgebrochen, blnAbbruch bleibt = True
Unload Me
End Sub

----------------

' im Hauptmodul:

If blnAbbruch = False Then
' Benutzer hat nicht abgebrochen
' Arbeite mit strListboxinhalt weiter
Else
' Benutzer hat abgebrochen
MsgBox "Ich kann so nicht arbeiten!"
End If

Der Code hält zwischen frmDialog.Show und If blnAbbruch [...] an, bis
der Benutzer OK oder Abbrechen geklickt hat.

Ist es das, was Du gesucht hast? Wenn nicht, meld Dich einfach nochmal

Viele Grüße

Guido
Guido Hesterberg
2006-12-18 20:26:32 UTC
Permalink
Hat sich doch gleich ein Fehler eingeschlichen...

Bei cmdOK_Click muß es heißen

"strListboxinhalt = Me.lstAuswahl.Value"

statt der Version ohne "Me."
Robert Jakob
2006-12-18 21:53:58 UTC
Permalink
Hallo Guido,

Am 18 Dec 2006 12:26:32 -0800 schrieb Guido Hesterberg:

snip
Post by Guido Hesterberg
Bei cmdOK_Click muß es heißen
"strListboxinhalt = Me.lstAuswahl.Value"
statt der Version ohne "Me."
was Du geschrieben hast, das verstehe ich alles, nur ist das auf meinen
Fall so nicht anwendbar oder ich stehe im Moment im Dunkeln.

Im Prinzip habe ich ja auch kein Problem, denn alles läuft ja auch,
wenn auch nicht so ganz, wie ich es mir wünsche.

Ich rufe die Inputbox wie folgt auf:
StS = Inputbox("Bitte den Steuersatz eingeben", "Eingabeformat %",0)
wenn ich den Wert in die Inputbox eingegeben habe, dann wird der Wert
automatisch an die Variable "StS" übergeben und der Makrocode macht seine
Arbeit weiter. Das ist dann die Variante mit der Inputbox, bei der zwar
alles funtioniert, bei der man sich aber leicht vertippen kann wenn man
z.B. statt 0,07 für 7% die 7 eingibt und dann 700% bekommt.

Um das zu vermeiden habe ich mir dann ein Userform gebastelt und dieser
Userform den Namen SteuersatzForm gegeben.

Diese Userform, rufe ich dann im Code wie folgt auf:
SteuersatzForm.Show vbModal

und dann kommt natürlich diese Userform.

Auf dieser Userform habe ich dann eine Combobox, die ich mit :

Private Sub Userform_Initialize()
Combobox1.List = Array("0%, "7%,16%, 19%")
End Sub

ins Leben rufe und dann auswählen kann,
welcher Steuersatz zur Anwendung kommen soll.

Das Ergebnis dieser Auswahl übergebe ich mit dem ChangeEreignis
wie folgt an eine Textbox mit Namen SteuersatzBox wie folgt:

Private Sub Combobox1_Change()
Steuersatzbox.Value = Combobox1.value
End Sub

Mir ist klar, daß ich diesen Umweg nicht gehen müßte und die Auswahl direkt
übertragen könnte, aber ich möchte, daß man in der Textbox zunächst in Ruhe
sieht welchen Steuersatz man ausgewählt hat.

Nun möchte ich diese Userform namens SteuerSatzForm eigentlich verlassen
und den Inhalt der Textbox an die Variable STS im Code genauso übergeben
wie ich das mit einer Inputbox wie bereits oben beschrieben tun würde aber
irgenwie gelingt mir das nicht.

Im Moment habe ich eine Lösung, die zwar einwandfrei läuft,
mir aber nicht so gut gefällt. Diese Lösung sieht wie folgt aus:

Ich habe einen Button auf die Userform plaziert, dieser Button heißt
SteuerSatzOK dort habe ich folgenden Code hinterlegt :

Private Sub SteuersatzOK_Click()
Activesheet.Range("J" & Activecell.Row).Value = SteuersatzBoX.Value
Unload SteuerSatzForm
End Sub

Weil ich also im Moment nicht in der Lage bin, den Inhalt der
SteuersatzBox an die Variable StS zu übergeben, schreibe ich einfach den
Prozentsatz direkt in die Zelle "J" der aktuellen Zeile.
Den anschließenden Code habe ich ein wenig umbauen müssen und das läuft
dann eigentlich ohne einen Geschwindigkeitsverlust einwandfrei.

Mein Problem ist also nur, wie übertrage ich den Inhalt der SteuersatzboX
an die Variable StS.

Hoffentlich war Dir meine Erklärung nicht zu lang.

Wenn Du mir dazu einen Hinweis geben könntest, würde mich das sehr freuen.

MfG
Robert
Herbert Taferner
2006-12-18 22:43:46 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
Nun möchte ich diese Userform namens SteuerSatzForm eigentlich verlassen
und den Inhalt der Textbox an die Variable STS im Code genauso übergeben
wie ich das mit einer Inputbox wie bereits oben beschrieben tun würde aber
irgenwie gelingt mir das nicht.
du musst die Variable StS in einem Modul als Public deklarieren
dann ist diese Projektweit gültig und ausserhalb der UserForm
auch noch verfügbar

z. B.
Public StS As String

'dann in der UserForm

Private Sub SteuersatzOK_Click()
StS = SteuersatzBoX.Value
Unload SteuerSatzForm
End Sub

mfg Herbert
Robert Jakob
2006-12-19 08:11:29 UTC
Permalink
Hallo Herbert

Am Mon, 18 Dec 2006 23:43:46 +0100 schrieb Herbert Taferner:

snip
Post by Herbert Taferner
du musst die Variable StS in einem Modul als Public deklarieren
dann ist diese Projektweit gültig und ausserhalb der UserForm
auch noch verfügbar
z. B.
Public StS As String
'dann in der UserForm
Private Sub SteuersatzOK_Click()
StS = SteuersatzBoX.Value
Unload SteuerSatzForm
End Sub
mfg Herbert
Danke für Dinen Beitrag. Die Möglichkeit einer als öffentlich deklarieten
Variable kenne ich natürlich schon lange. Ich habe immer einen großen Bogen
darum gemacht weil ich mal so vor 10 oder 20 Jahren damit Probleme hatte.

Damals, eigentlich auch heute weiß ich nicht genau, wie man diese als
öffentlich deklarierten Variablen wieder zuverlässig los wird und damit
sehe ich die Gefahr, daß so eine öffentliche Variable von einer zufällig
auch geöffeneten anderen Anwendung zu Konflikt führen kann.

Bisher habe ich öffenliche Variablen immer gemieden. In größeren
Anwendungen habe ich immer eine Tabelle als "InfoText" zur Erklärung der
Anwendung oder eine Tabelle "Stammdaten" oder "Konstanten" und dann dort
auch einen reservierten Platz für temporäre Zwischenspeicherungen die von
jeder Private Sub aus dort abgelegt oder auch wieder zurück geladen werden
können. Im vorliegenden Fall habe ich die Zwischenspeicherung nicht in so
eine Tabelle abgelegt, aber immerhin auch in eine Tabelle und das
funktioniert ohne Probleme.

Kannst Du mir bitte sagen, wie man als öffentlich deklarierte Variablen aus
dem Speicher löschen kann, vielleicht kann ich mich ja dann evtl. noch mal
mit diesen Variablen anfreunden, wenn ich die auch zuverlässig wieder
loswerden kann.

MfG
Robert
Herbert Taferner
2006-12-19 08:50:27 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
Danke für Dinen Beitrag. Die Möglichkeit einer als öffentlich deklarieten
Variable kenne ich natürlich schon lange. Ich habe immer einen großen Bogen
darum gemacht weil ich mal so vor 10 oder 20 Jahren damit Probleme hatte.
Damals, eigentlich auch heute weiß ich nicht genau, wie man diese als
öffentlich deklarierten Variablen wieder zuverlässig los wird und damit
sehe ich die Gefahr, daß so eine öffentliche Variable von einer zufällig
auch geöffeneten anderen Anwendung zu Konflikt führen kann.
Bisher habe ich öffenliche Variablen immer gemieden. In größeren
Anwendungen habe ich immer eine Tabelle als "InfoText" zur Erklärung der
Anwendung oder eine Tabelle "Stammdaten" oder "Konstanten" und dann dort
auch einen reservierten Platz für temporäre Zwischenspeicherungen die von
jeder Private Sub aus dort abgelegt oder auch wieder zurück geladen werden
können. Im vorliegenden Fall habe ich die Zwischenspeicherung nicht in so
eine Tabelle abgelegt, aber immerhin auch in eine Tabelle und das
funktioniert ohne Probleme.
Kannst Du mir bitte sagen, wie man als öffentlich deklarierte Variablen aus
dem Speicher löschen kann, vielleicht kann ich mich ja dann evtl. noch mal
mit diesen Variablen anfreunden, wenn ich die auch zuverlässig wieder
loswerden kann.
normalerweise ist es ja der Sinn von Public Variablen dass diese
Projektweit zur Verfügung stehen, wenn du diese Variable nach
dem gebrauch nicht mehr benötigst dann leere sie einfach
mit z. B.

StS = ""

es gibt die tollsten Konstruckte zum löschen bzw. entfernen
wenn man danach googelt, das kann richtig in Arbeit ausarten
ich persönlich leere diese bevor ich einen Wert zuweise

Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen

mfg Herbert
Melanie Breden
2006-12-19 09:44:02 UTC
Permalink
Hallo Herbert,
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
da hilft dann das Modul als "Private" zu deklarieren:

Option Private Module

Schau dir dazu die "Option Private-Anweisung" in der OH näher an.


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
www.melanie-breden.de
Robert Jakob
2006-12-19 10:36:11 UTC
Permalink
Hallo Melanie
Post by Melanie Breden
Hallo Herbert,
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
Option Private Module
Schau dir dazu die "Option Private-Anweisung" in der OH näher an.
Mit freundlichen Grüssen
Melanie Breden
In der OH habe ich mal das Thema "Option Private-Anweisung" durchgelesen
und auch im Codebook auf Seite 528 nachgesehen.

Den Zusammenhang mit den Vorschlag von Herbert´s Vorschlag
"Public Variablen" zu deklarien konnte ich damit aber noch nicht verstehen.

Kannst Du mir das noch mal mit ein paar Zeilen erklären ?

MfG
Robert
Melanie Breden
2006-12-19 10:56:01 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
Post by Melanie Breden
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
Option Private Module
In der OH habe ich mal das Thema "Option Private-Anweisung" durchgelesen
und auch im Codebook auf Seite 528 nachgesehen.
Den Zusammenhang mit den Vorschlag von Herbert´s Vorschlag
"Public Variablen" zu deklarien konnte ich damit aber noch nicht verstehen.
Kannst Du mir das noch mal mit ein paar Zeilen erklären ?
Herbert berichtete von Problemen, wenn globale Variablen in mehreren geöffneten
Arbeitsmappen die gleiche Bezeichnung haben.
Durch die Option Private-Anweisung sind die globalen Variablen nur in ihrem
eigenen VBAProject sichtbar und stören andere Dateien nicht.

Innerhalb des VBAProjektes hat diese Anweisung keine Auswirkungen auf
die Lauffähigkeit der Variablen.


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
www.melanie-breden.de
Robert Jakob
2006-12-19 13:41:13 UTC
Permalink
Hallo Melanie


Am Tue, 19 Dec 2006 11:56:01 +0100 schrieb Melanie Breden:

snip
Post by Melanie Breden
Herbert berichtete von Problemen, wenn globale Variablen in mehreren geöffneten
Arbeitsmappen die gleiche Bezeichnung haben.
Durch die Option Private-Anweisung sind die globalen Variablen nur in ihrem
eigenen VBAProject sichtbar und stören andere Dateien nicht.
Innerhalb des VBAProjektes hat diese Anweisung keine Auswirkungen auf
die Lauffähigkeit der Variablen.
Mit freundlichen Grüssen
Melanie Breden
Nochmals Danke für Deine Rückmeldung.

Anscheinend bin ich doch etwas schwer von Begriff, denn leider habe ich
noch immer nicht richtig verstanden welche Auswirkung es auf als Public
deklarierte Variablen hat, wenn man ein Modul mit der :
Option Private Module belegt.

Ist es richtig wenn ich annehme, daß Public Variablen, wenn sie in einem
Modul stehen, welches mit der Option Private Module belegt ist, nur den
"Sub Codegruppen", ganz gleich ob es sich dabei um eine Privat Sub oder
eine normale Sub handelt, zur Verfügung stehen, die in diesem Modul
gespeichert sind ?

Bitte um nochmaligen Kommentar.

MfG
Robert
Melanie Breden
2006-12-19 14:06:00 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
Post by Melanie Breden
Durch die Option Private-Anweisung sind die globalen Variablen nur in ihrem
eigenen VBAProject sichtbar und stören andere Dateien nicht.
Innerhalb des VBAProjektes hat diese Anweisung keine Auswirkungen auf
die Lauffähigkeit der Variablen.
Ist es richtig wenn ich annehme, daß Public Variablen, wenn sie in einem
Modul stehen, welches mit der Option Private Module belegt ist, nur den
"Sub Codegruppen", ganz gleich ob es sich dabei um eine Privat Sub oder
eine normale Sub handelt, zur Verfügung stehen, die in diesem Modul
gespeichert sind ?
Nein
Globale, also mit Public deklarierte Variablen, die in einem Standardmodul deklariert
wurden stehen auch mit "Option Private Module" nach wie vor in allen Modulen und
Prozeduren des eigenen VBAProjektes zur Verfügung, egal, ob diese Private oder Public sind.
Die Option Private-Anweisung wirkt sich nur auf die Sichtbarkeit in *anderen* VBAProjekten aus.

Beispiel:
' Modul1
Option Explicit
Option Private Module

Public Const strIch As String = "Ich"

'Modul2
Option Explicit

Private Sub TestVariable()
MsgBox strIch
End Sub

Weiterhin werden Public Prozeduren, die in einem Private Modul gespeichert sind
nicht im Makro Dialogfeld (Extras/Makro/Makros) angezeigt.

Ist es jetzt verständlicher?


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
www.melanie-breden.de
Robert Jakob
2006-12-19 14:22:36 UTC
Permalink
Post by Guido Hesterberg
Hallo Robert,
Post by Robert Jakob
Post by Melanie Breden
Durch die Option Private-Anweisung sind die globalen Variablen nur in ihrem
eigenen VBAProject sichtbar und stören andere Dateien nicht.
Innerhalb des VBAProjektes hat diese Anweisung keine Auswirkungen auf
die Lauffähigkeit der Variablen.
Ist es richtig wenn ich annehme, daß Public Variablen, wenn sie in einem
Modul stehen, welches mit der Option Private Module belegt ist, nur den
"Sub Codegruppen", ganz gleich ob es sich dabei um eine Privat Sub oder
eine normale Sub handelt, zur Verfügung stehen, die in diesem Modul
gespeichert sind ?
Nein
Globale, also mit Public deklarierte Variablen, die in einem Standardmodul deklariert
wurden stehen auch mit "Option Private Module" nach wie vor in allen Modulen und
Prozeduren des eigenen VBAProjektes zur Verfügung, egal, ob diese Private oder Public sind.
Die Option Private-Anweisung wirkt sich nur auf die Sichtbarkeit in *anderen* VBAProjekten aus.
' Modul1
Option Explicit
Option Private Module
Public Const strIch As String = "Ich"
'Modul2
Option Explicit
Private Sub TestVariable()
MsgBox strIch
End Sub
Weiterhin werden Public Prozeduren, die in einem Private Modul gespeichert sind
nicht im Makro Dialogfeld (Extras/Makro/Makros) angezeigt.
Ist es jetzt verständlicher?
Mit freundlichen Grüssen
Melanie Breden
Hallo Melanie,

alles klar, dankeschön.

MfG
Robert

Herbert Taferner
2006-12-19 10:36:34 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
Option Private Module
Schau dir dazu die "Option Private-Anweisung" in der OH näher an.
Danke für die Ergänzung

mfg Herbert
Robert Jakob
2006-12-19 10:47:35 UTC
Permalink
Hallo Herbert

Am Tue, 19 Dec 2006 09:50:27 +0100 schrieb Herbert Taferner:


snip
Post by Herbert Taferner
StS = ""
es gibt die tollsten Konstruckte zum löschen bzw. entfernen
wenn man danach googelt, das kann richtig in Arbeit ausarten
ich persönlich leere diese bevor ich einen Wert zuweise
Es ist sicherlich ein guter Vorschlag Öffentlich deklarierte Variablen vor
dem "Auftanken" (Ein abgeleiteter Begriff von Guido Hesterberg) zu leeren.
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
Ja, das ist gut gedacht, in der Praxis aber kaum zu realisieren.

Ich bearbeite hier Angelegenheiten von 3 verschiedenen Unternehmen und
manche Anwendungen sind bis auf Kleinigkeiten wie Name u.s.w. fast gleichen
Inhalts und natürlich auch mit den gleichen Makros am Laufen.

Wenn ich dann per Zufall 2 fast gleiche Anwendungen geöffnet habe, dann
gibt es überhaupt keine Probleme wenn diese Anwendungen als Private Sub
ablaufen und ich hätte einen Gaust zu erwarten wenn ich dort öffentliche
Variablen verwenden würde. Es kommt also sehr auf den Einzelfall an und
mein Arbeitsstil ist in erster Linie auf Sicherheit ausgelegt.

MfG
Robert
Herbert Taferner
2006-12-19 11:16:48 UTC
Permalink
Hallo Robert,
Post by Robert Jakob
snip
Post by Herbert Taferner
StS = ""
es gibt die tollsten Konstruckte zum löschen bzw. entfernen
wenn man danach googelt, das kann richtig in Arbeit ausarten
ich persönlich leere diese bevor ich einen Wert zuweise
Es ist sicherlich ein guter Vorschlag Öffentlich deklarierte Variablen vor
dem "Auftanken" (Ein abgeleiteter Begriff von Guido Hesterberg) zu leeren.
Post by Herbert Taferner
Komplikationen können nur dann auftreten wenn du mehrere
Dateien offen hast und die selben Namen für die Variablen verwendest
dies unterbindet man damit, das man für solche Variablen eindeutige
Namen benutzt dann kann es auch nicht zu konflikten führen
Ja, das ist gut gedacht, in der Praxis aber kaum zu realisieren.
Ich bearbeite hier Angelegenheiten von 3 verschiedenen Unternehmen und
manche Anwendungen sind bis auf Kleinigkeiten wie Name u.s.w. fast gleichen
Inhalts und natürlich auch mit den gleichen Makros am Laufen.
Wenn ich dann per Zufall 2 fast gleiche Anwendungen geöffnet habe, dann
gibt es überhaupt keine Probleme wenn diese Anwendungen als Private Sub
ablaufen und ich hätte einen Gaust zu erwarten wenn ich dort öffentliche
Variablen verwenden würde. Es kommt also sehr auf den Einzelfall an und
mein Arbeitsstil ist in erster Linie auf Sicherheit ausgelegt.
wenn du die Sub's ja schon als Privat laufen hast,
dann verstehe ich überhaupt nicht mehr,
woher die Schwierigkeiten kommen könnten

mfg Herbert
Guido Hesterberg
2006-12-18 23:10:09 UTC
Permalink
Hallo Robert,

die Lösung ist ganz nah.

Zunächst mal ein kleiner Tip zu Variablen: Schreib immer ein Präfix
davor und schreib am besten in jedes Modul am Anfang ein Option
Explicit. So erzwingst Du, daß jede Variable explizit definiert werden
muß. Mag mühsam erscheinen, aber erspart einem bei größeren
Projekten (und Deine Projekte WERDEN größer mit der Zeit) ein
Kuddelmuddel und ewige Fehlersuche. Ich schlage für StS vor:

intSteuersatz

Ich arbeite aber mit Deinen Variablen weiter.

Wichtig ist: Dimensioniere im Hauptmodul StS als Public, damit sie auch
innerhalb der Userform verfügbar ist. Das entspricht meiner
Deklaration von

Public strListboxinhalt As String

Ersetze das durch

Public intSts As Integer
[...] bei der zwar
alles funtioniert, bei der man sich aber leicht vertippen kann wenn man
z.B. statt 0,07 für 7% die 7 eingibt und dann 700% bekommt.
Da ist eine Listbox eine gute Wahl.
SteuersatzForm.Show vbModal
Gut. vbModal kannst Du allerdings weglassen, das ist der Standardwert,
wenn nichts angegeben ist.
Private Sub Userform_Initialize()
Combobox1.List = Array("0%, "7%,16%, 19%")
End Sub
Richtig. Hab gesehen, daß Du das in einem früheren Posting schon
erfahren hast, deswegen hab ich nicht geschrieben, wie man eine Listbox
betankt. :-)
Das Ergebnis dieser Auswahl übergebe ich mit dem ChangeEreignis
Private Sub Combobox1_Change()
Steuersatzbox.Value = Combobox1.value
End Sub
Laß die Textbox und auch das Change-Ereignis weg. Wenn man einen Wert
aus einer Listbox auswählt, erscheint der doch als einziger in der
obersten Zeile der Listbox, und man kann ihn lang genug betrachten. :-)
Nun möchte ich diese Userform namens SteuerSatzForm eigentlich verlassen
und den Inhalt der Textbox an die Variable STS im Code genauso übergeben
wie ich das mit einer Inputbox wie bereits oben beschrieben tun würde aber
irgenwie gelingt mir das nicht.
Und genau das kannst Du mit dem OK-Button aus meinem Vorschlag
bewirken. Du hast ihn auch, nur daß er bei Dir SteuerSatzOK heißt
(ich schlage cmdOK vor).
Ich habe einen Button auf die Userform plaziert, dieser Button heißt
Private Sub SteuersatzOK_Click()
Activesheet.Range("J" & Activecell.Row).Value = SteuersatzBoX.Value
Unload SteuerSatzForm
End
Ersetze das durch den abgewandelten Code aus meinem Posting:

Private Sub SteuersatzOK_Click()
' In Deiner Listbox stehen Strings, daher wird Val() benutzt,
' um daraus einen Integer-Wert zu machen. Achtung, aus "7%"
' wird 7! Eventuell durch 100 teilen, je nachdem, welchen Wert Du
willst.
StS = Val(SteuersatzBox.Value)
Unload Me ' ist dasselbe wie SteuersatzForm
End
Weil ich also im Moment nicht in der Lage bin, den Inhalt der
SteuersatzBox an die Variable StS zu übergeben, schreibe ich einfach den
Prozentsatz direkt in die Zelle "J" der aktuellen Zeile.
Jetzt hast Du den Inhalt von SteuersatzBox in der Variable StS. Der
Trick ist nur, sie als Public zu deklarieren und ihr beim Klicken auf
OK den Wert zuzuweisen.

Jetzt müßte eigentlich alles klappen, oder?

Ich würde übrigens trotzdem im Initialize-Ereignis blnAbbruch = True
setzen. Auch wenn Du keinen Abbrechen-Button hast, kann der Benutzer
auf das Kreuzchen oben rechts im Dialogfeld klicken und so einen
Abbruch hervorrufen. Dann würde Dein Code mit einer nithc zugewiesenen
StS weiterarbeiten, was vielleicht unerwünschte Nebenwirkungen hätte.
Wenn Du blnAbbruch hinzufügst, kann Dir das nicht passieren. Dann
kannst Du das abfragen und den Benutzer darauf hinweisen. Du kannst
auch einen Abbruch mit dem QueryClose-Ereignis der Userform ganz
unterbinden. Siehe dazu die Onlinehilfe.

Viel Erfolg und liebe Grüße

Guido
Guido Hesterberg
2006-12-18 23:13:03 UTC
Permalink
Oh Mann... ich hab die ganze Zeit geschrieben, daß Du
SteuersatzBox.Value an StS zuweisen sollst. Da Du die ja löschen
solltest, existiert sie gar nicht... Ich meinte natürlich
Combobox1.Value.
Robert Jakob
2006-12-19 08:50:17 UTC
Permalink
Hallo Guido

Am 18 Dec 2006 15:10:09 -0800 schrieb Guido Hesterberg:

snip
Post by Guido Hesterberg
Zunächst mal ein kleiner Tip zu Variablen: Schreib immer ein Präfix
davor und schreib am besten in jedes Modul am Anfang ein Option
Explicit. So erzwingst Du, daß jede Variable explizit definiert werden
muß. Mag mühsam erscheinen, aber erspart einem bei größeren
Projekten (und Deine Projekte WERDEN größer mit der Zeit) ein
intSteuersatz
Option Explicit gehört bei mir zum kleinen 1 x 1 und ist in jedem Modul
oder auch auf den Codeseiten jeder Anwendung.

Die Sache mit dem Präfix hat sicherlich so wie Du sagst eine Bedeutung, da
ich die Variablen aber meist mit einem selbsterklärenden deutschen Text
versehe, bin ich noch nie damit in Schwierigkeiten geraten.

Ich habe viele Jahre mit Excel 5 und Excel 95 gearbeitet und da konnte man
ja VBA auf gut Deutsch programmieren und dann gewöhnt man sich so bestimmte
Arbeitsmuster an.
Im Falle StS ist das auch der Kopf der Tabellenbeschriftung in der Zeile 4,
denn bei mir fangen fast alle Datentabellen erst mit der Zeile 5 an, daß
ist auch so eine Gewohnheit, die sich bei mir bewährt hat.
Post by Guido Hesterberg
Ich arbeite aber mit Deinen Variablen weiter.
Wichtig ist: Dimensioniere im Hauptmodul StS als Public, damit sie auch
innerhalb der Userform verfügbar ist. Das entspricht meiner
Deklaration von
Public strListboxinhalt As String
Mit öffentlichen Variablen bin ich mal vor vielen Jahren auf den Bauch
gefallen und habe danach nie mehr öffentliche Variablen benutzt.
Mir war und ist klar, daß es damit funktioniert weil diese als öffentlich
deklarierte Variable halt jeder Anwendung zur Verfügung steht.
Post by Guido Hesterberg
Ersetze das durch
Public intSts As Integer
[...] bei der zwar
alles funtioniert, bei der man sich aber leicht vertippen kann wenn man
z.B. statt 0,07 für 7% die 7 eingibt und dann 700% bekommt.
Da ist eine Listbox eine gute Wahl.
Und es funktioniert ja auch einwandfrei.
Post by Guido Hesterberg
SteuersatzForm.Show vbModal
Gut. vbModal kannst Du allerdings weglassen, das ist der Standardwert,
wenn nichts angegeben ist.
Ich dachte, damit mache ich nichts falsch und die Box bleibt so lange auf
dem Bildschirm bis ich mich mit einem Klick auf dem Button abmelde und zwar
unabhängig von den sonstigen Einstellung in der Abteilung Eigenschaften.
Post by Guido Hesterberg
Private Sub Userform_Initialize()
Combobox1.List = Array("0%, "7%,16%, 19%")
End Sub
Richtig. Hab gesehen, daß Du das in einem früheren Posting schon
erfahren hast, deswegen hab ich nicht geschrieben, wie man eine Listbox
betankt. :-)
Dein Audruck betankt, gefällt mir sehr gut, das ist auch so ein
"selbsterklärender" Ausdruck.

Nun ja Melanie Breden war so freundlich mir zu erklären wie man das mach.
Dabei hätte ich nicht einmal fragen müssen, denn ich habe hier einen ganzen
Stall voll Bücher namhafter Autoren und auch das Buch "Codebook" von Monika
Weber und Melanie Breden und das ist der Vorgang auch genau beschrieben.
Manchmal erhält man halt in der NG schneller Information als die Fundstelle
in den Büchern.
Post by Guido Hesterberg
Das Ergebnis dieser Auswahl übergebe ich mit dem ChangeEreignis
Private Sub Combobox1_Change()
Steuersatzbox.Value = Combobox1.value
End Sub
Laß die Textbox und auch das Change-Ereignis weg. Wenn man einen Wert
aus einer Listbox auswählt, erscheint der doch als einziger in der
obersten Zeile der Listbox, und man kann ihn lang genug betrachten. :-)
Ja das ist richtig, tut aber auch nicht weh.
Post by Guido Hesterberg
Nun möchte ich diese Userform namens SteuerSatzForm eigentlich verlassen
und den Inhalt der Textbox an die Variable STS im Code genauso übergeben
wie ich das mit einer Inputbox wie bereits oben beschrieben tun würde aber
irgenwie gelingt mir das nicht.
Und genau das kannst Du mit dem OK-Button aus meinem Vorschlag
bewirken. Du hast ihn auch, nur daß er bei Dir SteuerSatzOK heißt
(ich schlage cmdOK vor).
Ich habe einen Button auf die Userform plaziert, dieser Button heißt
Private Sub SteuersatzOK_Click()
Activesheet.Range("J" & Activecell.Row).Value = SteuersatzBoX.Value
Unload SteuerSatzForm
End
Private Sub SteuersatzOK_Click()
' In Deiner Listbox stehen Strings, daher wird Val() benutzt,
' um daraus einen Integer-Wert zu machen. Achtung, aus "7%"
' wird 7! Eventuell durch 100 teilen, je nachdem, welchen Wert Du
willst.
StS = Val(SteuersatzBox.Value)
Unload Me ' ist dasselbe wie SteuersatzForm
End
Weil ich also im Moment nicht in der Lage bin, den Inhalt der
SteuersatzBox an die Variable StS zu übergeben, schreibe ich einfach den
Prozentsatz direkt in die Zelle "J" der aktuellen Zeile.
Jetzt hast Du den Inhalt von SteuersatzBox in der Variable StS. Der
Trick ist nur, sie als Public zu deklarieren und ihr beim Klicken auf
OK den Wert zuzuweisen.
Jetzt müßte eigentlich alles klappen, oder?
Ich würde übrigens trotzdem im Initialize-Ereignis blnAbbruch = True
setzen.
Das verstehe ich nicht: was heißt blnAbbruch = True setzen ?
Post by Guido Hesterberg
Auch wenn Du keinen Abbrechen-Button hast, kann der Benutzer
auf das Kreuzchen oben rechts im Dialogfeld klicken und so einen
Abbruch hervorrufen. Dann würde Dein Code mit einer nithc zugewiesenen
StS weiterarbeiten, was vielleicht unerwünschte Nebenwirkungen hätte.
Ich habe einerseits einen Button abbrechen eingebaut, nur weil ich das
nicht für wichtig hielt nicht geschrieben.
Post by Guido Hesterberg
Wenn Du blnAbbruch hinzufügst, kann Dir das nicht passieren. Dann
kannst Du das abfragen und den Benutzer darauf hinweisen. Du kannst
auch einen Abbruch mit dem QueryClose-Ereignis der Userform ganz
unterbinden. Siehe dazu die Onlinehilfe.
Im nachfolgenden Code habe ich einen Abbruch für den Fall eingebaut, daß
StS als "" oder ohne Wert zurück geliefert wird, das ist bei meiner etwas
pedantischen Arbeitsweise so.

Das QueryClose-Ereignis kenn eich bisher noch nicht, kannst Du mir das
bitte nochmal genauer erklären ?


Nun zum Schluß, vielen Dank für Deine ausführlichen Ausführungen und die
Mühe die Du Dir gemacht hast, es war schon einiges dabei was ich mir für
weitere Projekte zu nutze machen werde.

Viele Grüße und frohe Weihnachten wünscht Dir und Deiner Familie

Robert
Loading...