439 Aufrufe
Gefragt in Tabellenkalkulation von addeguddi Experte (2.6k Punkte)

Hallo liebe Forum Mitglieder,

wollte in einem VBA Projekt Daten änder aber ich bekomme es einfach nicht hin. Bei bestimmten Zellen soll wenn diese angeklickt werden den Wert darin steht in eine anderen Zelle übernommen werden.

Die Werte stehen in den Zellen B4 bis f15 und d16 bis f16

Beispiel: 1. Wurf Spieler 1 wirft in Zelle b10 Wert 3 dieser Wert soll dann in Zelle L5 übernommen werden. Wurf 2 in Zelle e12 Wert 45 dieser soll zum 1. Wurf addiert werden das Gleiche mit dem 3. Wurf und die würfe sollen einzel in den Zellen B18 je welche Spieler an der Reihe ist addiert werden. Habe VBA hier eingefügt und Die Darttabelle hochgeladen damit man sich die anschauen kann und hoffe, das diese Datei nicht als Vieren verseucht abgelehnt wird, da ich das schon einmal hatte und ein Kollege hatte festgestellt das Datei in Ordnung ist. Code Lautet:

https://filehorst.de/d/cvxHebjx

 

nun noch die VBA Liste

Private Sub CommandButton1_Click()
Public arrRueck(2) As Variant
Sub rueckgaengig()       HIER ZEIGT ER MIR EIN FEHLER AN

'bei Würfen 1 Wurf abziehen
If Range(arrRueck(0)).Value - 1 > 0 Then
   Range(arrRueck(0)).Value = Range(arrRueck(0)).Value - 1
 Else
   'falls 0, dann 0 löschen
   Range(arrRueck(0)).ClearContents
End If

'alte Punktezahl zurückschreiben
Range(arrRueck(1)).Value = arrRueck(2)

End Sub
Private Sub SpinButton1_Change()

If SpinButton1.Value < 1 Then SpinButton1.Value = ActiveSheet.Range("c1")
If SpinButton1.Value > ActiveSheet.Range("c1") Then SpinButton1.Value = 1

ActiveSheet.Range("g1") = SpinButton1.Value

End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim lngSpieler As Long
Dim lngSpalte As Long
Dim lngPunktSpalte As Long
Dim lngZeile As Long
Static lngErgebnis As Long


'Nur bei Klick im Bereich von B4 bis f16 ausführen
If Not Intersect(Target, Range("B4:f16")) Is Nothing Then
  'nicht in Zelle klicken
  Cancel = True
  'Nummer des Spielers einlesen
  lngSpieler = Range("g1").Value
 
  'Würfe  addieren
  'Spieler im Bereich A18 bis A77 suchen
  For lngZeile = 18 To 77
    If Cells(lngZeile, 1).Value = "Sp" & lngSpieler Then
       'Spalte für den Eintrag des Wurfes suchen
       For lngSpalte = 2 To 18
         'Prüfen, ob Wert in Zelle kleiner 3 ist
         If Cells(lngZeile, lngSpalte).Value < 3 Then
           'Wurf addieren
           Cells(lngZeile, lngSpalte).Value = Cells(lngZeile, lngSpalte).Value + 1
           'Schleife verlassen
           GoTo weiter:
         End If
       Next lngSpalte
    End If
  Next lngZeile
   
'Sprungmarke
weiter:
 
  'Punkte addieren, aber nur, wenn kein Fehlwurf
  If Target.Address <> "$f$16" Then
    'Spieler im Bereich L3 bis S17 suchen
    For lngPunktSpalte = 11 To 18 Step 2
       If Cells(3, lngPunktSpalte).Value = "Spieler " & lngSpieler Then
         'alter Punktestand in Variable speichern, aber nur, wenn der erste Wurf ausgeführt wurde
         If Cells(lngZeile, lngSpalte).Value = 1 Then lngErgebnis = Cells(5, lngPunktSpalte)
         'Punkte addieren
         Cells(5, lngPunktSpalte) = Cells(5, lngPunktSpalte) + Target.Value
         'Prüfen, ob überworfen
         If Cells(6, lngPunktSpalte).Value < 0 Then
           'alten Punktestand zurückschreiben
           Cells(5, lngPunktSpalte) = lngErgebnis
           'da keine weiteren Würfe mehr, Anzahl der Würfe auf 3 hochsetzen
           Cells(lngZeile, lngSpalte).Value = 3
         End If
         'Schleife verlassen
         Exit For
       End If
    Next lngPunktSpalte
  End If

End If

End Sub

 

14 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo Adde,

wenn du Sub rueckgaengig() nach Private Sub CommandButton1_Click() einfügst, dann zeigt er dir einen Fehler an, da du mit Sub immer ein neues Makro beginnst und du hier im laufendenen Makro ein neues Makro beginnen willst, was aber nicht geht.

Deine Datei schaue ich mich mal an.

Gruß

M.O.

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Adde,

ich habe mir mal deine Datei angesehen. Verstehe ich das richtig, dass hier jeder Spieler nacheinander ein Match zu Ende spielt?

In B18 soll das Ergebnis der ersten drei Würfe von Spieler 1 kommen, in C18 dann das Ergebnis der nächsten drei Würfe von Spieler 1 usw.?

Gruß

M.O.
0 Punkte
Beantwortet von addeguddi Experte (2.6k Punkte)

Schönen guten Morgen M.O.

erst einmal vielen Dank, dass du mir geantwortet hast. Nein, die Spieler werfen nach einander, je 3 Wurf.

Spieler 1 dann Spieler 2 usw. Also mit den Klicks in den Zellen B4 bis F16 habe ich hinbekommen. Klappt wunderbar. Bei Spieler 1 der seine 3 Würfe getätigt hat werden die Würfe in der Zelle B18 übernommen.Nun das was ich nicht hin bekomme ist: wenn Spieler 1 seine 3 Würfe macht sollten die Punkte die erzielt wurden in die Zelle L5 übernommen werden, bei dem Spieler 2 sollten die Punkte in Zelle M5 und wenn Spieler 9 oder Spieler 17 an der Reihe ist sollen diese Punkte jeweils für Spieler 9 in Zelle L12 und Spieler 17 in Zelle L19 übernommen Werden.

Das mit dem Rücksetzen habe ich auch hinbekommen.

Vielen Dank im Voraus

Gruß Adde

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Adde,

du hast in deiner Datei ja 2 Blätter, einmal mit 8 Spieler und einmal mit 6 Spieler. Da sich die Namen der Spieler ja wiederholen, war ich davon ausgegangen, dass hier die jeweiligen Spieler mehrere Runden hintereinander spielen (also je 8 Spieler eine Runde fertig spielen, dann die nächste Runde).

Aber wenn ich das jetzt so lesen, habe ich da meine Zweifel. Sind die Blätter für eine Spielrunde ausgelegt, d.h. jeder Spieler spielt mehrmals in einer Runde als "neuer" Spieler (also z.B. Adde 1, Adde 2 etc)?

Ansonsten lade mal deine bereits geänderte Datei hoch.

Gruß

M.O.
0 Punkte
Beantwortet von addeguddi Experte (2.6k Punkte)

Hallo M.O.

in der Tabelle mit 8 Spieler werden 3 Runden gespielt. Runde 1 ist von Spieler Spiel 1 bis Spiel 8,so wie hier ein Sieger ermittelt ist folgt Runde 2 Spiel 9 bis Spiel 16 das Gleich mit Runde 3. Wie für 8 Spieler wird dann für 6 Spieler geändert.

Wenn ich wüsste was das Bedeutet. Dies habe ich von der alten Liste geändert, ist aber falsch daher addiert er mir nicht die Punkte.

If Cells(3, lngPunktSpalte).Value = "Spieler " & lngSpieler Then
         'alter Punktestand in Variable speichern, aber nur, wenn der erste Wurf ausgeführt wurde
         If Cells(lngZeile, lngSpalte).Value = 1 Then lngErgebnis = Cells(5, lngPunktSpalte)
         'Punkte addieren
         Cells(5, lngPunktSpalte) = Cells(5, lngPunktSpalte) + Target.Value
         'Prüfen, ob überworfen
         If Cells(6, lngPunktSpalte).Value < 0 Then

Habe ein paar Bemerkungen in der Liste geschrieben, hoffe , dass das so ok für dich ist.

https://filehorst.de/d/cmFIdFce

Gruß Adde
+1 Punkt
Beantwortet von m-o Profi (22.8k Punkte)

Hallo Adde,

hier mal die bearbeitete Datei: Download

Schau mal, ob sie so funktioniert, wie du das willst.

Gruß

M.O.

0 Punkte
Beantwortet von addeguddi Experte (2.6k Punkte)
Hallo M.O.

Habe eben erst gesehen das du die Würfe in den Zellen L31 bis S31 integriert hast. Wäre auch gut, wenn man das jetzt noch für die erwähnten Runden 2 und 3 einfließen könnten.

Gruß Adde
+1 Punkt
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Adde,

die Würfe werden nach jeder Runde automatisch zurückgesetzt, d.h. bei jeder Runde fängt die Zählung von neuem an. Ich habe das eigentlich nur gemacht, um die Spalte für die Spielrunde zu ermitteln.

Aber natürlich kann man die Würfe auch für jede Runde extra zählen und beibehalten.

Gruß

M.O.
0 Punkte
Beantwortet von addeguddi Experte (2.6k Punkte)
Hallo M.O.

für mich wäre es wichtig jede Runde für sich abzuschließen , da separat errechnet wird wer den höchsten Average pro Runde hat. Dann wird die Rangfolge ermittelt der mit dem höchsten Average  Platz 1 Platz 2 und drei

Gruß Adde
0 Punkte
Beantwortet von addeguddi Experte (2.6k Punkte)

Hallo M.O.

ich habe Heute alles einmal durch gespielt. Das VBA was du erstellt hast ist absolut TOP. Nochmals Danke dafür.

Nun zu meiner, hoffentlich, letzten Bitte: 

Wie oben erwähnt, wenn es möglich ist die Anzahl der Würfe die in den Zellen L31 bis S31 für die 1. Runde stehen bleiben könnten, wegen Berechnung des Durchschnitts. Da aber wenn Runde 1 ein Sieger ermittelt ist, werden diese dann überschrieben. Also wenn ein Spieler mit 6 oder 9 Darts aus macht, wird für die  nächste Runde diese  Zelle überschrieben.

Sonst muss nichts verändert werden.

Kann man die Eingabe Cells(31,erweitern aufCells(31,Cells32,Cells33 lngSpalte) = Cells(31,32,33lngSpalte) + 1

 'Zähler für Würfe um 1 erhöhen
   Cells(31, lngSpalte) = Cells(31, lngSpalte) + 1
  
  'Punkte addieren
  'Prüfen, ob überworfen
  If Cells(lngEZeile, lngSpalte).Value + lngWurf <= Cells(lngEZeile - 1, lngSpalte).Value Then
     'nur wenn nicht überworfen, Wurf hinzu addieren
      Cells(lngEZeile, lngSpalte) = Cells(lngEZeile, lngSpalte).Value + lngWurf
      'Ergebnis in Übersicht erhöhen
      'dazu die betreffende Spalte festsetzen
      lngSSpalte = WorksheetFunction.RoundUp(Cells(31, lngSpalte).Value / 3, 0) + 1
      Cells(lngSZeile, lngSSpalte).Value = Cells(lngSZeile, lngSSpalte).Value + lngWurf

LG Adde

...