Hallo, wie setze ich diesen Code um?

Was steht in BA10, BJ1 und M40


BA10 ist die Stückzahl, in BJ1 wird eine Eingaben aus einer Textbox übernommen (Prozentzahl) und in M40 steht ein Ergebnis einer Berechnung.

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Meine Anwort muss ich mir noch mal überdenken ich versuchs mal.

    For i = 1 To 4
    Exit For
    Next i
    Select Case i

Das Next gehört nach dem Select    
Woher ich das weiß:Beruf – Früher Softwareentwickler bei CSDIT

Mit Exit For steigst du gleich aus.

1

Hi,

wenn ich es so mache, kommt die Meldung "Next ohne For":

    For i = 1 To 4
    
    Select Case i


    Next i
    Case 1
    If CVar(total) >= 0 <= 0.9 Then
    ElseIf CVar(total) > 1 < 1.5 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes Teil, mindestens " & CVar(result) & " Teil(e)."
    
    Case 2
    If CVar(total) = 1 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    
    Case 3
    If CVar(total) >= 1.5 <= 1.9 Then
    ElseIf CVar(total) > 2 <= 100 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes " & CVar(total) & ". Teil, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen."
    
    Case 4
    If CVar(total) = 2 Then
    ElseIf CVar(result) = 2 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes " & CVar(total) & ". Teil."
    Exit For
    End Select
1
@fx8350

Nein um Gottes Willen.... so

For i = 1 To 4
    
    Select Case i

    Case 1
    If CVar(total) >= 0 <= 0.9 Then
    ElseIf CVar(total) > 1 < 1.5 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes Teil, mindestens " & CVar(result) & " Teil(e)."
    
    Case 2
    If CVar(total) = 1 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    
    Case 3
    If CVar(total) >= 1.5 <= 1.9 Then
    ElseIf CVar(total) > 2 <= 100 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes " & CVar(total) & ". Teil, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen."
    
    Case 4
    If CVar(total) = 2 Then
    ElseIf CVar(result) = 2 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes " & CVar(total) & ". Teil."
    'Exit For <---- Wirklich ?
    End Select
Next i
1

Haha, sorry, ich bin so schlecht, ich versuche es halt irgendwie.

Aber das funktioniert auch nicht, jetzt kommt die Fehlermeldung "Case ohne Select Case". Ob das mit dem Case überhaupt funktioniert, weiß ich auch nicht...

0
@fx8350

Probier mal Case Else Darunter zu setzen. Es ginge auch anders. zB.


Select Case
Case CVar(total) >= 0 And CVar(total) <= 0.9
...
Case Else
End Select

Damit sparst du dir die Schleife.
1
@geri3d

Eventuell musst du schreiben

Select Case True
1
@geri3d

Verstehe nicht, wie ich das Case Else setzen soll. Mal ein Beispiel (ohne Case Else) (Edit: Wenn ich nur Select Case schreibe kommt eine Fehlermeldung):

    Select Case 1
    Case CVar(total) >= 0 <= 0.9
    Case CVar(total) > 1 < 1.5
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes Teil, mindestens " & CVar(result) & " Teil(e)."
    Case CVar(total) = 1
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    Case CVar(total) >= 1.5 <= 1.9
1
@fx8350

Select Case ist wie If nur die Bedingung stimmt bei dir nicht

Case CVar(total) >= 0 <= 0.9

Muss sein

Case CVar(total) >= 0 And CVar(total) <= 0.9
1
@geri3d

Da mir die Case-Lösung zur Lösung des Problems am hilfreichsten war und Du so geduldig bist und mir schon öfters geholfen hast, hast Du auch die Bewertung entsprechend verdient. Danke.

1

Ein Hauptproblem ist, dass dein Code

A - die Textboxen nicht kennt/sieht (du brauchst entweder ein Verweis auf ein Formular oder du musst die Textboxen (Shape Textfelder) speziell übergeben

B - ElseIf's brauchen ordentliche End If's - das kollidiert und ruiniert dein Select Case

C - deine For Schleife ist im Moment sinnlos (oder du hast den Teil für uns raus)

D - einige If's in den Select Cases sind auch sinnlos (oder der Teil fehlt für uns)

E - was das "Select Case 4" im Case 4 sucht, habe ich bisher nicht entschlüsseln können. Auch zwei Case 4 zu haben macht wenig Sinn aus meiner Sicht. Daher habe ich das zusammengefasst. Aber der Teil muss logisch überarbeitet werden.

ich habe mal eine "lauffähige Version" hier abgestellt, da ich aber keine echten Prüfdaten habe, und ich den allgemeinen Programmsinn noch nicht ganz entschlüsselt habe, kann ich die Ergebnisse nicht selbst prüfen:

https://www.magentacloud.de/share/pmpnep1.0j

--> Textbox.xlsm

Habe einige Kommentare hinterlassen, die dir helfen. Hab auch ein Option Explicit gesetzt, das hilft um Variablenverwechslungen vorzubeugen, es zwingt dich auch ordentlich zu deklarieren.

Hoffe, das hilt dir aber weiter auf den richtigen Kurs zu kommen.

Hi, ja genau, das ist sinnlos. Ich wollte eigentlich nur verdeutlichen, was ich möchte. Je nach "Ergebnis" soll eben ein bestimmter Text in einen Zellbereich geschrieben werden.

Ursprünglich war es so gelöst, es sind aber nun weitere Möglichkeiten hinzu gekommen:

Private Sub inspectionlot()
    Application.ScreenUpdating = False
    Dim Interval As String
    Dim result As Integer
    Dim total As Integer
    If TextBox_Interval.Value = "" Then Exit Sub
    If TextBox_Pieces.Value = "" Then Exit Sub
    result = Range("BA10").Value * Range("BJ1").Value / 100
    Range("M40").Value = CVar(result)
    If result < 1 Then Range("M40").Value = 1
    total = Range("BA10").Value / Range("M40").Value
    If Range("M40").Value > 1 Then
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes " & CVar(total) & ". Teil. Erstes und letztes Teil sind immer zu prüfen."
    Else
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ein Teil."
    End If
    Range("B41").Value = CVar(Interval)
    Application.ScreenUpdating = True
End Sub
0
Ergänzend zu KelrycorfgSorge dafür, dass Dinge die miteinander vergleichen werden auch von der gleichen Sorte sind.Eine Textbox liefert grundsätzlich einen "TextString"
    If TextBox_Pieces.Value = 2 Then
Du vergleichst diesen aber mit einer Ziffer.
Zunächst gilt es zu prüfen, ob in der Textbox eine Ziffer steht
If IsNumeric(TextBox_Pieces.Value) then
  If Conversion.CDbl(TextBox_Pieces.Value) = 2 then
Dein kompletter Code muss mit dieser "Typen korrekter" Behandlung überarbeitet werden.

Ok, ich werde das morgen mal ändern. Es klappt nun (fast) mit dem Vorschlag von geri3d. Aber ich muss weitere "Prüfungen " einbinden, damit auch immer der richtige String gewählt wird.

1

So sieht es jetzt aus:

Private Sub inspectionlot()
    Application.ScreenUpdating = False
    Dim Interval As String, result As Double, total As Double, i As Double, r As Double
    If TextBox_Interval.Value = "" Then Exit Sub
    If TextBox_Pieces.Value = "" Then Exit Sub
    If IsNumeric(TextBox_Pieces.Value) Then
    If Conversion.CDbl(TextBox_Pieces.Value) = 2 Then result = 2
    End If
    result = Range("BA10").Value * Range("BJ1").Value / 100
    If result <= 1.5 Then result = 1
    If TextBox_Pieces.Value = 2 Then result = 2
    Range("M40").Value = CVar(result)
    total = TextBox_Pieces.Value / Range("M40").Value
    i = Range("BA10").Value - 2
    
    'r = MAX Range("BA10").Value-MIN(A5:A10)
    'total = Range("BA10").Value / Range("M40").Value
    'i = CVar(total)
    total = Application.WorksheetFunction.Round(total, 2)
    Select Case True
    
    'Case Is >= i and <
    'Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    
    Case total >= 1 And total < 1.5
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes Teil, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen!"
    Case total = 1 Or total = 100 Or TextBox_Interval.Value = 100
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    Case result = 1
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ein Teil."
    Case result = 2
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, erstes und letztes Teil."
    Case total >= 1.5 And total <= 1.9 Or total > 2 And total < 100
    total = Application.WorksheetFunction.Round(total, 0)
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ca. jedes " & CVar(total) & ". Teil, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen."
    End Select


    Range("B41").Value = CVar(Interval)
    Application.ScreenUpdating = True
End Sub

Ich versuche nun vergebens noch eine Prüfung einzugeben. Und zwar wenn die Differenz zwischen Range("BA10").Value und Range("M40").Value maximal 2 beträgt, soll ebenfalls

Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."

erscheinen.

Ich habe es nicht geschafft...

0
@fx8350

Zunächst musst du deine Differenz in einen Absolutwert ändern
test = Math.Abs(WertA - WertB) 'Egal wie rum
if test <= 2 then
'hier die MAX 2 Routine

1
@IchMalWiederXY

Erstmal danke, ich habe es jetzt geschafft, wie es aussieht.

Da geri3d nun schon oft geholfen hat und die Case-Lösung hier für mich der "Durchbruch" war, möchte ich ihn auch auszeichnen. Er hat sich auch viel Mühe gegeben. Ich hoffe Du bist mir nicht böse. Ich habe aber weitere Probleme, die ich nun noch lösen muss :-).

Private Sub inspectionlot()
    Application.ScreenUpdating = False
    Dim Interval As String, result As Double, total As Double, i As Double, r As Double
    If TextBox_Interval.Value = "" Then Exit Sub
    If TextBox_Pieces.Value = "" Then Exit Sub
    If IsNumeric(TextBox_Pieces.Value) Then
    If Conversion.CDbl(TextBox_Pieces.Value) = 2 Then result = 2
    End If
    result = Range("BA10").Value * Range("BJ1").Value / 100
    If result <= 1.5 Then result = 1
    If TextBox_Pieces.Value = 2 Then result = 2
    Range("M40").Value = CVar(result)
    total = TextBox_Pieces.Value / Range("M40").Value
    i = Range("BA10").Value - 2
    r = Math.Abs(Range("BA10").Value - Range("M40").Value)
    total = Application.WorksheetFunction.Round(total, 2)
    Select Case True
    Case total = 1 Or total = 100 Or TextBox_Interval.Value = 100 Or r <= 2
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes Teil."
    Case total >= 1 And total < 1.5
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen!"
    Case result = 1
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ein Teil."
    Case result = 2
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, erstes und letztes Teil."
    Case total >= 1.5 And total <= 1.9 Or total > 2 And total < 100
    total = Application.WorksheetFunction.Round(total, 0)
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, ungefähr jedes " & CVar(total) & ". Teil, mindestens " & CVar(result) & " Teil(e). Erstes und letztes Teil sind immer zu prüfen."
    Case total = 2
    total = Application.WorksheetFunction.Round(total, 0)
    Interval = "Prüfintervall " & TextBox_Interval.Value & "%, jedes " & CVar(total) & ". Teil. Erstes und letztes Teil sind immer zu prüfen."
    End Select
    Range("B41").Value = CVar(Interval)
    Application.ScreenUpdating = True
End Sub
0
@fx8350

Keine Sorge. Ich bin hier nicht unterwegs um "ausgezeichnet" zu werden.
..und sollte ein Folge Problem auftauchen, werde ich weiterhin gerne mitwirken.
So wie ich dieses Programm sehe, wäre es aber auch ohne VBA lösbar gewesen.

1
@IchMalWiederXY

Hi, klar wäre das so lösbar gewesen, ist ja quasi Prozentrechnung. Ich mache das zum Spaß aber es wird ja doch immer komplizierter weil ich immer mehr Einfälle habe. Und dann kommen Fehler. Ich möchte halt Punkte sammeln und etwas schönes vielleicht auf der Arbeit präsentieren. Nur mit 40 Jahren fällt es mir schwer...

1
@fx8350

Es ist nie zu spät :-)
Und VBA, obwohl etwas belächelt, kann sehr viele Standard Dinge in Unternehmen (oder auch privat lösen) lösen.

1
@IchMalWiederXY

Warum belächelt? Irgendwie finde ich es interessant, wobei ich es nicht gut kann, aber immerhin ermöglicht es Dinge, die man so nicht unbedingt lösen kann, ohne große Programmierkenntnisse zu haben. Wobei ich auch überfordert damit bin :-).

0

Was möchtest Du wissen?