Excel 2007 check-button deaktivieren

Hallo Excel und VBA Fachleute

Ich habe zwei Probleme, bin mit VBA überhaupt nicht vertraut. Für ein Online Patientenblatt habe ich ein Bild eines Körpers und darauf verteilt die Häckchenboxen damit man an der schmerzenden Region draufklicken kann (z.B. Schulter links) und dann sollte unter dem Bild in der Zelle B35 „Schulter links“ stehen. Für „Schulter rechts“ sollte dann die Zelle B36 verwendet werden, „Lumbal links“ Zelle B37 etc.

Das ganze habe ich so schon mal gelöst:

Sub SchulterLinks()
Range(„B35“).Select
ActiveCell.FormulaR1C1 = „Schulter Links“
End Sub

Nun aber meine zwei Probleme:

1.Ich möchte dass der Text bei einem Häckchen entfernen wieder verschwindet

  1. Möchte ich Platz sparen und hätte es gerne dass die Begriffe lückenlos untereinander stehen, z.B.

[Schulter links]
[Schulter rechts]
[Lumbal links]

Wenn jetzt hier Schulter rechts nicht angeklickt wird sollte Lumbal links nach oben rutschen.

Für Eure Hilfe möchte ich mich ganz herzlich bedanken

Liebe Grüsse

Sascha

Hallo Sascha,

zu deinem Problem:
Du könntest zu Beginn der Sub eine Abfrage starten, ob der Haken gesetzt ist oder nicht und je nach Fall den Quellcode ausführen. Beim Entfernen des Hakens könntest du dann z.B. nach dem Text „Schulter links“ suchen und ihn entfernen lassen. Wenn du eine Liste verwendet, könntest du mit den Angaben ID’s verbinden (die du natürlich ausgeblendet lässt) und die Einträge anhand der ID löschen. Vllt löst das dann auch schon dein 2) Problem. Sicher bin ich mir da grad nicht :smile:

Lg Stefi

Liebe Stefi

Herzlichen Dank für Deine schnelle Antwort. Hmm, wie würde sowas dann codemässig aussehen? Wie gesagt, ich bin ein absoluter VBA Anfänger… Habe obenstehender Code nach ca. 4 Std. Googeln und Kreativität zusammengebastelt (sagt glaube ich auch schon alles :wink:

Hättest Du (oder jemand anderes) Zeit mir dafür den Code anzugeben den ich reinpasten kann?

1000 Dank für die Frohndienstarbeit (ist ja für einen guten Zweck :smile:

Liebe Grüsse und nachträglich ein Happy New Year!

Sascha

Hallo, da muss ich leider auch passen.

So, ich hab mich mal hingesetzt und 2-3 Zeilen zusammengezimmert:
Füge bitte über Ansicht > Symbolleisten > Steuerelement-Toolbox die CheckBoxen ein (die über die Formular-Symbolleisten sind mMn etwas umständlicher zu verwenden).

CheckBox1 habe ich die Caption(=Bezeichnung) „Schulter links“, CheckBox2 „Schulter rechts“ und CheckBox3 „lumbal links“ gegeben (kannst du natürlich anpassen wie du möchtest).

Zudem habe ich 2 Funktionen (addLokation und delLokation) eingefügt, die die jeweilige Lokation zum Zellwert hinzufügen bzw. den Zellwert daraufhin überprüfen und ggf. rauslöschen. So brauchst du in die Sub der jeweiligen Checkboxen immer nur den Quellcode reinzupasten und anzupassen, wie du ihn auch bei CB1, CB2 und CB3 siehst.

Quellcode:
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
addLokation (CheckBox1.Caption)
Else
delLokation (CheckBox1.Caption)
End If
End Sub

Private Sub CheckBox2_Click()
If CheckBox2.Value = True Then
addLokation (CheckBox2.Caption)
Else
delLokation (CheckBox2.Caption)
End If
End Sub

Private Sub CheckBox3_Click()
If CheckBox3.Value = True Then
addLokation (CheckBox3.Caption)
Else
delLokation (CheckBox3.Caption)
End If
End Sub

Private Sub addLokation(lokation As String)
If Range(„A1“).Value > „“ Then
Range(„A1“).Value = Range(„A1“).Value & ", " & lokation
Else
Range(„A1“).Value = lokation
End If
End Sub

Private Sub delLokation(lokation As String)
Dim iPos As Integer
Dim strValue As String
Dim strOutput As String

strValue = Range(„A1“).Value
strOutput = „“

iPos = InStr(strValue, „,“)
If iPos > 0 Then ’ Komma gefunden => mehr als 1 Lokation angegeben
arrLokationen = Split(strValue, ", ") 'aufsplitten der Werte
For i = 0 To UBound(arrLokationen)
'Jede Lokation mit der zu löschenden prüfen
If arrLokationen(i) lokation Then
'Wenn die Lokation ungleich der zu löschenden ist, wird
'sie in den Ausgabestring übernommen.
'Der if-else-Zweig dient nur dazu, an der richtigen Position
'mit dem Komma zu beginnen.
If strOutput = „“ Then
strOutput = arrLokationen(i)
Else
strOutput = strOutput & ", " & arrLokationen(i)
End If
End If
Next i

'Lokationen wieder in die Zelle schreiben
Range(„A1“).Value = strOutput
Else 'Nur 1 oder kein Eintrag vorhanden
If strValue > „“ And strValue = lokation Then
'Nur wenn die Zelle nicht leer ist und der Wert
'der Lokation entspricht, wird gelöscht
Range(„A1“).Value = „“
End If
End If
End Sub

Solltest du noch Fragen dazu haben, lass es mich wissen.

Gruß Stefi

Stefi, Du bist die Beste! Vielen herzlichen Dank für Deine Mühe!

Ich möchte Deine Gutmütigkeit nicht auf die Probe stellen, aber es ist nun halb vier in der Nacht und ich sitze seit deprimierenden 3 Std. am PC und probiere meine Lösung zu Googlen. Bin total genervt da ich weiss, dass die Lösung sehr simpel sein muss. Nun ich probiere mit bedingter Formatierung die Hintergrundfarbe von Zelle AE2 (ohne Inhalt) auf die Zelle N10 zu spiegeln. Also wenn sich in AE2 die Hintergrundfarbe ändert, solle dies auch bei der Zelle N10 passieren. Hättest Du dafür eine Lösung?

Danke Dir vielmals Stefi, ich geh jetzt schlafen :wink:

Liebe Grüsse aus der Schweiz

Sascha

Hi Sascha,

Ich helfe jedem gern und so oft, sofern er sich helfen lässt :wink: und zeigt, dass er sich bemüht. Und deine Fragen klingen wenigstens so genau, dass man sich vorstellen kann, was du meinst :smile:

Über Bedingte Formatierung geht das mWn nicht so einfach. Hier also mein Lösungsvorschlag, der einfach als Code in bspw. Sheet1 hinterlegt wird:

Das Prinzip ist recht simpel. Jedes Mal wenn der Fokus auf dem Tabellenblatt geändert wird (sprich: Zellfarbe ändern, Enter drücken), wird eine kurze Routine ausgeführt, die einfach prüft, ob Farbe_von_A1 = Farbe_von_B1 ist. Wenn das nicht der Fall ist, wird die Farbe von A1 nach B1 übertragen.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Ständiges Überprüfen, ob sich die Zelle geändert hat
If Range(„B2“).Interior.ColorIndex Range(„A1“).Interior.ColorIndex Then
'Zellfarbe hat sich geändert:
'Neue Formatierung auf andere Zelle übertragen
Range(„B2“).Interior.ColorIndex = Range(„A1“).Interior.ColorIndex
End If
End Sub

Wenn du noch Fragen hast, kannst du die gern stellen :smile:

Lg Stefi

Liebe Stefi

Herzlichen Dank für Deine Bemühungen. Der Code würde eigentlich perfekt funktionieren, wenn da nicht das Problem mit der Enter Taste wäre. Das Problem ist, dass die Zelle sich automatisch ändert wenn ein bestimmter Wert erscheint (automatisch ohne Eingabe). Mit Deinem Code wird aber bei einer automatischen Farbgebung keine Prüfung durchgeführt… Hast Du da einen kreativen Lösungsvorschlag?

Ach, ich muss mich unbedingt mit VBA vertraut machen, ist total spannend. Für mich erscheint es aber noch ein bisschen wie Magie wie Du diese Formeln hinkriegst :wink:

Liebe Grüsse

Sascha

Hi Sascha,

du könntest die Überprüfung einfach an der Stelle mit einbauen, wo du den Zellwert ändern lässt. Sollte nicht allzuviel Rechenaufwand/-zeit erfordern :smile:

Was ich dir empfehlen kann, ist das VBA Code Book (http://www.amazon.de/Das-Excel-VBA-Codebook-Melanie-…). Hat mir persönlich sehr geholfen, weil relativ viele Codebeispiele mit dabei waren. Ich bin jmd, der durch Try&Error lernt, deswegen waren die Beispiele sehr hilfreich. Und was Office-Anwendungen betrifft, ist VBA wirklich ein schönes Spielzeug. Man kann sich vieles vereinfachen. Wenns dann aber komplexer wird, tendiere ich eher zu Java - besonders wenn es objektorientiert wird :smile:

Lg Stefi

Danke für den Tipp, werde ich mir kaufen.

Hat alles prima geklappt. Vielen herzlichen Dank für alles :wink:)

Hallo leider kann ich da nicht weiterhelfen :frowning: