Anzeige
Archiv - Navigation
1260to1264
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prozedur in Worksheet_Change teilen

Prozedur in Worksheet_Change teilen
Sayjuri
Hallo zusammen,
bin seit einiger Zeit dabei herauszufinden wie man eine Prozedur in einem Worksheet Change teilen und aufrufen kann. Ich hoffe ich drücke mich hier einigermaßen verständlich aus, bin nämlich was VBA betrifft noch ein Laie. Auf der Suche nach Antworten im Net bin ich zwar immer wieder auf ähnliche Problemstellungen gestoßen allerdings haben die Antworten mich noch nicht weitergebracht.
Was ich versuche bzw. was auch schon geklappt hat ist, ein Worksheet Change (ByVal Target As _
Range) zu erstellen der eine Art Optionsfeld nachahmt. Drei Zellen sollen z.B. zu einer _ Optionsgruppe zusammengefasst werden (z.B. B1:B3) und wenn ich in B1 zuerst einen Eintrag vornehme und dann in B2 oder B3 etwas eintrage dann soll der Eintrag in B1 gelöscht werden. Dies klappt auch sehr schön mit folgendem Code (ich hoffe Code ist der richtige Begriff :o)

Private Sub Worksheet_Change(ByVal Target As Range)
'Kreuzoption 1
If Not Intersect(Target, [B1:B1]) Is Nothing Then
If Not ActiveSheet.Cells(1, 2).Value = "" Then
ActiveSheet.Cells(2, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B2:B2]) Is Nothing Then
If Not ActiveSheet.Cells(2, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B3:B3]) Is Nothing Then
If Not ActiveSheet.Cells(3, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(2, 2).Value = ""
End If
End If
End Sub

Wie gesagt funktioniert dieser "Code"? auch ganz gut mein Problem ist aber das ich ungefähr 50 (oder in Zukunft auch noch mehr) dieser Optionsgruppen brauche und im eigentlichen Fall jede Optionsgruppe nicht nur drei sonder vier Zellen beinhaltet. Das führt dann irgendwann dazu dass ich die Fehlermeldung bekomme die Prozedur sei zu groß.
Ich habe jetzt versucht die Prozedur auf folgende Art und Weise zu teilen (wobei die Zellen B5: _
B7 eine neue Optionsgruppe ergeben sollen):

Private Sub Worksheet_Change(ByVal Target As Range)
'Kreuzoption 1
If Not Intersect(Target, [B1:B1]) Is Nothing Then
If Not ActiveSheet.Cells(1, 2).Value = "" Then
ActiveSheet.Cells(2, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B2:B2]) Is Nothing Then
If Not ActiveSheet.Cells(2, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B3:B3]) Is Nothing Then
If Not ActiveSheet.Cells(3, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(2, 2).Value = ""
End If
End If
Call Worksheet_Change2
End Sub

Public Sub Worksheet_Change2(ByVal Target As Range)
'Kreuzoption 2
If Not Intersect(Target, [B5:B5]) Is Nothing Then
If Not ActiveSheet.Cells(5, 2).Value = "" Then
ActiveSheet.Cells(6, 2).Value = ""
ActiveSheet.Cells(7, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B6:B6]) Is Nothing Then
If Not ActiveSheet.Cells(6, 2).Value = "" Then
ActiveSheet.Cells(5, 2).Value = ""
ActiveSheet.Cells(7, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B7:B7]) Is Nothing Then
If Not ActiveSheet.Cells(7, 2).Value = "" Then
ActiveSheet.Cells(5, 2).Value = ""
ActiveSheet.Cells(6, 2).Value = ""
End If
End If
End Sub

-----------------------------------------------------------------------
Hier erscheint dann die Fehlermeldung das Argument sei nicht Optional dabei wird "Call Worksheet_Change2" blau markiert und
-Private Sub Worksheet_Change(ByVal Target As Range)- gelb markiert.
Was mich jetzt interessiert sind zwei Sachen:
1. Was mache ich bei dieser Teilung falsch? und wie mach ich es richtig :o)
2. Gibt es auch eine Möglichkeit den Code so zu schreiben, dass ich nicht für jede _
Optionsgruppe die einzelnen Zellen händisch eintragen muss. Das war nämlich ganz schön viel _
Tipparbeit auch wenn man das Grundgerüst immer wieder kopieren konnte.
Wenn ihr mir hier weiterhelfen könntet wäre ich wirklich sehr dankbar. Bin nämlich schon seit _
_
_
einigen Tagen am rumsuchen.
Vielen dank schon mal im Voraus an jeden der sich hier die Mühe macht mein Problem _
nachzuvollzien.
Gruß Sayjuri
AW: Prozedur in Worksheet_Change teilen
01.05.2012 14:34:50
Hajo_Zi
in der Tabelle darf es nur ein Ereignis Change geben.
Gruß Hajo
AW: Prozedur in Worksheet_Change teilen
01.05.2012 14:42:59
Sayjuri
Vielen Dank für die schnelle Antwor Hajo,
könntest du mir vielleicht noch kurz erklären was das für mich bedeutet? Was ist denn ein Ereignis Change? und wie kann soll ich diese Ereignisse bei mir benennen?
AW: Prozedur in Worksheet_Change teilen
01.05.2012 14:48:42
Hajo_Zi
Dass Change Ereignis steht uin Deinem ersten Code und das solltest Du nicht umbennen.
Die Code möchte ich nichts schreiben.
Gruß Hajo
Anzeige
AW: Prozedur in Worksheet_Change teilen
01.05.2012 15:13:16
Sayjuri
Hmmm...
meinst du damit, dass der Sub Name -Worksheet_Change2- falsch gewählt ist?
Mir geht es nicht darum, dass du den Code schreibst ich versteh nur nicht welchen Teil ich nicht umbenennen darf?
Gruß Sayjuri
AW: Prozedur in Worksheet_Change teilen
01.05.2012 15:51:07
Hajo_Zi
es darf nur ein Change geben das hatte ich schon geschrieben Change2 ist ein zweites Change.
Gruß Hajo
AW: Prozedur in Worksheet_Change teilen
01.05.2012 16:06:21
Sayjuri
Ach so,
und was müsste ich machen damit es sich nicht um ein weiteren Change handelt sondern einfach um einen zweiten Teil?
Also ich müsste wissen wie ich die Prozedur teilen kann. Ich könnte natürlich in diesem kleinen Beispiel einfach beide Teile in einem Change (ich hoffe ich drücke mich korrekt aus) zusammenfassen:
Private Sub Worksheet_Change(ByVal Target As Range)
'Kreuzoption 1
If Not Intersect(Target, [B1:B1]) Is Nothing Then
If Not ActiveSheet.Cells(1, 2).Value = "" Then
ActiveSheet.Cells(2, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B2:B2]) Is Nothing Then
If Not ActiveSheet.Cells(2, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(3, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B3:B3]) Is Nothing Then
If Not ActiveSheet.Cells(3, 2).Value = "" Then
ActiveSheet.Cells(1, 2).Value = ""
ActiveSheet.Cells(2, 2).Value = ""
End If
End If
'Kreuzoption 2
If Not Intersect(Target, [B5:B5]) Is Nothing Then
If Not ActiveSheet.Cells(5, 2).Value = "" Then
ActiveSheet.Cells(6, 2).Value = ""
ActiveSheet.Cells(7, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B6:B6]) Is Nothing Then
If Not ActiveSheet.Cells(6, 2).Value = "" Then
ActiveSheet.Cells(5, 2).Value = ""
ActiveSheet.Cells(7, 2).Value = ""
End If
ElseIf Not Intersect(Target, [B7:B7]) Is Nothing Then
If Not ActiveSheet.Cells(7, 2).Value = "" Then
ActiveSheet.Cells(5, 2).Value = ""
ActiveSheet.Cells(6, 2).Value = ""
End If
End If
End Sub
Das würde so funktionieren. Wenn ich allerdings noch 50 solcher gruppierungen hätte wäre die Prozedur zu lang. Ich müsste also wissen wie ich diese Prozedur splitten kann.
Vielen Dank
Anzeige
AW: Prozedur in Worksheet_Change teilen
01.05.2012 16:58:16
EtoPHG
Hallo Sayjuri,
Diese Codes in das Tabelleblatt.
Anpassen brauchst du nur die Konstanten.
Bei Rechtsklick in den Bereich wird der entsprechende 'Optionbutton' in der Gruppe _
gesetzt:

Option Explicit
Const cSpalte As Long = 2       ' Welche Spalte soll sich wie Optionbuttons verhalten
Const cErsteZeile As Long = 2   ' Zeile der des ersten 'OptionButtons'
Const cAnzGruppen As Long = 50  ' Total Anzahl Gruppen untereinander
Const cAnzOptions As Long = 4   ' Anzahl 'Optionbuttons' pro Gruppe
Const cMark As String = "X"     ' Markierung setzen
Const cNoMark As String = ""    ' Markierung nicht setzen
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim lRow As Long
Dim rngBereich As Range
Set rngBereich = Range(Cells(cErsteZeile, cSpalte), Cells(cErsteZeile + cAnzGruppen *  _
cAnzOptions, cSpalte))
If Not Intersect(Target, rngBereich) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False
lRow = Int((Target.Row - cErsteZeile) / cAnzOptions) * cAnzOptions + cErsteZeile
Cells(lRow, cSpalte).Resize(cAnzOptions, 1) = cNoMark
Target = cMark
Cancel = True
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lRow As Long
Dim rngBereich As Range
Dim strMark As String
Set rngBereich = Range(Cells(cErsteZeile, cSpalte), Cells(cErsteZeile + cAnzGruppen *  _
cAnzOptions, cSpalte))
Application.EnableEvents = False
If WorksheetFunction.CountA(rngBereich) 
Gruess Hansueli
Anzeige
AW: Prozedur in Worksheet_Change teilen
01.05.2012 17:55:10
Sayjuri
Danke für deine Mühe Eto
hast du das jetzt einfach so geschrieben ...?...heftig
ich werd gleich mal schauen wie das funktioniert und ob ich einigermaßen verstehe was du da geschrieben hast.
Aber hab schon mal vielen Dank
AW: Prozedur in Worksheet_Change teilen
01.05.2012 19:07:09
Sayjuri
Super...Vielen vielen Dank
Es funktioniert und es ist sogar immer schon eine vorwahl mit drinnen...gute Idee.
Ich dreh durch hab da schon eine halbe ewigkeit herumgebastelt...naja aber so einen Code hätte ich selber auch nicht zaubern können.
Was mich jetzt aber noch interessieren würde ist ob es möglich ist den Code den ich da gebastelt habe bzw. den ich hier in abgespeckter Form reingestellt habe irgendwie zu teilen so dass nicht die Fehlermeldung kommt "Prozedur zu groß" ich frag das jetzt nur noch mal aus interesse weil ich da so lange drangesessen habe. Mir ist schon klar, dass wenn das richtig Programmiert wurde, es gar nicht erst dazu kommt. Und es klappt ja auch mit deinem Code.
Aber mich würde das jetzt einfach wirklich interessieren ob es geht und wenn ja wie?
Also noch mals
Danke Danke Danke vielen vieln Dank
Anzeige
AW: Prozedur in Worksheet_Change teilen
02.05.2012 00:58:10
EtoPHG
Hallo,
Ich hab zwar schon abertausende von Codezeilen geschrieben, aber die Fehlermeldung "Prozedur zu groß" ist mir noch nie untergekommen.
Lies mal die VBA-Hilfe zum If-Then-Else und darin vor allem die Angaben über das ElseIf durch. Dann müsste dir auffallen, dass dein Konstrukt so gar nicht funktionieren kann. Wenn schon könntest du es durch ein (riesiges, aber überflüssiges!) Select-Case-Konstrukt ersetzen, aber wie du an meinem Code siehst, ist Programmierung nicht das Aneinander-Reihen sich immer wieder wiederholenden Befehle, sondern:
Analyse der Daten, Logik der Regeln, ein bisschen Schulmathematik und das Auspaldowern von Algorithmen.
Gruess Hansueli
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige