Checkbox aktivieren ohne Checkbox-Name nur anhand der Possition

Skamigo

Newbie
Registriert
Apr. 2022
Beiträge
5
Hallo,
Ich habe eine Tabelle mit sehr vielen Zeilen und Spalten voller Artikelname, Bestand, Kosten etc. (dazwischen gibt es aber auch Leerzeilen oder Zeilen die keinen Knopf/Checkbox bekommen)
Für jeden Artikel habe ich eine Zeile. In Spalte 1 Steht der Artikel, in Spalte 2 habe ich einen Knopf der mit Hilfe eines Makros eine Datei anhand der Artikelnummer in Spalte 1 öffnet, oder falls die Datei noch nicht vorhanden ist, erstellt. Nun will ich mit einer Checkbox, die ebenfalls in Spalte 2 neben dem Knopf sitzt anzeigen, ob bereits eine Datei erstellt wurde. Beim Knopf habe ich mit ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row abgefragt in welcher Zeile der Knopf sitzt und den wert dann aus Spalte 1 ausgelesen. Wie bekomme ich nun die Checkbox die in der Zeile sitzt gesetzt? Wenn es irgendwie geht ohne ActiveX Checkbox. Passieren sollte das dann in einer If-Abfrage.
Kann mir da jemand weiter helfen? o.o

BeispielTabelle.PNG


Code:
Sub OeffneArtikelStatistik()

Dim Artikelname As String
Dim tempArtikelname As String
Dim buttonRow As Integer
Dim Pfad_alt As String
Dim Pfad_neu As String
Dim oFSO As Object
Dim appXL As Excel.Application

Set oFSO = CreateObject("Scripting.FileSystemObject")
buttonRow = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
Artikelname = Tabelle1.Cells(buttonRow, 1).Value

Set appXL = New Excel.Application

If Artikelname <> "" Then
    tempArtikelname = Artikelname & ".xlsm"
    If InStr(1, tempArtikelname, "/") > 0 Then
        tempArtikelname = Replace(Artikelname, "/", "")
    End If
    If Dir(Pfad_neu & tempArtikelname, vbDirectory) <> vbNullString Then
         ÖFFNE DATEI
    Else
          ERSTELLE DATEI UND SETZT CHECKBOX
        Else
            GoTo Ende
        End If
    End If
Else
    MsgBox "Keine Artikelnummer angegeben"
    GoTo Ende
End If

End Sub
 
Einfache CheckBoxen haben ganz ohne VBA eine korrespondierende Zelle die ein Formeleregebnis Wahr/Falsch auswerten.
Unter VBA kommst du um das Vergnügen nicht herum, dass jede CheckBox einen Namen haben muss den ein Makro stupide und dumm mit einer Datenzeile verknüpft um die CheckBox zu schalten.

Frage: was nützt dir da eine CheckBox statt z.B. Bedingter Formatierung? Und was möge passierrn wenn da jemand klickt und damit umschaltet? Damit ist erst mal jede Aussage dahin und du musst das Klicken per Makro abfangen; Änderungen im Ballt per Aktions-Makro.
Lohnt dieser Aufwand? (All das wirkt auch mehr nach Datenbank?!)

CN8
 
Hallo,
danke für die sehr schnelle Antwort.
Ich hatte gehofft, dass das so ähnlich wie bei dem Knopf funktioniert. Viele Knöpfe -> 1 Makro, so dass ich diese beliebig oft copy/pasten kann. Um zu verhindern das jemand die Checkbox einfach so benutzt, wollte ich die Checkbox entweder disabled setzen (wenn das überhaupt geht) oder mit einem Makro den Status umkehren. Der tatsächliche Status der Checkbox sollte nur durch das Makro im Knopf veränderbar sein. Ich kenne mich leider noch nicht so gut aus mit VBA und muss mich da gerade etwas durchwursten und ausprobieren welche Möglichkeiten ich habe.
Ich hätte auch die Möglichkeit eine weitere Spalte einzufügen und dann da ein Checkbox-Symbol einzufügen, aber ich fände eine Lösung mit einer richtigen Checkbox schöner.
Wie könnte denn eine bedingte Formatierung aussehen?


Skamigo
 
Moin,

warum denn immer so negativ? Ist doch alles kein Problem. Ob eine Checkbox hier das richtige muss man sehen, es gibt bestimmt auch irgendein anderes Merkmal, das man benutzen kann.

Aber bau dir für den Anfang eine Funktion, welche dir eine neue/alte Checkbox zurückliefert. Diese setzt du dann je nachdem TRUE oder FALSE. Die Checkboxen selber bekommen den Artikelnamen als Namen verpasst, somit findest du sie dann leicht wieder.

Gib den neuen Checkboxen eine feste Position relativ zum Button, damit sie immer in einer Reihe in der richtigen Position sind.

Also, Checkboxen werden vom Makro erzeugt, zurückgeliefert und positioniert.

Damit sollte es gehen. Versuch mal ein bisschen, ich rück später noch Code raus ;-)
 
Uff da hab ich keine Ahnung wie das funktionieren soll T.T
Ich hab jetzt eine Funktion, welche mir eine CB erstellt an die Pos die ich haben möchte..
Aber leider kann ich den Namen nicht ändern und deshalb kann ich auch nicht abfragen, ob diese Checkbox bereits existiert.. d.h er klatscht mir jedes mal wenn ich auf den Knopf drücke eine neue CB über die alte..
Meine Funktion sieht wie folgt aus...

Code:
Function ChkBoxErzeugen(name As String, rowPos As Integer, fileExists As Boolean)

    Dim PosX As Single
    Dim PosY As Single
   
    PosX = (Range("B$" & rowPos).Left) + 50
    PosY = (Range("B$" & rowPos).Top) + 2

    With ActiveSheet.CheckBoxes
        .Add(PosX, PosY, 0, 0).Select
        .Caption = ""
        .Value = fileExists
    End With
   
End Function
 
Zuletzt bearbeitet:
With … CheckBoxes … Add

Ob du von selbst drauf kommst wo das Bömbchen liegt 😉 ?

Du kannst nicht anders, VBA kann nicht anders - du musst den CheckBoxen einen Namen geben und dann stupide jede dieser Boxen anspringen und gemäß Bedingungen schalten.

BOX_15 mag eben die Box in Zeile 15 sein, du musst die 15 kennen und kannst (wenigstens) mit dem über Stringfunktion zusammengesetzten Namen (aus eben der Zeilennummer) die Box anfassen.
Das ist umständlich, teils unlogisch - nix zu machen. Viel dumme Handarbeit.

CN8
 
Hallo,
Du kannst nicht anders, VBA kann nicht anders - du musst den CheckBoxen einen Namen geben und dann stupide jede dieser Boxen anspringen und gemäß Bedingungen schalten.
Damit hätte ich kein Problem. Ich würde gerne der Checkbox die Artikelnr + die Zeilenzahl die ich aus dem Knopf habe als Name geben. Doch leider kann ich bei meiner obigen Funktion keinen .Name = name machen da kommt bei mir ein Fehler, dass die Methode nicht unterstützt wird.

Hast du das Problem inzwischen gelöst, oder soll ich nochmal ran?
Bin leider noch nicht weiter gekommen als oben gezeigt.
Ich benutze Excel 2007 vlt. ist das noch wichtig..
 
mmmhhhhh....

.Add(PosX, PosY, 0, 0).Select

Hast du da immer noch das select dran?

Hier mal gaaaanz schnell zu rumtesten für dich :-)

Code:
Sub ChkBoxErzeugen()

    Dim PosX As Single
    Dim PosY As Single
  
    PosX = 50
    PosY = 2

    With ActiveSheet.CheckBoxes.Add(PosX, PosY, 0, 0)
        .Caption = "Test"
        .Name = "Test"
        .Value = True
    End With
  
End Sub
 
Zuletzt bearbeitet:
Suche dir Codebeispiele die Objekte ablaufen - hier für Diagramme:
Code:
Sub Täscht()
Dim DiaGramm As ChartObject
For Each DiaGramm In ActiveSheet.ChartObjects
 Debug.Print DiaGramm.Index
 Debug.Print DiaGramm.Name
 Debug.Print DiaGramm.Chart.Name
Next
End Sub
Und mit dem DiaGramm.Name kannst du dich vortasten bis du - bei eben sinnfälliger beNAMsung - genau das Objekt triffst das zur Nummer passt.
Selection.Row liefert die Zeile wo die Zelle markiert ist (irgendwo muss man ja ansetzen). Von mir aus Zeile 6. Dann hast du fleißig vorgearbeitet mit «Häkchen01», «Häkchen02», «Häkchen03»… als Name des CheckBox-Objects. Zeile 6 zu einer 06 zu machen und dann mit IF und INSTR den Namen auf das Vorkommen von 06 (oder gleich ›Häkchen06‹) zu testen ist einfach. Und wenn es ein Treffer ist hast du das Häkchen am Haken das du setzt oder ent–setzt oder Weiteres damit treibst.

Du kannst ein ActiveSheet.ChartObjects(25) ansprechen (ein laufender Index), aber kein ActiveSheet.ChartObjects("Häkchen25"), das ist ja das Problem bei der ganzen Übung.

Das ist umständlich weil MS beim Anlegen der Objekte nicht Stupide einen Namen verlangt.
Konstruktionen wie in Janush Beispiel With ActiveSheet.CheckBoxes.Add(PosX, PosY, 0, 0) um das Hinzugefügte Objekt an der Leine zu halten damit man ihm auch einen Namen geben kann sind für mich welche mit Bauchwehpotenzial… Leider geht es nur so.

CN8
 
Danke für die schnellen Antworten. Ich hatte am Wochenende leider keine Zeit diese zu testen =) aber ich werde gleich wieder rumprobieren.
 
Zurück
Oben