Création et suppression checkbox

Bonjour,

J'ai essayé de trouver sur internet mais j'ai trouvé les méthodes un peu floues et le code trop long. J'aimerais créer une checkbox en fonction d'une cells(i, j) dans une certaine condition et la supprimer dans une autre (ces conditions sont déjà posés, la chexkbox est une étape en plus). J'ai essayé de faire f1 sur l'objet checkbox mais la page d'aide ne trouve pas la fonction.

Pourriez vous me montrer comment simplement créer ou supprimer une checkbox dans une cellule (i, j). (je pense utiliser captation = "" et display3dshading=false. Je crois aussi qu'avec left=cells(i, j), top=cells(i, j) (...) on peut adapter la checkbox à la taille de la cellule mais pas sur j'arrive pas à tester).

Bonjour,

Voici 2 liens qui devraient vous aider :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.oleobjects.add

https://docs.microsoft.com/fr-fr/office/vba/api/excel.oleobjects.delete

Exemple d'utilisation :

with Worksheets(1).cells(i, j)
    .Parent.OLEObjects.Add ClassType:="Forms.CheckBox.1", Left:=.left, Top:=.top, Width:=.width, Height:=.height
end with

Cdlt,

Merci beaucoup,

cependant j'ai toujours des problèmes pour supprimer la checkbox d'une cellule. J'ai essayé

Worksheets(8).Cells(3, 1).OLEObjects.Delete

ça n'a pas fonctionné, ensuite j'ai réessayé avec

Worksheets(8).Cells(3, 1).OLEObjects.Parent.Delete

Ca a supprimé toutes les checkbox. J'ai voulu voir à quoi sert parent, peu de détails mais logiquement je pense que l'objet parent d'une cellule est la feuille. Mais dans ce cas avec la ligne que vous avez proposé, pourquoi parent.[...].add n'aurait pas ajouté des checkbox dans toutes les cases.

Il y a de grandes chances que je dise des choses fausses, c'est peut être .delete qui supprime tout. Bref je n'arrive pas a supprimer une seule checkbox

J'ai pu voir qu'il y a un lien entre parent et les ajustements, sert-il donc à aider le positionnement de la checkbox ?

Je ne sais pas trop comment procéder, si je veux ajouter des paramètres comme captation = "", je ne sais pas comment désigner l'objet.

Après la ligne que tu as proposé, si je veux placer un paramètre, comment je désigne la checkbox afin d'appliquer le paramètre.

En fait, .parent est l'objet parent de la cellule cells(i, j) : cela renvoie la feuille (qui est aussi l'objet parent des oleobjects, les contrôles sur feuille). Cette syntaxe, c'était pour abréger le code car on reprend les coordonnées (top, left, ...) de la cellule.

Voici un essai simplifié (à améliorer probablement pour déterminer la topleftcell ou l'adresse) pour la suppression :

dim ol as oleobject
with Worksheets(1).cells(i, j)
    if ajouter then '<<< condition à adapter (pour ajout)
        with .Parent.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.left, Top:=.top, Width:=.width, Height:=.height)
            .placement = xlmoveandsize
            .name = .parent.cells(i, j).address
            .object.caption = "coucou" 'par exemple pour agir sur la checkbox
        end with
    elseif supprimer then '<<< condition à adapter (pour supp)
        '.parent.oleobjects(.address).delete '<<< tester ceci également à la place des 2 lignes qui suivent (SSI oleo bien nommés !)
        set ol = GetOleobject(.cells)
        if not ol is nothing then ol.delete
    end if
end with

function GetOleobject(cell as range) as oleobject
dim ol as oleobject
for each ol in cell.parent.oleobjects
    if ol.top = cell.top and ol.left = cell.left then
        set GetOleobject = ol
        exit function
    end if
next ol
end function

Cdlt,

Merci, je compte bien tester le programme complet, cependant je coince au début. J'ai ça :

Sub Tessst()
'
' Tessst Macro
'

Dim i As Integer, j As Integer, ol As OLEObject
For i = 1 To 5
j = 3
With Worksheets(8).Cells(i, j)
    .Parent.OLEObjects.Add ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height
    .Placement = xlMoveAndSize
    .Name = .Parent.Cells(i, j)
    .Object.captation = ""
End With
Next i

End Sub

Cependant les 3 lignes .placement [...], .name [...] et .object [...] ne marchent pas, cela me met erreur 438, propriété ou méthode non gérée par cet objet.

J'ai ensuite vu et corrigé, j'ai fait ça :

Sub Tessst()
'
' Tessst Macro
'

Dim i As Integer, j As Integer, ol As OLEObject
For i = 1 To 5
j = 3
With Worksheets(8).Cells(i, j).Parent.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    .Placement = xlMoveAndSize
    .Name = .Parent.Cells(i, j)
    .Object.captation = ""
End With
Next i

End Sub

Cependant ça ne marche toujours pas, il me dit référence non spécifiée, il me surligne .Left en bleu et met le curseur jaune sur Sub Tessst.

Y-a-t-il un problème avec la déclaration des objets, with mal géré ou autre chose ?

Pour l'instant ce sont des tests afin de mettre le code voulu dans le bon programme, il y a bien un if dans lequel ça ferait un add, et l'autre delete.

Sinon je ne comprends pas trop à quoi correspond la fonction GetOleobject.

Bonjour,

Essaie avec :

With Worksheets(8).Cells(i, j).Parent.OLEObjects.Add ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height
    .Placement = xlMoveAndSize
    .Name = .Parent.Cells(i, j)
    .Object.captation = ""
End With

J'essaie sinon des variantes avec des boutons mais je sais pas si ça consomme beaucoup environ 10 boutons grand max avec 2/3 qui se supprime et 2/3 qui arrivent chaques jour, après ça revient à peu près à la même chose. Je coince sur oleobject :/

J'ai trouvé du code :

ActiveSheet.CheckBoxes.Add(Cells(x, y + 2).Left, Cells(x, y + 2).Top, 54, 24).Select
                With Selection
                    .Caption = ""
                    .Display3DShading = False
                End With

Cela semble fonctionner, cependant cela peut dupliquer des checkboxes si je répète l'opération, comment désigner si une checkbox est déjà présente

Bonjour,

L'autre méthode consiste à créer vos checkbox avec l'option "Visible=False"

Ainsi vous faites apparaître à la demande celles que vous voulez avec l'option inverse. L'avantage étant que vous pouvez placer l'une sur l'autre.. (les checkbox

ou combobox ou textbox qui ne peuvent pas apparaître en même temps).

J'avais pas vu ton message, le problème c'est que cette ligne apparait en rouge, ça met erreur de compilation et attendu : fin d'instruction.

With Worksheets(8).Cells(i, j).Parent.OLEObjects.Add ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height

Je vous envoie mon fichier en espérant que vous compreniez ce que ce programme fait. Dès que je change l'heure d'une des 3 machine à la page d'accueil, ça calcule l'heure restante dans la feuille correspondante et ça renvoie les opérations où il reste moins de 50 heures. Je voudrais que chaque opération ait sa checkbox en page d'accueil. J'ajouterais un bouton qui ferait que pour chaque checkbox cochés, l'opération correspondante aura son heure actualisée dans la feuille correspondant + archive de l'heure où j'ai appuyé sur le bouton.

Je ne pense pas utiliser des checkboxes cachés car le nombre à l'accueil peut varier et j'aimerais faire un truc assez propre (à voir si je change d'avis). Est-ce que c'est possible de supprimer une checkbox avec une manière similaire à laquelle j'ai trouvé ?

Sinon j'ai mis le code qui marche dans machine1 et le code de test dans feuil8 (ou module1).

J'avais ça qui marchait

ActiveSheet.CheckBoxes.Add(Cells(x, y + 2).Left, Cells(x, y + 2).Top, 24, 24).select
With selection
    .Caption = ""
    .Display3DShading = False
End With

J'ai voulu le transformer en ça afin d'avoir une "référence" pour chaque checkboxe, ainsi ce serait plus facile de supprimer celle choisie, ou de ne pas la créer 2 fois si elle l'est déjà.

cb = ActiveSheet.CheckBoxes.Add(Cells(x, y + 2).Left, Cells(x, y + 2).Top, 24, 24)
With cb
    .Caption = ""
    .Display3DShading = False
    .LinkedCell = Cells(x, y + 2)
End With

Mais ça marche pas, je ne peux pas faire cb = ...

Bonjour à tous,

@Whyph : As-tu essayé mon code tel qu'il est maintenant ? Parce que caption est devenu captation, address a disparu, il faut bien mettre les parenthèses sur la méthode .add pour obtenir l'objet (sinon, le with échoue) ou alors on est sur le mauvais objet, la cellule cells(i, j)...

Je n'ai pas beaucoup de doutes quant à cette partie du code puisqu'elle a fonctionné auparavant. C'est la seconde partie (if supprimer) qui est à tester.

Bien entendu, ajouter et supprimer sont à remplacer par les conditions que tu désires pour générer l'ajout ou la suppression.

Cdlt,

Ca ne marchait toujours pas, avec ou sans parenthèses, j'ai construit un truc en cherchant un peu partout :

dim c as string, x as integer, y as integer
c = Range(Cells(x, y + 2), Cells(x, y + 2)).Address
 ActiveSheet.CheckBoxes.Add(Cells(x, y + 2).Left, Cells(x, y + 2).Top, 24, 24).Select
With Selection
        .Caption = ""
        .LinkedCell = c
        .Display3DShading = False
End With

Ca marche bien, il ne me reste plus qu'à supprimer et à ne pas dupliquer (sans doute avec l'adresse genre executer la création si la checkbox d'une certaine adresse n'existe pas encore) pour supprimer je vais essayer ce que tu m'as proposé.

je ne comprends pas, je voulais mettre ceci afin de tout supprimer dans la colonne voulue (plus de problème de duplication/suppression).

dim DelRange as range
Set Delrange = Range("D")  
For Each check In CheckBoxes
    If Not Intersect(check.TopLeftCell, DelRange) Is Nothing Then
        check.Delete
    End If
Next

Ce code fonctionne très bien en macro cependant dans une sheets, ca ne fonctionne pas. De plus ce sont les lignes qui ne sont pas censés poser problème :

DelRange = Range("D")

ou alors

dim ws as worksheet
ws = worksheets("accueil")

ou

Range("D").Select
CheckBoxes.Selection.Delete

Si j'enlève toutes les déclarations d'objets et que je reprécise tout, ça ne fonctionne pas non plus.

Bonjour,

Un essai :

Sub Ajout(x, y) 
Set C=Cells(x,y+2)
Set ChkBx=Activesheet.CheckBoxes.Add(C.Left,C.Top,24,24)
With ChkBx
.Caption =""
.LinkedCell=C.Address
End With
End Sub

Sub Sup(x, y)
For Each ChkBx in Activesheet.CheckBoxes
If ChkBx.TopLeftCell.Address = Cells(x, y+2).Address Then ChkBx.Delete : Exit For
Next
End Sub

Le 3D est a False par défaut je crois.

@ bientôt

LouReeD

Bonjour à tous,

Whyph, j'ai l'impression que tu vas un peu dans tous les sens... Il serait préférable de traiter un problème à la fois pour avoir une chance de tous les résoudre.

Je viens de tester mon code et il a marché du premier coup donc je t'invite à tester correctement mon code. Si tu as besoin d'effectuer des modifications, on gagnera du temps si tu les détailles ici pour qu'on puisse adapter le code en conséquence.

Pour tes autres problèmes, il peut arriver de na pas avoir accès à certaines propriétés (et peut-être méthodes) dans les modules de feuille mais ce n'est pas forcément la raison des échecs que tu as rencontrés.

Je crois qu'on écrit range("D:D") ou columns(4) et on affecte une variable objet avec l'instruction set : set ws = worksheets("nom").

Cdlt,

Désolé de ne pas être clair,

Puisque je n'arrivais pas hier, j'ai testé d'autres codes sur internet, j'ai réussi à trouver celui que j'ai proposé en haut. Il me restait deux solutions afin de réussir à avoir toujours les bonnes checkboxes :

1ère solution : trouver comment supprimer les checkbox avec (i, j) quand elles doivent êtres supprimées, puis trouver comment ne pas créer une checkbox qui à déjà été copiée puis link à une cellule.

2è solution : supprimer toutes les checkbox d'une colonne au début du programme, comme ça elle créera seulement celles voulu, plus de problème de duplication et plus besoin de supprimer certaines cellules seules celles utiles seront crées par la suite du programme.

Je prends donc la deuxième solution. Vous m'avez bien aidés mais il me reste un problème, vos codes fonctionnent, mais pas dans une condition précise :

Il faudrait simplement que chaque checkbox dans la collonne D (ou avec l'adresse de la colonne D) soit supprimée. Je ne sais pas trop comment faire, j'ai ça :

For Each ChkBx In ActiveSheet.CheckBoxes
    ChkBx.Delete: Exit For
Next

Je n'utilise pas x et y dans cette partie car en utilisant la solution 2, l'ajout et la suppression des checkbox n'apparaissent pas au même moment dans les mêmes sub.

En espérant avoir été clair, merci.

J'ai réussi ! le code dans la worksheet ne marchait pas, je l'ai mis dans ThisWorkbook et j'ai fait call ThisWorkbook.SuprCheck

Merci beaucoup !

Rechercher des sujets similaires à "creation suppression checkbox"