Hello, I'm not very good at programming ExcelVB code, but I tried to program a smart solution for a friend's problem anyway.
But I don't know what to do now: the user form has a lot of buttons.
They simulate a vaccination record. When you check vaccination records,
you should always press a status button, but each disease can only have one status.
My idea was that when the button is pressed, background-Color should Change to red-color (status Display) and the value in the Excel table cell provided,
should be increased by 1.
If you have click the wrong button, the value should be reduced by 1 and the button should return to its standard color.
That doesn't work - and when all buttons have been pressed, all colored buttons should be set to the standard Color by a Save Button for the next vaccination record check.
Here is my programming first - if you have any further questions, I could explain more here. Sorry for my bad english - be a german - her the Code I have problems:
But I don't know what to do now: the user form has a lot of buttons.
They simulate a vaccination record. When you check vaccination records,
you should always press a status button, but each disease can only have one status.
My idea was that when the button is pressed, background-Color should Change to red-color (status Display) and the value in the Excel table cell provided,
should be increased by 1.
If you have click the wrong button, the value should be reduced by 1 and the button should return to its standard color.
That doesn't work - and when all buttons have been pressed, all colored buttons should be set to the standard Color by a Save Button for the next vaccination record check.
Here is my programming first - if you have any further questions, I could explain more here. Sorry for my bad english - be a german - her the Code I have problems:
VBA Code:
Option Explicit
'Declaration des Dictionarys
Private buttonStates As Object ' Dictionary für die Button-Zustände
' UserForm Initialisierung
'***************************************
Private Sub UserForm_Initialize()
' Dictionary initialisieren
Set buttonStates = CreateObject("Scripting.Dictionary")
Dim wsData As Worksheet
Dim lastRow As Long
Dim currentTop As Double
Dim i As Long, j As Integer
Dim colStart As Integer, colEnd As Integer
Dim frame As MSForms.frame, button As MSForms.CommandButton
' Arbeitsblatt "Data" festlegen
'--------------------------------
Set wsData = ThisWorkbook.Sheets("Data")
' Scrollbalken einstellen
'----------------------------
With Me
.ScrollBars = fmScrollBarsBoth
.ScrollHeight = .InsideHeight + 380
.ScrollWidth = .InsideWidth + 25
End With
' ComboBoxen dynamisch füllen
'--------------------------------
FillComboBox Me.cbo_Schuljahr, wsData, "A"
FillComboBox Me.cbo_Schule, wsData, "B"
FillComboBox Me.cbo_Klasse, wsData, "C"
' Label für verbleibende Impfbücher initialisieren
'-----------------------------------------------------
Me.lbl_RemainingBooks.Caption = "Rest: " & Me.txtbx_AnzahlImpfbuecher.Value
Me.lbl_RemainingBooks.Font.Bold = True
Me.lbl_RemainingBooks.ForeColor = RGB(255, 0, 0) ' Rot
End Sub
' Funktion: ComboBox füllen
'***************************************
Private Sub FillComboBox(cbo As MSForms.ComboBox, ws As Worksheet, col As String)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).row
cbo.Clear
cbo.RowSource = ws.name & "!" & col & "2:" & col & lastRow
End Sub
' Button Speichern
'***************************************
Private Sub btn_Speichern_Click()
Dim wsImpf As Worksheet
Dim schuljahr As String, schule As String, klasse As String
Dim anzahlImpfbuecher As String, anzahlSchueler As String
Dim gesamtImpfbuecher As String, gesamtSchueler As String
Static remainingBooks As Long ' Zähler für verbleibende Bücher
' Arbeitsblatt festlegen
'------------------------------------------------
Set wsImpf = ThisWorkbook.Sheets("Impfkontrolle")
' Eingabewerte aus der UserForm auslesen
'------------------------------------------------
schuljahr = Me.cbo_Schuljahr.Value
schule = Me.cbo_Schule.Value
klasse = Me.cbo_Klasse.Value
' anzahlImpfbuecher = Me.txtbx_AnzahlImpfbuecher.Value
' anzahlSchueler = Me.txtbx_AnzahlSchueler.Value
If IsNumeric(Me.txtbx_AnzahlImpfbuecher.Value) Then
anzahlImpfbuecher = CLng(Me.txtbx_AnzahlImpfbuecher.Value)
Else
anzahlImpfbuecher = 0
End If
If IsNumeric(Me.txtbx_AnzahlSchueler.Value) Then
anzahlSchueler = CLng(Me.txtbx_AnzahlSchueler.Value)
Else
anzahlSchueler = 0
End If
If schuljahr = "" Or schule = "" Or klasse = "" Or anzahlImpfbuecher = "" Or anzahlSchueler = "" Then
MsgBox "Bitte alle Felder ausfüllen!", vbExclamation
Exit Sub
End If
' Werte in die Tabelle schreiben
'------------------------------------
With wsImpf
.Cells(3, 2).Value = schuljahr
.Cells(4, 2).Value = schule
.Cells(5, 2).Value = klasse
.Cells(6, 2).Value = anzahlImpfbuecher
.Cells(7, 2).Value = anzahlSchueler
' Gesamtsummen aktualisieren
'---------------------------------
.Cells(6, 5).Value = .Cells(6, 5).Value + anzahlImpfbuecher
.Cells(7, 5).Value = .Cells(7, 5).Value + anzahlSchueler
End With
' Textfelder leeren und Label zurücksetzen
'-------------------------------------------
Me.txtbx_AnzahlImpfbuecher.Value = ""
Me.txtbx_AnzahlSchueler.Value = ""
Me.lbl_RemainingBooks.Caption = "Rest: 0"
' Initialisierung des Zählers beim ersten Speichern
'----------------------------------------------------
If remainingBooks = 0 Then
remainingBooks = CLng(anzahlImpfbuecher)
End If
' Zähler reduzieren
'----------------------
If remainingBooks > 0 Then
remainingBooks = remainingBooks - 1
Me.lbl_RemainingBooks.Caption = "Rest: " & remainingBooks
End If
' Erfolgsnachricht
MsgBox "Daten erfolgreich gespeichert und Gesamtsummen aktualisiert!", vbInformation
' Wenn alle Bücher kontrolliert sind
'------------------------------------
If remainingBooks = 0 Then
MsgBox "Bitte nächste Klasse auswählen!", vbInformation
' Optional: Weitere Logik, z. B. Fortschritt zurücksetzen oder speichern
End If
End Sub
' Funktion: Zelle inkrementieren
'******************************************
Private Sub IncrementCell(sheetName As String, targetRow As Long, targetColumn As Long, incrementValue As Long)
Dim ws As Worksheet
Dim currentValue As Variant
' Ziel-Sheet setzen
Set ws = ThisWorkbook.Sheets(sheetName)
' Aktuellen Wert auslesen und inkrementieren
currentValue = ws.Cells(targetRow, targetColumn).Value
If IsNumeric(currentValue) Then
ws.Cells(targetRow, targetColumn).Value = currentValue + incrementValue
Else
ws.Cells(targetRow, targetColumn).Value = incrementValue
End If
End Sub
' Generische Klick-Funktion für Buttons
'*****************************************
Private Sub GenericButtonClick()
Dim btn As MSForms.CommandButton
Dim sheetName As String
Dim targetRow As Long
Dim targetColumn As Long
Dim parts() As String
'Dim buttonKey As String
Dim ws As Worksheet
Dim currentValue As Long
' Ziel-Sheet festlegen
sheetName = "Impfkontrolle"
Set ws = ThisWorkbook.Sheets(sheetName)
' Prüfen, ob ActiveControl ein Button ist
If TypeOf Me.ActiveControl Is MSForms.CommandButton Then
Set btn = Me.ActiveControl
'buttonKey = btn.name ' Eindeutiger Schlüssel für den Button
Else
MsgBox "Das aktive Steuerelement ist kein Button!", vbExclamation
Exit Sub
End If
' Button-Name analysieren (z. B. Btn_Tetanus_1)
parts = Split(btn.name, "_")
' Ziel-Reihe und -Spalte bestimmen
If UBound(parts) = 2 Then
If InStr(parts(1), "Impftiter") > 0 Then
' Impftiter-Logik(Masern-, Mumps-, Röteln-Impftiter)
Select Case parts(1)
Case "MasernImpftiter": targetRow = 28
Case "MumpsImpftiter": targetRow = 29
Case "RoetelnImpftiter": targetRow = 30
Case Else
MsgBox "Unbekannter Impftiter: " & parts(1), vbExclamation
Exit Sub
End Select
' Zielspalte festlegen: Spalte B = 2 oder Spalte E = 5 (abhängig von der letzten Ziffer)
'----------------------------------------------------------------------------------------
Select Case CInt(parts(2))
Case 1
targetColumn = 2 ' Spalte B
Case 2
targetColumn = 5 ' Spalte E
Case Else
MsgBox "Ungültige Spalte für Impftiter: " & btn.name, vbExclamation
Exit Sub
End Select
Else
' Impfart (z. B. Tetanus) und Zielspalte bestimmen
Select Case parts(1)
Case "Tetanus": targetRow = 13
Case "Diphterie": targetRow = 14
Case "Pertussis": targetRow = 15
Case "Polio": targetRow = 16
Case "HepatitisB": targetRow = 17
Case "Masern": targetRow = 18
Case "Mumps": targetRow = 19
Case "Roeteln": targetRow = 20
Case "Varizellen": targetRow = 21
Case "Meningokokken": targetRow = 22
Case "FSME": targetRow = 23
Case "HPV": targetRow = 24
Case Else
MsgBox "Unbekannte Impfart: " & parts(1), vbExclamation
Exit Sub
End Select
End If
' Zielspalte festlegen (B oder E)
If IsNumeric(parts(2)) Then
targetColumn = CInt(parts(2)) + 1 ' Spalte B = 2
Else
MsgBox "Ungültige Spalte im Button-Namen: " & btn.name, vbExclamation
Exit Sub
End If
' Aktuellen Wert abrufen
currentValue = ws.Cells(targetRow, targetColumn).Value
If Not IsNumeric(currentValue) Then currentValue = 0
'Logik: Wert erhöhen/reduzieren und Farbe wechseln
If btn.BackColor = RGB(255, 0, 0) Then
' Wenn rot, zurücksetzen
btn.BackColor = RGB(240, 240, 240) ' Standardfarbe
ws.Cells(targetRow, targetColumn).Value = currentValue - 1 ' Wert um 1 reduzieren
Else
' Wenn Standardfarbe, erhöhen und rot färben
btn.BackColor = RGB(255, 0, 0) ' Rot markieren
ws.Cells(targetRow, targetColumn).Value = currentValue + 1 ' Wert um 1 erhöhen
End If
Else
MsgBox "Ungültiger Button-Name: " & btn.name, vbExclamation
Exit Sub
End If
End Sub
' Funktion: Daten exportieren
Private Sub ExportDataToFile()
Dim ws As Worksheet
Dim exportFileName As String
' Zielarbeitsblatt setzen
Set ws = ThisWorkbook.Sheets("Impfkontrolle")
' Dateiname erstellen
exportFileName = ThisWorkbook.Path & "\Impfkontrolle_" & Format(Now, "yyyymmdd_HHMMSS") & ".xlsx"
' Exportieren
ws.Copy
ActiveWorkbook.SaveAs Filename:=exportFileName, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False
MsgBox "Daten exportiert nach: " & exportFileName, vbInformation
End Sub
' Buttons der Form
'***************************************
Private Sub btn_Tetanus_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Tetanus_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Tetanus_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Tetanus_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Tetanus_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Tetanus_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Tetanus_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Tetanus_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Tetanus_5_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Tetanus_5.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Diphterie_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Diphterie_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Diphterie_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Diphterie_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Diphterie_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Diphterie_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Diphterie_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Diphterie_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Diphterie_5_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Diphterie_5.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Pertussis_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Pertussis_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Pertussis_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Pertussis_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Pertussis_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Pertussis_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Pertussis_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Pertussis_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Pertussis_5_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Pertussis_5.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Polio_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Polio_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Polio_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Polio_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Polio_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Polio_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Polio_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Polio_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Polio_5_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Polio_5.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_HepatitisB_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HepatitisB_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HepatitisB_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HepatitisB_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HepatitisB_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HepatitisB_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HepatitisB_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HepatitisB_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Masern_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Masern_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Masern_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Masern_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Masern_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Masern_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Masern_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Masern_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Mumps_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Mumps_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Mumps_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Mumps_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Mumps_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Mumps_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Mumps_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Mumps_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Roeteln_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Roeteln_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Roeteln_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Roeteln_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Roeteln_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Roeteln_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Roeteln_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Roeteln_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Varizellen_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Varizellen_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Varizellen_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Varizellen_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Varizellen_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Varizellen_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Varizellen_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Varizellen_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_Meningokokken_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Meningokokken_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Meningokokken_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Meningokokken_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Meningokokken_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Meningokokken_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_Meningokokken_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_Meningokokken_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_FSME_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_FSME_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_FSME_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_FSME_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_FSME_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_FSME_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_FSME_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_FSME_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_FSME_5_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_FSME_5.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_HPV_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HPV_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HPV_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HPV_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HPV_3_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HPV_3.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_HPV_4_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_HPV_4.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_MasernImpftiter_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_MasernImpftiter_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_MasernImpftiter_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_MasernImpftiter_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_MumpsImpftiter_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_MumpsImpftiter_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_MumpsImpftiter_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_MumpsImpftiter_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
'---------------------------------------
Private Sub btn_RoetelnImpftiter_1_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_RoetelnImpftiter_1.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub
Private Sub btn_RoetelnImpftiter_2_Click()
Call GenericButtonClick
' Aktion des Buttons
btn_RoetelnImpftiter_2.BackColor = RGB(255, 0, 0) ' Rot markieren
End Sub