1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

[excel] WENN-Abfrage, 3 Bedingungen

Discussion in 'Office-Programme' started by Tiffiklotz, Sep 18, 2009.

Thread Status:
Not open for further replies.
  1. Hascheff

    Hascheff Moderator

    Hallo Matthias,
    Welche Meldung bringt der Compiler denn?

    Überprüfe die Schreibung der Variablen bezüglich der Umlaute.

    Gruß
    Hascheff
     
  2. Urs2

    Urs2 Megabyte

    Hallo Matthias,

    > Wanddicke = Tbx_Wanddicke.Value
    Mit oder ohne .Value ist der Effekt identisch, weil Value die Default-Eigenschaft der Textboxen ist
    Zur besseren Uebersicht kannst Du .Value auch hinschreiben.


    > ElseIf LichteGeschosshoehe >= Gebaeudehoehe Then
    Da hast Du das rote Then am Zeilenende vergessen.
    Zitat Hascheff >>> "Welche Meldung bringt der Compiler denn?" >>> immer wichtig bei Fragen.


    > ...auch noch eine ErrorMessage definieren...
    Die hast Du doch schon definiert, bei jeder If-Abfrage >
    errMess = "Wanddicke ist keine Zahl" .... das ist die Meldung, die nachher angezeigt wird
    GoTo errMessage ........... jetzt springt er ans Ende des Subs und macht

    lblError = errMess (oder lblError.Value = errMess) .... schreibt die Meldung in der Variablen ins Label... und beendet das Sub


    > ...Die Abfrage, ob das Verfahren geeignet ist, schreibe ich in den gleichen PrivateSub? (Cmd_Uerberpruefen)...
    Du hast doch nur noch ein Sub - Cmd_Berechnen - oder nicht?
    Diese Prüfungen kommen auf alle Fälle auch in das eine Sub.
    In meinem Beispiel-Sub steht "'dann sinngemäss die Ausschlussbedingungen berechnen" > dort hin sollen sie.
    Dass die Voraussetzungen erfüllt sind, kann so natürlich nicht gemeldet werden... aber das ist ja auch nicht üblich... die Rechtschreibprüfung schreit auch nicht bei jedem richtigen Wort "Bravo - richtig !"
    Keine Meldung = Gute Meldung !


    > Comboboxen
    Meine Idee war > eine Combo für den Stein und eine für den Mörtel... der Code liest dann den Wert am Kreuzungspunkt.
    Jetzt sind aber einige Kombinationen leer. Warum sind diese leer ?
    Wie weiss der User welche Kombinationen er nicht nehmen darf ?
    Oder darf er doch? Aber welcher Wert ist dann gültig?
    - beim Z-Wert heisst es doch sicher C2:G11 ???
    Wir werden schon einen Weg finden, aber ich muss den Hintergrund kennen.

    Gruss Urs
     
  3. Tiffiklotz

    Tiffiklotz Byte

    Wow es haben sich soeben viele Fragen geklärt, endgültig hoffe ich! :)

    Zu den ComboBoxen: C2:G11 ist richtig, ja! Einige Felder sind absichtlich leer, da diese Kombinationen nicht sinnvoll sind (die besten Steine dafür aber den schlechtesten Mörtel :aua: dann bringt sowas die Wand zum Einsturz ;) )
    Ich würde davon ausgehen, dass der User NICHT weiß, welche Kombinationen möglich sind und welche nicht. Also noch eine Abfrage

    Nur noch einen Sub ist ok. Also habe ich einen "Berechne"-Button und wenn alle Abfragen und Eingaben OK sind, spukt er Werte aus. Ansonsten habe ich eine lange Liste von errMess´s! ?

    Letzte Frage ... zu mindest so weit, wie mein Sub geschrieben ist...
    So beginnt der Code:
    Code:
    Option Explicit                                                     'Deklariere Variablen
    
    Private Sub Cmd_Ueberpruefen_Click()
    
    
    lblError = errMess
    
    Wanddicke = Tbx_Wanddicke                                           'Eingaben Einlesen
    LichteGeschosshoehe = Tbx_LiGesch
    [...]
    In den Zeilen "Wanddicke = Tbx_Wanddicke" ... bekomme ich beim debuggen folgende Meldung: Fehler beim Kompilieren. Variable nicht definiert.:confused:
     
  4. Urs2

    Urs2 Megabyte

    Nein, keine Liste.
    Die Prüfungen, zuerst Plausibilität und dann Auschluss, werden nacheinander abgearbeitet.
    Jede nicht bestandene Prüfung wird einzeln im UserForm im Fehler-Label erklärt, das Sub beendet sich dann.
    Der User kann diese Fehleingabe beheben und dann wieder "Berechnen" drücken, dann wird weiter geprüft bis zum nächsten Fehler...
    Bei einer Ausschluss-Anzeige kann er Abbrechen und das normale Verfahren verwenden... oder die Konstruktion verändern bis es passt...


    > Wanddicke = Tbx_Wanddicke ........ Variable nicht deklariert
    Prüfe ob die Variable Wanddicke genau so deklariert ist
    Tbx_Wanddicke ist ein Steuerelement, das erkennt VBA automatisch, wenn es aber effektiv nicht genau so heisst, meint VBA das sei eine nicht deklarierte Variable... Prüfe in den Eigenschaften der Textbox.

    > Mörteltabelle-Tabelle auslesen.... Ich warte mal... bis mir eine elegante Lösung einfallen wird...

    Gruss Urs
     
  5. Urs2

    Urs2 Megabyte

    Hallo Matthias,

    Die Vorgabe, SigmaZul mit Cells() direkt aus der Originaltabelle auszulesen, macht Kummer...
    ...egal, ob man Textboxen für freie Eingabe, oder DropDowns mit vorgegebenen Antworten verwendet.

    1. Möglichkeit >>
    Streng nach Vorgabe, der User wählt Stein und Mörtel getrennt in 2 DropDowns.
    Der Code liest mit Cells() am Kreuzungspunkt den Wert aus.
    Wenn dort kein Wert stehen sollte, kann man das Abfangen und melden "falsche Kombination"
    ...und jetzt steht der User im Regen. Was soll er tun? Er weiss nicht, welche Kombination gültig wäre...
    Er wird herum testen... und die ideale Kombination höchstens zufällig finden.
    Der gewiefte User wird vor dem Start in der Originaltabelle schauen müssen, was er nehmen soll... wie in der Steinzeit !


    2. Möglichkeit >>
    Elegant, einfacher Code, User-freundlich... aber ohne die Cells()-Methode...
    Unter der Originaltabelle steht eine neue Tabelle für alle möglichen Kombinationen - 3 Spalten und 36 Zeilen >> etwa so
    Code:
    Mörtelklasse	Steinklasse	SigmaZul
    	I		2	0.3
    	I		4	0.4
    	.		.	.
    	I		20	1.0
    	II		2	0.5
    	II		4	0.7
    	.		.	.
    	.		.	.
    	usw für alle 35 Kombinationen
    Es gibt so nur noch einen DropDown.
    Die ganze neue Tabelle wird in den Dropdown geladen.
    Der User sieht zeilenweise für jede Kombination auch gleich die zulässige Spannung... und wählt eine Zeile...
    So sieht er auch vor der Auswahl, welche Kombination ideal wäre...


    Und nun ?

    Gruss Urs
     
  6. Tiffiklotz

    Tiffiklotz Byte

    Hallo Urs,

    Ich werde die zweite Variante nehmen! Da es zu der Aufgabe auch eine mündliche Prüfung gibt, kann ich es ja begründen (das ist übrigens auch der Grund, warum ich so viele Fragen stelle und nicht einfach alles "blind abtippe". Abgesehen davon entwickel ich zunehmend Interesse an VBA, auch dank dir!)

    Ich habe mich mal auf anderen Seiten etwas schlau gemacht. Wenn ich "option explicit" verwende, muss ich dennoch "DIM VARIABLE" schreiben, richtig?, nur das "AS ..." lasse ich weg. So konnte ich viele Bugs entfernen. Ich bekomme momentan noch eine Fehlermeldung .. bzgl. der Sprungmarke: "Sprungmarke nicht definiert". Ich habe schon einen anderen Beitrag von dir gelesen, aber ich weiß nicht, an welche Stelle ich den Doppelpunkt setzen muss. Ich kopiere hier mal eine Beispiel-Abfrage hinein, damit du mir das zeigen kannst! :)

    Code:
        If IsNumeric(Verkehrslast) = False Then                           'Verkehrslast
            errMessage = "Verkehrslast ist keine Zahl"
            GoTo errMessage
        End If
    Noch einmal zu den ComboBoxen: Wie gesagt, würde ich gerne deine zweite vorgeschlagene Variante nehmen. Die 35(!) Datensätze habe ich in den Zeilen 2-36 eingegeben (Spalte A:C). Wie sieht die Datenabfrage im Code aus?

    ----------

    Wenn ich das dann soweit verarbeitet habe, kommen die Berechnungen. Kann ich die so übernehmen, wie ich sie anfangs geschrieben hatte? (Natürlich Feld- und Variablennamen anpassen)

    Ich wüsste sehr gerne, wie ich die Ausgabe über ein Label mache.
    Bsp.: Mein Label heißt "AusgabeKnicklänge"
    Die Formel für die Knicklänge lautet wie folgt:
    Knicklaenge = LichteGeschosshoehe * Knicklaengenbeiwert
    Der Knicklängenbeiwert wurde schon abgefragt - über die OptButtons (s.o.)

    Kann ich mich irgendwie für deine wunderbare Hilfe revanchieren? :bet:

    Herzliche Grüße,
    Matthias

    PS: Der Sigma-Wert im Excel-Datensatz ist SigmaNull und nicht der Zulässige. Dieser errechnet sich durch Multiplikation mit dem Abminderungsfaktor k. :baeh:
     
    Last edited: Oct 14, 2009
  7. Urs2

    Urs2 Megabyte

    Hallo Matthias,

    Wenn Du Option Explicit verwendest (bei grossen Codes verwende ich sie immer) musst Du die Variablen deklarieren, so >
    Dim xyzXzzzz............. sonst wird das beim kompilieren bemängelt
    Du darfst zusätzlich die Art festlegen, so >
    Dim xyzXzzzz As Integer


    "GoTo errMessage" heisst gehe zur Sprungmarke "errMessage". Diese muss natürlich irgendwo im Sub sein.
    Verrmutlich hattest Du sie in meinem Beispiel in #17 übersehen... mitten in den Bemerkungen... sie heisst natürlich errMessage:, mit einem Doppelpunkt am Ende und ist hier >
    Code:
        Exit Sub                'wenn kein Fehler > hier Ende
        
                    'hier Sprungmarke für Fehlerbehandlung
    [COLOR="Red"]errMessage:[/COLOR]
                'das lblError muss im Form sein, für die FehlerAusgaben
                'füllt das Label mit entsprechender Fehlerbeschreibung
        lblError = errMess
    
    End Sub
    

    Die Berechnungen schreibst Du wie in meinem Beispiel in #17
    Ich vermute Du brauchst nirgends einen Rückgabewert, also so wie dort im PS. Dann füllen sie die Variablen von dort aus.
    Aufrufen im Sub auch so wie im PS, nur den Namen der Function in einer Zeile.


    Die Ausgabe ins Label siehst Du gleich hier oben >
    lblError = errMess ......... oder
    lblError.Value = errMess
    Das dürfen aber nicht die Functions machen, die sollen ihr Resultat nur in die Variablen schreiben.
    Das Sub Berechnen macht das dann für alle Variablen zusammen... wenn alles berechnet ist.
    Das siehst Du in meinem Beispiel. Dort ist aber noch nicht drin, dass anschliessend alle Eingaben und Variablen auch noch in ein Tabellenblatt geschrieben werden müssen....... später...


    So, jetzt mache mich mal an die Combobox...

    Gruss Urs
     
  8. Urs2

    Urs2 Megabyte

    ...weiter...
    Ich habe ja nicht Deine ganze Datei, aber so hat es bei mir provisorisch geklappt.

    1. Du musst eine Combobox im Userform haben, für meinen Code heisst diese "cboStein" > sonst den Code anpassen

    2. Beim Start muss die Combo mit der Tabelle gefüttert werden. Das macht dieses Sub > einfach bei Dir rein kopieren >
    Code:
    Private Sub UserForm_Initialize()
        'dieses Sub startet automatisch beim Aufruf des Userforms
        
        'dieses Dim ist jetzt ein Spezialfall, dem ich eine Dimension gebe
        'es ist nur in diesem Sub gültig
    Dim rngSigma As Range
    
                        'TabelleStein ist der Name meines Blattes mit der Tabelle >> anpassen
                        'in Zeile 1 stehen die Titel > auch übernehmen
    Set rngSigma = Sheets("[COLOR="Red"]TabelleStein[/COLOR]").Range("[COLOR="Red"]A1:C36[/COLOR]")
                        'die Combobox heisst bei mir cboStein
        With cboStein
                        'entfernt ev. alte Einträge
            .Clear
                        'keine freie Eingabe möglich
            .Style = fmStyleDropDownList
                        'Anzahl Spalten in DropDown
            .ColumnCount = 3
                        'im Textfeld der Combo angezeigte Spaltennummer = SigmaNull
            .TextColumn = 3
                        'Anzahl der anzuzeigenden Zeilen
            .ListRows = 36
                        'Listenbreite total
            .ListWidth = 150
                        'Breite einzelner Spalten
            .ColumnWidths = "50;50;30"
                        'füllt Dropdown mit der Tabelle
            .RowSource = rngSigma.Address
        End With
                        'gibt Objekt wieder frei
        Set rngSigma = Nothing
    
    End Sub
    Im Code "TabelleStein" ändern in den Namen Deines Blattes, das die Tabelle enthält.
    Bereich A1:C36 enthält auch die Titelzeile der Tabelle im Blatt, sonst weiss man im DropDown ja nicht, was die Zahlen bedeuten.


    3. Da Schlaumeier im Dropdown auch die Titelzeile klicken können, stellt dieses Sub die Titel gleich wieder zurück auf "leer" > Code kopieren >
    Code:
    Private Sub cboStein_Change()
        'wenn ein Schlaumeier in der Liste die Titelzeile klickt,
        'wird Anzeige in der combo gleich wieder auf "leer" gesetzt
    
    If cboStein.ListIndex = 0 Then cboStein.ListIndex = -1
    
    End Sub

    4. Ins grosse Sub Berechnen muss dieser Code eingefügt werden.
    Am Ende des ersten Abschnitts "Usereingaben einlesen" in meinem Beispiel #17
    Code:
    With cboStein
        If .ListIndex < 1 Then
                'wenn kein Mörtel gewählt
            errMess = "Sie haben keine Stein+Mörtelklasse gewählt"
                'geht direkt zur Sprungmarke ErrMessage am Ende des Subs
            GoTo errMessage
        End If
                'füllt Variablen mit Werten aus der Combo
        Mörtelgruppe = .List(.ListIndex, 0)
        Steinfestigkeitsklasse = .List(.ListIndex, 1)
        SigmaNull = .List(.ListIndex, 2)
    End With
    
    Der Dropdown zeigt geöffnet, zum Wählen, alle 3 Spalten an. Wenn er geschlossen ist sieht man nur einen Wert (SigmaNull)
    Vielleicht 2 Labels daneben setzen, die auch Mörtel- und Steinklasse anzeigen... die Werte sind in den Variablen ja schon vorhanden.

    Hoffen wir, dass es klappt...

    Gruss Urs
     
    Last edited: Oct 15, 2009
  9. Urs2

    Urs2 Megabyte

    Ich sehe das gerade in Deinem Beitrag #23... das sollte sein >
    lblError = ""
    ...dazu mein #17

    Das Error-Label soll bei Beginn des Codes zurück gesetzt auf "leer"
    Wenn bei diesem Durchlauf kein Fehler mehr auftreten sollte, rechnet er alles durch... aber die alte Fehlermeldung wäre immer noch im UserForm...

    Wenn noch ein Fehler kommen sollte, schreibt er wieder eine neue Fehlermeldung.

    Gruss Urs
     
  10. Tiffiklotz

    Tiffiklotz Byte

    Hey Urs,

    Es klappt leider noch nicht alles so, wie es sollte. Beim Debuggen bekomme ich die Meldung, dass folgende Variable nicht deklariert sei:

    Mein Code beginnt inzwischen so, wie du es gesagt hast. Direkt nach der Variablendeklaration beginnt der Sub Berechnen folgendermaßen:

    Code:
    Private Sub Cmd_Berechnen_Click()
    
    
    lblError = ""
                                                                        'Eingaben Einlesen
    Wanddicke = Tbx_Wanddicke
    LichteGeschosshoehe = Tbx_LiGeschoss
    Verkehrslast = Tbx_LastDecke
    Gebaeudehoehe = Tbx_GebHoehe
    Stuetzweite = Tbx_Stuetzweite
    Steinfestigkeitsklasse = Cmb_Steinfest
    Unter diesen Abschnitt ins selbe Sub, direkt darunter habe ich den diesen Abschnitt geschrieben:
    Code:
    With cboStein
        If .ListIndex < 1 Then [...]
    Anschließend werden die Falscheingaben gefiltert.
    Danach kommt:

    Code:
            'jetzt die einzelnen Functions aufrufen zum Füllen der Variablen
    Knicklaenge = FuncKnicklaenge
    Knicklaengenbeiwert = FuncKnicklaengenbeiwert
    Ich glaube, hier kam auch mal die Fehlermeldung, "FuncKnicklaenge" sei nicht deklariert.

    Anschließend fülle ich die Labels im UserForm.

    EndSub

    Nun kommen die Functions. Muss ich für jede Berechnung ein eigenes Function schreiben?

    Nun kommt das eigentliche Problem:
    Die ComboBox: Ich habe alles so eingegeben, wie du gesagt hast, bzw deinen Code kopiert. Meine Tabelle heißt TabelleStein und meine ComboBox heißt, genau wie bei dir, cboStein.
    Jedoch, wenn ich den Code ausführen lasse und die ComboBox im UserForm aufrufe, erscheinen nur weiße Zeilen :(

    Danach kommt noch die "Schlaumeier-Zeile" und damit ist mein Code fertig! :rolleyes:
     
  11. Tiffiklotz

    Tiffiklotz Byte

    - Das Problem mit den nicht deklarierten Variablen konnte ich teilweise selbst l&#246;sen. Bei den Functions (Bsp. FuncKnicklaengenbeiwert) ist es immernoch vorhanden. :(
    - Ich habe eine neue Variable eingef&#252;hrt: "Belastung" (R)
    [notwendig, um vorhSigma zu bestimmen; muss vom User eingegeben werden]
    - Ich habe f&#252;r jede Berechnung eine Func. geschrieben
    - Die ComboBox funktioniert inzwischen perfekt, danke! :D

    Es fehlt noch der Nachweis. Schreibe ich den Code daf&#252;r einfach in&#180;s Berechnen-Sub?

    Code:
    If vorhsigma <= zulsigma Then MsgBox "Der Nachweisist erf&#252;llt!"
    Esle: MsgBox "Der Nachweis ist nicht erf&#252;llt"
    End If
    - Noch eine Frage: Wie verhalten sich die Abfragen "If (IsNumeric) ... bei negativen Zahlen bzw folgenden Eingaben:
    "- 1" oder "-1" (mit und ohne Leerzeichen) ?
    Ggf. muss ich noch eine zus&#228;tzliche Abfrage einbauen, um negative Zahlen zu verhindern.
     
    Last edited: Oct 15, 2009
  12. Urs2

    Urs2 Megabyte

    ... Doppelpost...
     
    Last edited: Oct 16, 2009
  13. Urs2

    Urs2 Megabyte

    Hallo Matthias,

    Langsam wird es schwieriger für mich >
    Meine ursprüngliche Idee habe ich zwar noch im Kopf, aber Deine Datei wird logischerweise wohl ganz anders aussehen...

    1. Steinfestigkeitsklasse = Cmb_Steinfest ....Variable nicht deklariert
    Was ist Cmb_Steinfest? Das war wohl einmal eine Idee... die Zeile ist sicher überflüssig.
    Der Code in Punkt4 in #28 liest alle 3 Werte für SteinFestig/MörtelGr/SigmaNull mit Listindex aus der ComboBox cboStein aus...
    ...und füllt damit gleich die 3 entsprechenden Variablen.


    2. Knicklaenge = FuncKnicklaenge ....... Variable nicht definiert
    Das erste ist eine Variable, das zweite der Name einer Function.
    Wenn die Function nicht existiert, oder der Name anders geschrieben ist, nimmt VBA an es sei eine nicht deklarierte Variable... und meckert.
    Ich habe übrigens den Variablennamen wie "Knicklänge" einfach ein Func davor gesetzt zu "Function FuncKnicklaenge", damit man gleich weiss, dass die beiden zusammen gehören.


    3. Füllen der Variablen mit dem Resultat der Functions
    Wenn Deine Functions alle so aussehen, wie das Beispiel in meinem #17, im PS ganz unten, dann sind die Variablen damit gefüllt.
    Dort steht ja "Knicklängenbeiwert = 0.9" oder ein anderer Wert. Einen Rückgabewert hat die Function dann gar nicht.

    Aus dem Sub Cmd_Berechnen_Click() darfst Du dann die Functions nicht so aufrufen >
    Knicklaenge = FuncKnicklaenge
    Knicklaengenbeiwert = FuncKnicklaengenbeiwert
    ...sondern schreib die Aufrufe einfach in einem Wort untereinander, so >
    FuncKnicklaenge
    FuncKnicklaengenbeiwert


    4. "- 1" oder "-1" (mit und ohne Leerzeichen)
    Auch mit dem Leerzeichen wird das als numerisch erkannt.
    Wenn in den folgenden ElseIfs nicht sowieso ein Mindestwert Bedingung ist, musst Du wohl ein zusätzliches ElseIf einbauen.
    Die Phantasie der User ist ja grenzenlos...
    Mit der gleichen ElseIf-Zeile für negative Werte kannst Du auch noch anderen Unsinn abfangen, zB Gebäudehöhe = 100cm >>>
    ElseIf Gebaeudehoehe < 200 Then


    5. Nachweis
    Wenn der Nachweis erbracht wird, ist alles Vorherige schon geprüft und fehlerfrei... und damit das Error-Label leer.
    Also kannst Du im Error-Label diesen Nachweis anzeigen lassen.
    Im Abschnitt wo Du alle anderen Label füllst, hängst Du einfach noch diesen Code an >
    Code:
    If VorhSigma <= ZulSigma Then
        lblError = "Der Nachweis ist erfüllt!"
    Else
        lblError = "Der Nachweis ist nicht erfüllt"
    End If

    >>> Jetzt bleibt noch das Uebertragen der Werte in ein Tabellenblatt (Seite4, Punkt g)
    In einem neuen Tabellenblatt ein schöne Liste mit den Namen alle Eingabe- und Ausgabewerte erstellen.
    Daneben können dann die Werte, die der Code ja alle schon gespeichert hat, eingefügt werden.
    Das machen wir dann auch noch...

    Gruss Urs
     
    Last edited: Oct 16, 2009
  14. Tiffiklotz

    Tiffiklotz Byte

    Bzgl. der Ausgabe der Werte in Excel habe ich eine tolle Idee. In wie weit die umsetzbar ist, weiß ich allersings nicht.

    Momentan habe ich für die Prüfung, ob das Verfahren geeignet ist, eine MsgBox. Für den Nachweis das Label. Auf Grund der Prioritäten werde ich das tauschen!

    Nun stelle ich mir eine Windows-Standard-Meldung mit den Auswahlmöglichkeiten "OK" und "Abbrechen" vor. So etwas könnte man auch dort einbauen *schwärm*

    "Der Nachweis ist erfüllt!"

    [Zurück zu VBA] [zurück zu Excel]

    Oder vllt. sogar: [Zu Excel] [Werte ausdrucken]

    Ausdrucken über VBA hatte ich mal in der Vorlesung, ich hoffe, ich finde es wieder ...

    oder so etwas in der Art ...


    Die anderen kleinen Problemchen hoffe ich Heute Nachmittag selbst lösen zu können. Fast alles klappt schon! :D
     
  15. Urs2

    Urs2 Megabyte

    Das verstehe ich nicht ...

    Zuerst prüfst die auf falsche oder unsinnige Eingaben und meldest fortlaufend jeden Fehler zur Korrektur (wie in meinem #24 beschrieben)

    Dann prüfst Du mit den gleichen Ifs und GoTos auf Ausschlusskriterien und meldest jedesmal.
    Weiter geht es nur, wenn die Vorgaben passend geändert würden.

    Warum musst Du jetzt am Schluss nochmals melden?
    Dort kann die Meldung ja nur sein "Kriterien erfüllt", sonst wäre der Code ja gar nie bis dorthin gekommen...

    Wenn es denn sein muss, kannst Du ins lblError einen Zweizeiler schreiben >

    Ausschlusskriterien erfüllt
    Spannungsdinger erfüllt/nicht erfüllt

    Gruss Urs
     
  16. Tiffiklotz

    Tiffiklotz Byte

    Zuerst wird geprüft, ob die Eingaben plausibel sind.
    Wenn ja, muss geprüft werden, ob das Verfahren geeignet ist.
    Wenn ja, müssen die Werte berechnet werden und anschließend in Excel ausgegeben werden.

    Ich stelle mir die Berechnung so vor:
    In meinem lblError erscheint eine Meldung, dass das Verfahren geeignet ist. (Evtl. entferne ich diese noch, da sie unnötig ist)
    Es erscheint ein PopUp (MsgBox)
    "Die Berechnung wurde erfolgreich durchgeführt!"
    Und wenn es nicht zu viel Aufwand macht, noch zwei Buttons.
    Mit einem kommt man in die AusgabeExcel, mit dem Anderen kann man die Ausgabe ausdrucken.

    Etwa in diesem "Design", falls es möglich ist
    [​IMG]


    Das Blaue ist nur optional, war eine eigene Idee :)

    Urs, ich habe dir mal per PN einen Scan zukommen lassen ;)
    Ich spiele auf die "Zusatzaufgabe" an...
    Hast du eine Idee, wie das geht? :bahnhof:

    Ich werde mich nachher erstmal an die letzten Bugs setzen, jetzt muss ich noch etwas erledigen!

    Bis später,
    Matthias
     
  17. Tiffiklotz

    Tiffiklotz Byte

    So, ich war flei&#223;ig!

    Das VBA-Programm l&#228;uft fehlerfrei ... zumindest der Teil, den ich habe!

    Folgende Abfrage habe ich vorerst gel&#246;scht, da sie trotz korrekter Eingabe der Variablen Fehler meldete:
    Code:
        If (LichteGeschosshoehe) >= (Gebaeudehoehe) Then
            errMessage = "Ihre Geschossh&#246;he ist gr&#246;&#223;er als ihr Geb&#228;ude." & vbCr & _
                        "Bitte &#252;berpr&#252;fen sie Ihre Eingaben."
        GoTo errMessage
        End If
    Einige Kleinigkeiten bem&#228;ngel ich dennoch:

    - Wie kann ich auszugebene Werte Runden lassen?
    - Ein kleiner Bug bei der Auslesung von SigmaNull aus dem Excel-Tabellenblatt: Das Programm liest in die Cbo_Box immer das ge&#246;ffnete Tabellenblatt aus. Wenn ich also mein 2. Tabellenblatt ge&#246;ffnet habe, so werden sinnlose Werte eingelesen :(
    Ich habe zwar alles genau so gemacht, wie du sagtest und die Namen alle richtig(!!!) angepasst, aber wenn sich dies nicht beheben l&#228;sst, ist es nicht schlimm.

    Nun muss ich die Ausgabe an Excel machen.

    - Wie kann ich einen berechneten Wert in eine Bestimmte Zelle in ein bestimmtes Tabllenblatt &#252;bernehmen?


    Sch&#246;nes Wochenende,
    Matthias
     
    Last edited: Oct 16, 2009
  18. Urs2

    Urs2 Megabyte

    Danke!
    Gleichfalls sage ich vorerst nicht... hättest Du denn auch noch Zeit für ein schönes Wochenende?
    Wann ist der Abgabetermin ?


    1. ...Wenn ja, müssen die Werte berechnet werden und anschließend in Excel ausgegeben werden...
    Nein, die Werte sind ja schon berechnet und in den Variablen gespeichert, sie müssen nur noch im Blatt eingetragen werden.
    Prüfen und Berechnen macht der Code... so wie Du ihn hast. Nach der Ausgabe ins UserForm kann die gleiche Ausgabe aus den gleichen Variablen auch noch in ein Arbeitsblatt geschrieben werden...
    Dazu 2 Möglichkeiten >
    - die Werte werden automatisch, ohne Zutun des Users, jedes mal in das TabellenBlatt geschrieben
    ...mir scheint, das entspreche der Vorgabe...
    - ein Button "Uebertragen ins Tabellenblatt" macht das nur auf Anfrage.
    Automatisch wäre einfacher, auf Anfrage ginge aber auch...
    Und nun ?


    2. Schlussausgaben zu Kriterienerfüllungen >
    Wenn Du unbedingt willst, dass am Ende trotz keiner Fehleranzeige, noch eine entsprechende Meldung kommt, dann >

    Aendere Punkt5 in meinem #33 so >
    Code:
        'neu zu deklarierende Variablen...
        '...die damit auch ins Tabellenblatt übertragen werden können >
        '">>> strNachweis" und "strSigma"
        
        
    strNachweis = "Die Kriterien für das vereinfachete Verfahren sind erfüllt"
    
    If VorhSigma <= ZulSigma Then
        strSigma = "Kriterium zulässige Spannung ist erfüllt"
        lblError = strNachweis & vbCr & strSigma
    Else
        strSigma = "Kriterium zulässige Spannung ist NICHT erfüllt"
        lblError = strNachweis & vbCr & strSigma
    End If
    Dieser Code schreibt die beiden Meldungen in zwei Zeilen in das lblError


    3. Ausgabe ins Tabellenblatt >
    Deine "tolle Idee" war offensichtlich nicht das Gelbe vom Ei...
    Im Cbx_Berechnen, nach der Ausgabe ins Userform, setze diesen Code >
    Code:
                'zuerst TabellenBlatt mit der AusgabeTabelle aktivieren
    ActiveWorkbook.Sheets("NameDeinesBlattesMitDerAusgabetabelle").Select
                'dann einzelne Zellen füllen
                'Cells(Zeilennummer, Spaltennummer) ... Spalte 6 = Spalte G
    Cells(10, 6) = Wanddicke
    Cells(11, 6) = LichteGeschosshoehe
    Cells(12, 6) = Verkehrslast
    Cells(13, 6) = Gebaeudehoehe
                'usw, je nach dem, wie Deine Darstellung aussieht
            'wenn Du willst, kannst Du den Fokus jetzt wieder auf ein anderes Blatt setzen
    ActiveWorkbook.Sheets ("DasGewünschteBlatt")
    

    4. SigmaNull aus falschem Tabellenblatt gelesen
    Versuche es einmal so >
    Im Private Sub UserForm_Initialize(), nach der Zeile "Dim rngSigma As Range"
    füge diese Zeile ein >
    ActiveWorkbook.Sheets("NameDesBlattesMitDerSigmaTabelle").Select


    5. Zusatzaufgaben >
    Mir ist nicht so ganz verständlich was da gewünscht wird...
    ...haben wir diese Vorgabe nicht schon erfüllt, in dem wir im Dropdown nur die Kombinationen mit eingetragenem SigmaNull anzeigen ?
    Ich verstehe das im Moment jedenfalls so...

    Gruss Urs
     
  19. Urs2

    Urs2 Megabyte

    Gerundet wird mit dem Befehl Round(Zahl, Anzahl Nachkommastellen)
    also mit obigem Beispiel >

    Cells(30,6) = Round(VorhSigma, 2)

    Gruss Urs
     
  20. Tiffiklotz

    Tiffiklotz Byte

    Also ich habe nun alles so, wie es sein soll. Mit zwei kleinen Ausnahmen.

    1) Ich wähle die Wanddicke 17,5 cm. Meine Excel-Formel (siehe #3) ist korrekt, und gibt mir bei Wanddicke = 17,5 cm (manuell eingegeben) den Knicklängenbeiwert 0,75 aus. Wenn allerdings die 17,5 cm aus VBA übertragen werden, spuckt er mir einen Knicklängenbeiwert von 1 aus. Alle anderen Ausgaben und Beiwerte sind korrekt.
    (mit diesem kleinen Bug kann ich leben)

    2) Das Runden. Mir ist nicht ganz klar, an welche Stelle meines Codes ist den Round Befehl setzen soll. Ich möchte, dass die Zahlen in der Label-Ausgabe auf zwei Nachkommastellen gerundet werden.
    Die Rundung in dem Excel-Datenblatt habe ich m.H. der Zellenformatierung gemacht.

    Vielen Dank Urs, dass ich es überhaupt so weit gebracht habe!!!
    Abgabetermin ist erst Anfang Januar, aber ich möchte es gerne möglichst früh fertig haben, um dann den Kopf frei zu haben für die kommenden Klausuren. Die Aufgabe besteht auch insg. aus 4 Teilen.
    (1. VBA, 2. Excel, Überprüfung und Kommentierung des VBA-Codes, 3. Word, Bedienungsanleitung für das Programm, 4. CAD).

    Insofern kann ich mein Wochenende auf jeden Fall genießen!
    Vielen Dank noch einmal.

    Noch einmal zur Zusatzaufgabe:
    Es soll angezeigt werden, für welche SigmaNull-Werte (eigentlich für welche Stin-Mörtel-Kombinationen) der Nachweis erfüllt wird.
    Vllt. Kann man dafür ein Label erstellen, auf dem angezeigt wird:
    - Wenn der Nachweis erfüllt ist: "Mit diesen Kombinationen wäre der Nachweis auch erfüllt"
    - Wenn der Nachweis nicht erfüllt ist: "Mit diesen Kombinationen wäre der Nachweis erfüllt"

    Lieben Gruß,
    Matthias
     
Thread Status:
Not open for further replies.

Share This Page