VBA-Code läuft noch nicht rund

Guten Abend zusammen,

habe folgende Codes vorliegen:

Modul1 :

Sub Berechne(strWas As String, strWo As String)
Dim strZ As String, ZeiS As Long, ZeiP As Long, Zei As Long
Dim rngWo As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Tabbi")
 Set rngWo = .Range(strWo)
 rngWo.Offset(0, 1).Resize(154, 3).ClearContents
 If strWas = "Nix machen" Then GoTo Ende
 For Zei = 0 To 150 Step 5
 If rngWo.Offset(Zei, 0) = "" Then GoTo Ende
 For ZeiS = 0 To 3 Step 1
 If Alle(strWas, rngWo.Offset(Zei + ZeiS, 0)) = True Then
 rngWo.Offset(Zei + ZeiS, 1).Value = Range("I2")
 End If
 Next ZeiS
 Next Zei
End With
Ende:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Function Alle(Was As String, ByRef Zelle As Range) As Boolean
Dim intI As Integer, Wert As Integer, intVergleich As Integer
Select Case Was
 Case "Quersumme"
 intVergleich = Tabelle1.Cells(8, Zelle.Column).Value
 For intI = 1 To Len(Zelle.Value)
 Wert = Wert + CInt(Mid(Zelle.Value, intI, 1))
 Next
 Alle = IIf(Wert = intVergleich, True, False)
 Case "Durch"
 intVergleich = Tabelle1.Cells(8, Zelle.Column + 4).Value
 On Error Resume Next
 Alle = IIf(Zelle.Value Mod intVergleich = 0, True, False)
 On Error GoTo 0
 Case "Primzahl"
 For intI = 2 To Int(Sqr(Zelle.Value))
 If Zelle.Value Mod intI = 0 Then Exit For
 Next intI
 Alle = intI \> Int(Sqr(Zelle.Value))
 Case Else
 'nix
End Select
End Function

Tabelle1:

Option Explicit

Private Sub Runde1\_Change()
Call Berechne(Runde1.Value, "F13")
End Sub

Private Sub Runde2\_Change()
Call Berechne(Runde2.Value, "M13")
End Sub

Private Sub Runde3\_Change()
Call Berechne(Runde3.Value, "T13")
End Sub

Private Sub Runde4\_Change()
Call Berechne(Runde4.Value, "AA13")
End Sub

Private Sub Runde5\_Change()
Call Berechne(Runde5.Value, "AH13")
End Sub

Private Sub Runde6\_Change()
Call Berechne(Runde6.Value, "AO13")
End Sub

Private Sub Runde7\_Change()
Call Berechne(Runde7.Value, "AV13")
End Sub

Private Sub Runde8\_Change()
Call Berechne(Runde8.Value, "BC13")
End Sub

Private Sub Runde9\_Change()
Call Berechne(Runde9.Value, "BJ13")
End Sub

Private Sub Runde10\_Change()
Call Berechne(Runde10.Value, "BQ13")
End Sub


Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
Dim Ber, Ziel, Index As Integer, I, Wert
If Target.Count 1 Then Exit Sub
If Target.Row 166 Then Exit Sub
Ber = Array("F", "M", "T", "AA", "AH", "AO", "AV", "BC", "BJ", "BQ", "BX", "CE", "CL", "CS", "CZ")
Ziel = Array("F2", "P2", "W2", "AD2", "AK2", "AR2", "AY2", "BF2", "BM2", "BT2", "CA2", "CH2", "CO2", "CV2", "DC2")
Index = -1
For I = LBound(Ber) To UBound(Ber)
 If Target.Column = Range(Ber(I) & 1).Column Then
 Index = I
 Exit For
 End If
Next I
If Index = -1 Then Exit Sub
Wert = Application.Sum(Target.Offset(-(Target.Row + 2) Mod 5, 0).Resize(4, 1))
Range(Ziel(Index)).Value = Wert
End Sub

Private Sub Worksheet\_Change(ByVal Target As Range)
If Target.Count \> 1 Then Exit Sub
If Target.Row \> 161 Or Target.Row 5 Then Exit Sub
If Target.Value = "" Then Exit Sub
If Application.CountIf(Range("E13:E166"), Target.Value) \> 1 Then
 Application.EnableEvents = False
 MsgBox Target.Value & " ist doppelt vorhanden"
 Target.ClearContents
 Target.Select
 Application.EnableEvents = True
End If
End Sub

'Private Sub Worksheet\_Change(ByVal Target As Range)
'Set Target = Intersect(Target, Range("F13:F200"))
'If Target Is Nothing Then Exit Sub
'Application.EnableEvents = False
'Call Berechne(Tabelle2.OLEObjects("Runde" & 1).Object.Value, "F13")
'Application.EnableEvents = True
'End Sub

Was ich nun gerne hätte ist folgendes: In einer ComboBox wird eine Funktion(Quersumme,Durch,Primzahl oder nix machen ausgewählt. Dann entsprechend der Auswahl die gewünschte Quersumme in F8 oder den Teiler in J8 eingegeben. In Zelle I2 noch den Bonus,das wars. Nun soll der Code nach jeder Eingabe in den Zellen F13-F166 prüfen und ggf. den Wert aus I2 in die Felder G13-G166 setzen.

Reinhard war so nett und hat mir eben diesen Code gebastelt der auch eigentlich funktioniert,nur das bei Auswahl sofort der Wert aus I2 in die Zellen G13-G166 setzt.

Nun hat er mir die Korrektur gepostet,die ich aber nicht einbauen kann,da ich schon eine „Private Sub Worksheet_Change(ByVal Target As Range)“ habe.

Nun meine Frage: Wie verschmelze ich die beiden,damit dieser Code auch ordentlich funzt?

Habe die Tabellle hier mal hochgeladen.

http://www.uploadagent.de/show-176315-1313519048.html

LG Frank

Nun hat er mir die Korrektur gepostet,die ich aber nicht
einbauen kann,da ich schon eine „Private Sub
Worksheet_Change(ByVal Target As Range)“ habe.

Nun meine Frage: Wie verschmelze ich die beiden,damit dieser
Code auch ordentlich funzt?
http://www.uploadagent.de/show-176315-1313519048.html

Hallo Frank,

scheinbar klappt es mit nachstehendem Code.

Hier die geänderte Mappe

Gestestet ist Runde1 und Runde2 wie du siehst.

In der Prozedur Berechne hast du ja diese Codesequenz
für die Bonuszuteilung

If Alle(strWas, rngWo.Offset(Zei + ZeiS, 0)) = True Then
 rngWo.Offset(Zei + ZeiS, 1).Value = Range("I2")
End If

D.h. in allen Runden gibt es den gleichen Bonus.
Wenn du pro Runde ggfs. unterschiedliche Bnis verteilen willst so setze das ein:

If Alle(strWas, rngWo.Offset(Zei + ZeiS, 0)) = True Then
 rngWo.Offset(Zei + ZeiS, 1).Value = Cells(2, rngWo.Column + 3)
End If

Die Bonis stehen deann in I2, P2, W2,…

Gruß
Reinhard

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
Dim Ber, Index As Integer, I, Wert
If Target.Count 1 Then Exit Sub
If Target.Row 166 Then Exit Sub
Ber = Array("F", "M", "T", "AA", "AH", "AO", "AV", "BC", "BJ", "BQ", "BX", "CE", "CL", "CS", "CZ")
Index = -1
For I = LBound(Ber) To UBound(Ber)
 If Target.Column = Range(Ber(I) & 1).Column Then
 Index = I
 Exit For
 End If
Next I
If Index = -1 Then Exit Sub
Wert = Application.Sum(Target.Offset(-(Target.Row + 2) Mod 5, 0).Resize(4, 1))
Range(Ber(Index) & "2").Value = Wert
End Sub

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim OK As Boolean, N As Integer
On Error GoTo hell
If Target.Count \> 1 Then Exit Sub
If Target.Row \> 166 Or Target.Row 5 Then
 For N = 6 To 69 Step 7
 If Target.Column = N Then
 OK = True
 Exit For
 End If
 Next N
Else
 OK = True
End If
If OK = False Then Exit Sub
If Target.Value = "" And Target.Column = 5 Then Exit Sub
If Target.Column = 5 Then
 If Target.Value = "" Then Exit Sub
 If Application.CountIf(Range("E13:E166"), Target.Value) \> 1 Then
 Application.EnableEvents = False
 MsgBox Target.Value & " ist doppelt vorhanden"
 Target.ClearContents
 Target.Select
 Application.EnableEvents = True
 End If
Else
 Application.EnableEvents = False
 Call Berechne(Tabelle1.OLEObjects("Runde" & CInt((Target.Column + 1) / 7)) \_
 .Object.Value, Cells(13, Target.Column).Address(0, 0))
End If
hell:
If Err.Number 0 Then MsgBox Err.Number & vbCr & Err.Description
Application.EnableEvents = True
End Sub

Hallo Reinhard,

nun habe ich die Tabelle getestet. Die Funktion „Quersumme“ funktioniert einwandfrei,sowohl Runde 1 als auch in Runde 2. Die Funktionen „Primzahl“ und „Durch“ leider nicht.

Bei beiden Funktionen werden die Zellen G14-G16 bzw. N14-N16 gefüllt,sobald ich in die erste Zelle(F13 bzw. M13) einen Wert eingebe. Das wiederum würde das Gesamtergebnis verfälschen,wenn die restlichen Zellen leer bleiben würden.

Woran kann das liegen? Verwende ich eine andere Excel Version?(2003).Oder habe ich etwas in den Optionen nicht richtig eingestellt?

Wenn du den Code getestet hast,muss der Fehler ja irgendwie bei mir liegen.

Gruss Frank

Wenn du den Code getestet hast,muss der Fehler ja irgendwie
bei mir liegen.

Hallo Frank,

nicht unbedingt, ich hab da nicht alles genau geprüft.
Muß jetzt weg, schau nachher wieder in die mappe.

Kannst ja zwischenzeitlich weitertesten, sicherheitshalber auch noch eine Combobox für Runde 3 erstellen, umbenennen in „Runde3“ nicht vergessen.
Wenn du dann in Runde1- Runde3 wahllos rumtestet dann müßte was da geht auch in allen anderen Runden gehen.

Und geb auch Daten an der Untegrenze ein, also bei den 160er zeilen um da zu testen, vielleicht kam ich da im Code durcheinander mit 161, 166 usw.

dann berichte von Fehlern und wenn das eben nicht drin stand, was ist mit dem Bonus, einer für alle oder einer pro Tisch?

Gruß
Reinhard

Hallo Reinhard,

habe also getestet und folgendes festgestellt:

Wenn in Zelle F13 keine Zahl eingegeben ist, dann funktionieren auch alle anderen Zellen nicht. Und das bei keiner der drei Funktionen.

Wenn in F13 ein Wert steht,aber in F18 keiner,dann funktionieren F23 ff. auch nicht usw. Das heisst,es muss ein Wert in F13 stehen und es darf keine Zelle leer sein.

Gruss Frank

Hallo Frank,

habe also getestet und folgendes festgestellt:

Wenn in Zelle F13 keine Zahl eingegeben ist, dann
funktionieren auch alle anderen Zellen nicht. Und das bei
keiner der drei Funktionen.

ja,
das liegt an dieser Codezeile in Berechne, setz ein Hochkomma davor.

If rngWo.Offset(Zei, 0) = „“ Then GoTo Ende

Aus Erfahrung weiß ich daß es kontraproduktiv ist sie gleich komplett zu löschen.
Das kann man dann machen wenn der gesamtcode flutscht und waterproofed funktioniert, dann wirft man sowas raus.

Absolut nicht ungewohnt ist nämlich daß kaum das ich Zeilen gelöscht habe und was am Code ändere genau dies zeilen wieder brauche :smile:
Völlig normal.

Wenn in F13 ein Wert steht,aber in F18 keiner,dann
funktionieren F23 ff. auch nicht usw.

? glaub ich so nicht, muß ich testen, ändere mal das so wie ich oben schrieb.

Das heisst,es muss ein
Wert in F13 stehen und es darf keine Zelle leer sein.

Wenn es trotz Weglassen der einen Codezeile so ist muß ich mal schauen.

Mach jetzt erstmal nix außer weitertesten um auf andere Fehler zu stoßen.

Um die die du in den letzten 2-3 Postings genannt hast kümmere ich mich.

Und grad die Extreme testen. Was ist wenn einer keine zahl eingibt sondern eine zahl mit leerzeichen hintendran usw.
Da böte sich Daten—Gültigkeit—Ganze zahl an.

PS: ich weiß grad nicht, habe ich das schon mal gefragt und deine Antwort vergessen oder noch nicht gefragt, wie heißt denn das Spiel was ihr spielt?

Gruß
Reinhard

Hallo Reinhard,

habe dieser Zeile nun ein Hochkomma vorangestellt und nun passiert folgendes:

Funktion „Quersumme“ funktioniert einwandfrei,egal wo nun ein Wert in der Zelle steht. Bei den anderen beiden Funktionen wird direkt nach Auswahl aus der ComboBox der Wert aus I2(Bonus) in alle Zellen der Spalte G gesetzt. Gleiches gilt für Runde 2.

Das Spiel heisst Kniffeln, aber bei uns wird es etwas anders gespielt als du es kennst…lol

Gruss Frank

Hallo Frank,

http://www.uploadagent.de/show-176571-1313936103.html

hat nachfolgende Codes.

Gruß
Reinhard

Blatt Trabbi:

Option Explicit

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim OK As Boolean, N As Integer, Wert
On Error GoTo hell
If Target.Count \> 1 Then Exit Sub
If Target.Row \> 166 Or Target.Row 5 Then
 For N = 6 To 69 Step 7
 If Target.Column = N Then
 OK = True
 Exit For
 End If
 Next N
Else
 OK = True
End If
If OK = False Then Exit Sub
If Target.Value = "" And Target.Column = 5 Then Exit Sub
If Target.Column = 5 Then
 If Target.Value = "" Then Exit Sub
 If Application.CountIf(Range("E13:E166"), Target.Value) \> 1 Then
 Application.EnableEvents = False
 MsgBox Target.Value & " ist doppelt vorhanden"
 Target.ClearContents
 Target.Select
 Application.EnableEvents = True
 End If
Else
 Application.EnableEvents = False
 Call Berechne(Tabelle1.OLEObjects("Runde" & CInt((Target.Column + 1) / 7)) \_
 .Object.Value, Cells(13, Target.Column).Address(0, 0))
 Wert = Application.Sum(Target.Offset(-(Target.Row + 2) Mod 5, 0).Resize(4, 1))
 Cells(2, Target.Column).Value = Wert
 Cells(3, Target.Column).Value = "Tisch " & Cells(Target.Offset(-(Target.Row + 2) Mod 5).Row, 4).Value
End If
hell:
If Err.Number 0 Then MsgBox Err.Number & vbCr & Err.Description
Application.EnableEvents = True
End Sub
Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
Dim Ber, Index As Integer, I, Wert
If Target.Count 1 Then Exit Sub
If Target.Row 166 Then Exit Sub
Ber = Array("F", "M", "T", "AA", "AH", "AO", "AV", "BC", "BJ", "BQ", "BX", "CE", "CL", "CS", "CZ")
Index = -1
For I = LBound(Ber) To UBound(Ber)
 If Target.Column = Range(Ber(I) & 1).Column Then
 Index = I
 Exit For
 End If
Next I
If Index = -1 Then Exit Sub
Wert = Application.Sum(Target.Offset(-(Target.Row + 2) Mod 5, 0).Resize(4, 1))
Range(Ber(Index) & "2").Value = Wert
Range(Ber(Index) & "3").Value = "Tisch " & Cells(Target.Offset(-(Target.Row + 2) Mod 5).Row, 4).Value
End Sub

Private Sub Runde1\_Change()
Call Berechne(Runde1.Value, "F13")
End Sub

Private Sub Runde2\_Change()
Call Berechne(Runde2.Value, "M13")
End Sub

Private Sub Runde3\_Change()
Call Berechne(Runde3.Value, "T13")
End Sub

Private Sub Runde4\_Change()
Call Berechne(Runde4.Value, "AA13")
End Sub

Private Sub Runde5\_Change()
Call Berechne(Runde5.Value, "AH13")
End Sub

Private Sub Runde6\_Change()
Call Berechne(Runde6.Value, "AO13")
End Sub

Private Sub Runde7\_Change()
Call Berechne(Runde7.Value, "AV13")
End Sub

Private Sub Runde8\_Change()
Call Berechne(Runde8.Value, "BC13")
End Sub

Private Sub Runde9\_Change()
Call Berechne(Runde9.Value, "BJ13")
End Sub

Private Sub Runde10\_Change()
Call Berechne(Runde10.Value, "BQ13")
End Sub

Modul1:

Option Explicit

Sub Berechne(strWas As String, strWo As String)
Dim strZ As String, ZeiS As Long, ZeiP As Long, Zei As Long
Dim rngWo As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Tabbi")
 Set rngWo = .Range(strWo)
 rngWo.Offset(0, 1).Resize(154, 3).ClearContents
 If strWas = "Nix machen" Then GoTo Ende
 For Zei = 0 To 150 Step 5
 If Application.Sum(rngWo.Offset(Zei, 0).Resize(4, 1)) 0 Then
 For ZeiS = 0 To 3 Step 1
 If rngWo.Offset(Zei + ZeiS, 0) "" Then
 If Alle(strWas, rngWo.Offset(Zei + ZeiS, 0)) = True Then
 rngWo.Offset(Zei + ZeiS, 1).Value = .Cells(2, rngWo.Column + 3)
 End If
 End If
 Next ZeiS
 End If
 Next Zei
End With
Ende:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Function Alle(Was As String, ByRef Zelle As Range) As Boolean
Dim intI As Integer, Wert As Integer, intVergleich As Integer
Select Case Was
 Case "Quersumme"
 intVergleich = Tabelle1.Cells(8, Zelle.Column).Value
 For intI = 1 To Len(Zelle.Value)
 Wert = Wert + CInt(Mid(Zelle.Value, intI, 1))
 Next
 Alle = IIf(Wert = intVergleich, True, False)
 Case "Durch"
 intVergleich = Tabelle1.Cells(8, Zelle.Column + 4).Value
 On Error Resume Next
 Alle = IIf(Zelle.Value Mod intVergleich = 0, True, False)
 On Error GoTo 0
 Case "Primzahl"
 For intI = 2 To Int(Sqr(Zelle.Value))
 If Zelle.Value Mod intI = 0 Then Exit For
 Next intI
 Alle = intI \> Int(Sqr(Zelle.Value))
 Case Else
 'nix
End Select
End Function