Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1556to1560
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

Makro verdoppeln und Anpassen

Makro verdoppeln und Anpassen
11.05.2017 17:19:06
Raphael
Hallo meine Makro Freunde,
ich hab da so einen kleine frage.
Und zwar habe ich einen Excel liste mit Activex Checkbox 186 Stück an der Zahl (es können maximal 62 stück Angewählt werden.
Ich schreibe gerade ein Makro was die CB´s gegeneinander Verriegelt die ersten 62 Cb´s habe ich schon verriegelt. (immer 2 sind gegeneinander verriegelt)
Jetzt kommt der schwierige teil die restlichen 124 stück sollen in 4er paaren Verriegelt werden, das heißt folgenden Makro muss ich 31 mal einfügen und überarbeiten. Das muss doch einfacher gehen als Copy&Past und per Hand bearbeiten.
  • 
    Private Sub CheckBox63_Click()
    If CheckBox63.Value = False Then
    CheckBox64.Enabled = True
    CheckBox65.Enabled = True
    CheckBox66.Enabled = True
    End If
    If CheckBox63.Value = True Then
    CheckBox64.Enabled = False
    CheckBox65.Enabled = False
    CheckBox66.Enabled = False
    End If
    End Sub
    
    Private Sub CheckBox64_Click()
    If CheckBox64.Value = False Then
    CheckBox63.Enabled = True
    CheckBox65.Enabled = True
    CheckBox66.Enabled = True
    End If
    If CheckBox64.Value = True Then
    CheckBox63.Enabled = False
    CheckBox65.Enabled = False
    CheckBox66.Enabled = False
    End If
    End Sub
    
    Private Sub CheckBox65_Click()
    If CheckBox65.Value = False Then
    CheckBox64.Enabled = True
    CheckBox63.Enabled = True
    CheckBox66.Enabled = True
    End If
    If CheckBox65.Value = True Then
    CheckBox64.Enabled = False
    CheckBox63.Enabled = False
    CheckBox66.Enabled = False
    End If
    End Sub
    
    Private Sub CheckBox66_Click()
    If CheckBox66.Value = False Then
    CheckBox64.Enabled = True
    CheckBox65.Enabled = True
    CheckBox63.Enabled = True
    End If
    If CheckBox66.Value = True Then
    CheckBox64.Enabled = False
    CheckBox65.Enabled = False
    CheckBox63.Enabled = False
    End If
    End Sub
    


  • 3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Makro verdoppeln und Anpassen
    11.05.2017 19:06:09
    Sepp
    Hallo Raphael,
    mit knapp 200 Checkboxen auf dem Blatt, wünsche ich Dir alles Gute ;-))
    Warum nimmst du nicht OptionsButtons? Die kann man über ihre Eigenschaft "GroupName" gruppieren und in jeder Gruppe kann immer nur einer aktiv sein, ganz ohne Code.
    Gruß Sepp

    AW: Makro verdoppeln und Anpassen
    11.05.2017 20:00:17
    MAtthias
    Hallo Raphael! Hier mal noch ein Variante. Die lässt deinen Code ein wenig kleiner werden. Müsstest allerdings zu jeder Box noch einen Click aufruf einstellen. Evtl. könnte man das mittels Klassenprogrammierung umgehen aber da bin ich mir nicht sicher. Das Erstellen der Aufrufe für Box 63 bis 128 könnte man aber auch fix im Word programmieren und dann einfach nur reinkopieren. Also die Idee ist, dass du eine Prozedur aufrufst und den Buchstaben der Box mit übergibst (wie gesagt, bei Klasse könnte man sich das ggf. sparen). Im Sub wird dann ausgehen von der Nummer der 4er Bereich ermittelt und entweder entsperrt oder gesperrt. Sieht dann so aus (habe es nur probehalber mit 4 Boxen probiert).
    Die Aufurfe durch die Boxen:
    Private Sub CheckBox63_Click()
    Call verschränken(63)
    End Sub
    Private Sub CheckBox64_Click()
    Call verschränken(64)
    End Sub
    

    Und in einem extra Modul dann noch das:
    Sub verschränken(box As Long)
    Dim i As Long
    Dim start As Long
    Dim ende As Long
    Dim zustand As Boolean
    Application.ScreenUpdating = True
    start = Int((box - 63) / 4) * 4 + 63
    ende = start + 3
    zustand = ActiveSheet.Shapes("CheckBox" & box).OLEFormat.Object.Object.Value
    For i = start To ende
    If zustand = True Then
    If i  box Then ActiveSheet.Shapes("CheckBox" & i).OLEFormat.Object.Object.Enabled =  _
    False
    Else
    If i  box Then ActiveSheet.Shapes("CheckBox" & i).OLEFormat.Object.Object.Enabled =  _
    True
    End If
    Next i
    Application.ScreenUpdating = False
    End Sub
    

    Einfach mal schauen und probieren. Setze das Thema mal noch nicht auf beendet.
    Viele Grüße
    Anzeige
    Hier mit Klassenprogrammierung
    12.05.2017 13:08:23
    Max2
    Hallo hier eine Datei mit Klassenprogrammierung: https://www.herber.de/bbs/user/113541.xlsm
    Und hier nur Code:
    In Klasse (in meinem Fall heißt sie "my_Checks")
    
    Option Explicit
    Public WithEvents clsCheckBox As MSForms.CheckBox
    Private Sub clsCheckBox_Click()
    Dim number As Long
    Dim name As String
    number = my_Number(clsCheckBox.name)
    name = clsCheckBox.name
    Call lock_my_Neighbours(name, number)
    End Sub
    

    In Modul:
    
    Option Explicit
    Public checkB() As New my_Checks
    Function my_Number(ByVal meName As String) As Long
    Dim i As Long
    Dim clsNameLength As Long
    clsNameLength = Len("CheckBox")
    i = Len(meName)
    my_Number = Right(meName, i - clsNameLength)
    End Function
    Sub my_Neighbours_are(ByVal meNumber As Long, _
    ByRef arrNeighbours() As String)
    Select Case meNumber
    Case 1 To 62
    ReDim arrNeighbours(1)
    arrNeighbours(0) = meNumber + 1
    arrNeighbours(1) = meNumber + 2
    Case 63 To 186
    ReDim arrNeighbours(3)
    arrNeighbours(0) = meNumber + 1
    arrNeighbours(1) = meNumber + 2
    arrNeighbours(2) = meNumber + 3
    arrNeighbours(3) = meNumber + 4
    End Select
    End Sub
    Sub lock_my_Neighbours(ByVal meName As String, ByVal meNumber As Long)
    Dim ws As Worksheet
    Dim neighbourToLock() As String
    Dim boolLocked As Boolean
    Dim i As Long
    Set ws = ActiveSheet
    With ws
    boolLocked = ws.Shapes(meName).OLEFormat.Object.Object.Value
    Call my_Neighbours_are(meNumber, neighbourToLock)
    Application.ScreenUpdating = False
    If boolLocked Then
    For i = LBound(neighbourToLock) To UBound(neighbourToLock)
    ws.Shapes(neighbourToLock(i)).OLEFormat.Object.Object.Enabled = False
    Next i
    Else
    For i = LBound(neighbourToLock) To UBound(neighbourToLock)
    ws.Shapes(neighbourToLock(i)).OLEFormat.Object.Object.Enabled = True
    Next i
    End If
    Application.ScreenUpdating = True
    End With
    End Sub
    Sub check()
    Dim i As Integer
    Dim sh As OLEObject
    For Each sh In ActiveSheet.OLEObjects
    i = i + 1
    ReDim Preserve checkB(i)
    Set checkB(i).clsCheckBox = sh.Object
    Next sh
    End Sub
    

    In DieseArbeitsmappe bzw. ThisWorkbook:
    
    Private Sub Workbook_Open()
    ThisWorkbook.Sheets(1).Select
    Call check
    End Sub
    

    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige