PDA

Vollständige Version anzeigen : mehrere Auswahl-Zellen, wenn eine ausgewählt, sollen die anderen leer werden


DerLehrling
03.07.2014, 14:00
Wollte in einem Excel-Formular eigentlich drei "Auswahl"-Kästchen zum "Ankreuzen" erstellen, von denen immer nur eines ausgewählt sein darf.

Da mir die üblichen Steuerelemente viel zu klein sind, habe ich mir mit VBA beholfen, indem eine aktivierte Zelle mit einem "X" versehen wird:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Intersect(Range("B5:D5"), Target) Is Nothing Then Exit Sub
If Target = "X" Then
Target = ""
Else
Target = "X"
Target.HorizontalAlignment = xlCenter
Target.VerticalAlignment = xlCenter
End If

End Sub


Dabei gibt es ein Problem, das ich einfach nicht lösen kann (ziemliches VBA-"Greenhorn"):

Es soll immer nur eine der drei Zellen mit "Kreuz" versehen sein - wird eine andere Zelle aktiviert ("angekreuzt") , müssen die beiden anderen Zellen leer sein (bei einer Änderung der Auswahl muss also die vorher ausgewählte Zelle leer werden).

Wie muss das aussehen???

hary
03.07.2014, 14:41
Moin
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("B5:D5")) Is Nothing Then
Range("B5:D5").ClearContents
Target = "X"
End If
End Sub

gruss hary
Tip der das Leben schoener macht:
Gruss
Frage
Gruss

RPP63neu
03.07.2014, 14:41
Hallo!
... ich hab mal meinen Beitrag gelöscht (warum einfach, wenn's auch schwierig geht) ...
Gruß, Ralf

chris-kaiser
03.07.2014, 14:51
Hi,

ich würde rechtsklick oder doppelklick nehmen,

hier mal für Rechtsklick

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
With rng
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.Name = "Wingdings"
End With
For Each rng_c In rng
If rng_c.Address = Target.Address Then
rng_c.Value = "ý"
Else
rng_c.Value = ""
End If
Next
Cancel = True
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
Target(1, 1).Select
End If
End Sub

hary
03.07.2014, 15:13
Moin Chris
Warum so, fuer ein X, fragt sich die kleine VBA-Leuchte.
Doppelklick=OK
aber dann!????
gruss und hoffe auf erleuchtung
hary

chris-kaiser
03.07.2014, 15:47
Hallo hary,

markiere einmal das ges. Blatt (falls du Office >= 2007) hast

bei mir ist ja nur viel an Formaten drinnen.
das mit den Bereichen ist nur aus alter Gewohnheit, da so etwas zumeist ein wenig ausgebaut wird und wenn nun auf einmal mehr als nur ein X übertragen werden sollte, scheitert das Target alleine.

:)

hary
03.07.2014, 16:04
Moin Chris
Danke.
gruss hary

chris-kaiser
03.07.2014, 16:08
Hallo hary,

ich weiß jetzt nicht ob countlarge schon in Excel <2007 vorhanden war...
ansonsten könnte über bedingte Kompilierung gearbeitet werden.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
#If VBA7 Then
If Target.CountLarge > 1 Then Exit Sub
#Else
If Target.Count > 1 Then Exit Sub
#End If
If Not Intersect(Target, Range("B5:D5")) Is Nothing Then
Range("B5:D5").ClearContents
Target.Value = "X"
End If
End Sub

DerLehrling
03.07.2014, 17:00
Tausend Dank euch beiden...

die Lösung von hary und auch die letzte von Chris funktionieren einwandfrei und sind eigentlich genau das, was ich mir zunächst vorgestellt hatte...

Die letzte Lösung von Chris hat mich durch die "Wingdings" dann noch auf eine andere Idee gebracht (so muss ich in den entsprechenden Zellen keine Zeichenelement-Kästchen platzieren, wie ich das vorher gemacht habe).
Ich habe den Code lediglich etwas verändert, so dass es allein mit Target klappt (Ausrichtung, Schriftart und -größe klappt über die Zell-Formatierung):


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
For Each rng_c In rng
If rng_c.Address = Target.Address Then
rng_c.Value = ChrW(253)
Else
rng_c.Value = ChrW(168)
End If
Next
Cancel = True
End If
End Sub



Wie auch immer - eure beiden Vorschläge sind soweit super...

ABER:
Kann man da auch noch einbauen, dass auch eine bereits ausgewählte Zelle bei erneutem Target wieder leer wird bzw. ein leeres Quadrat (Wingdings-Zeichen 168) erscheint - also auch alle drei Zellen leer sein bzw. leere "Kästchen" erscheinen können??? (Hatte anfangs nicht daran gedacht, dass jemand auch versehentlich ein "Kreuz" gesetzt haben kann - es muss nicht zwingend ein "Kästchen" ausgewählt werden...)

chris-kaiser
03.07.2014, 20:30
Hi,

ich habe das mal wieder auf Doppelklick gelegt.


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
With rng
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.Name = "Wingdings"
End With
For Each rng_c In rng
If rng_c.Address = Target.Address Then
rng_c.Value = IIf(Target.Value = ChrW(253), ChrW(168), ChrW(253))
Else
rng_c.Value = ChrW(168)
End If
Next
Cancel = True
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
Target(1, 1).Select
End If
End Sub

DerLehrling
03.07.2014, 21:56
Super - danke!!!

Verstehe zwar noch nicht ganz genau warum, und habe auch wieder auf Target /SelectionChange verändert (weil ich den Leuten, die dieses Formular benutzen sollen, nicht erst erklären will, dass sie in diese Felder mit Doppelklick gehen müssen) - außerdem geht die Schrift-Formatierung wieder über die Formatierung der Felder:

Dim rng As Range
Set rng = Range("B5:D5")
If Not Intersect(rng, Target) Is Nothing Then
For Each rng_c In rng
If rng_c.Address = Target.Address Then
rng_c.Value = IIf(Target.Value = ChrW(253), ChrW(168), ChrW(253))
Else
rng_c.Value = ChrW(168)
End If
Next
Cancel = True
End If

So funktioniert es genau so, wie ich es mir vorgestellt habe.
Da ich aber, wie gesagt, ein VBA-Greenhorn bin, wüsste ich noch gern, ob das so in Ordnung ist und was an der Lösung über Doppelklick besser ist.

Danke nochmals...

hary
04.07.2014, 06:23
Moin
was an der Lösung über Doppelklick besser ist.
Mit meinen einfachen Worten.
Doppelklick macht man bewusst.
Also waehlt man bewusst eine Zelle aus und macht den Doppelklick.
Selection_Change ist bewusstlos ;-)
Wird immer ausgefuehrt, wenn man in eine andere Zelle geht.
Also auch wenn ich von Zelle G999 nach Q34 gehe.

Cancel = true
Muss raus
gruss hary

chris-kaiser
04.07.2014, 06:40
Hi,

ich würde die Formatierung über den Code auch drinnen lassen. :)
wenn jemand über den Bereich kopiert oder ein Format übertragen macht, wären keine Kästchen mehr da.

Und so wie hary schon sagt, ein Doppel. oder Rechtsklick wird bewusst gemacht.
Aber natürlich kannst du auch das Selection_change drinnen lassen.
Für gesteuerte "händische" Aktionen verwende ich es halt nie.

hary
04.07.2014, 07:12
Moin Ihr Beide
Bin zwar nicht die VBAleuchte. ;-)
Jetzt versetz ich mich in einen DAU und fuege oberhalb Zeile5 eine Zeile ein.
<br/><br/>
<b><em>Tabelle1</em></b><table border="1" cellspacing="0" cellpadding="0" style="border-color:#000000; border-width: 1px; font-size:11pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "><colgroup><col style="font-weight:bold; width:40px;" /><col style="width:97px;" /><col style="width:97px;" /><col style="width:97px;" /></colgroup><tr style="background-color:#99CCFF; text-align:center; font-weight:bold; "><td>&nbsp;</td><td>B</td><td>C</td><td>D</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">5</td><td style="color:#000000; background-color:#FFFFFF ;; text-align:left; ">¨</td><td style="color:#000000; background-color:#FFFFFF ;; text-align:left; ">¨</td><td style="color:#000000; background-color:#FFFFFF ;; text-align:left; ">¨</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">6</td><td style="color:#000000; background-color:#FFFF00 ;; text-align:left; ">¨</td><td style="color:#000000; background-color:#FFFF00 ;; text-align:left; ">ý</td><td style="color:#000000; background-color:#FFFF00 ;; text-align:left; ">¨</td></tr></table><br/><a href='http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip' >http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip</a><br/><a href='http://Hajo-Excel.de/tools.htm' >http://hajo-excel.de/tools.htm</a><br/>XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007<br/>Add-In-Version 14.02 einschl 64 Bit<br/>
LOL
gruss hary

chris-kaiser
04.07.2014, 07:53
Hi,

füge einmal eine Zelle ein ;), oder lösche den Bereich, formatiere darüber.

hary
04.07.2014, 08:09
Moin Chris
Das haettest du mir aber zutrauen koennen.;-)
weil ich den Leuten, die dieses Formular benutzen sollen, nicht erst erklären will, dass sie in diese Felder mit Doppelklick gehen müssen)
Mir fiel nur eine Antwort aus einem Forum ein:
Nicht woertlich!
"Man kann programieren wie man will, nach 1000x benutzen schafft es ein Dau immer den Code zu crashen"
Hab nur gute Laune.
gruss hary

DerLehrling
04.07.2014, 16:15
Moin moin ihr beiden,

seid ja früh auf Sendung...

Danke nochmals für die Hilfe - ich habe nicht wirklich alles verstanden, aber geholfen hat's allemal.

Mein Formular ist geschützt und sollte grundsätzlich nicht durch Zeileneinfügen oder -löschen verändert werden können...
Aber mit dem Umformatieren hast du natürlcih Recht, Chris - habe nicht bedacht, dass ja diese Zellen nicht geschützt sind...
Was die Frage Doppelklick oder rechte Maustaste anbelangt, so kenne ich eben viele Leute, die nur die linke Mausttaste kennen und bei "Ankreuz"-Feldern auch nur einmal in diese Felder klicken, wenn dann nichts passiert, werden sie unruhig...
Und letztlich gehen sie ja bewusst in die betreffenden Felder und es tut sich auch nur dann etwas, wenn man genau DIESE Felder (B5:D5) auswählt.

Aber: Ich habe mich jetzt für die Variante mit Doppelklick (und Formatierung über den Code) entschieden (letzte Lösung von Chris), weil man dadurch nicht erst in ein anderen Feld gehen muss, um das Kreuz in einem Feld wieder wegzubekommen (und im Formular gibt's dann eben den Hinweis auf Doppelklick...).

Naja - nun muss ich nur noch verstehen, was genau durch die verschiedenen Anweisungen passiert (bei einigen blicke ich immer noch nicht ganz durch)...

Nochmals danke!