Case à cocher

Bonjour le forum,

En fait j'ai regardé sur le net une solution à mon problème mais sans résultat, je bloque toujours. le besoin est le suivant:

j'ai trois feuilles dans mon classeur: Table excel, BD et table de rejet

La table excel est alimentée au fur et à mesure, j'ai créé deux boutons un pour valider une ligne donnée et l'autre pour l'annuler. afin de sélectionner une ligne j'ai opté pour la checkbox

Mon bouton valider me sert dans un premier temps pour créer une checkbox pour chaque ligne c'est ce que j'ai réussi à faire. par contre ce que je n'ai pas pu faire c'est que si je coche une case ou des cases et que j'appuie sur le bouton "valider" la ligne ou les lignes concernées seront transférées à la feuille "BD" (couper coller), sans écraser ce qu'il y a déjà dans la table BD.

Et si je coche une case ou plusieurs et que j'appuie sur le bouton "Annuler", la ligne ou les lignes concernées seront transférées à la feuille "table de rejet" (couper coller), sans écraser ce qu'il y a déjà dans la table table de rejet.

Merci d'avance pour votre aide

Veuillez trouver ci joint mon fichier.

28test-1.xlsm (164.39 Ko)

Tu dois aussi modifier ton code d'ajout de checkbox.. En effet le fait de rajouter et rajouter et rajouter.... Au final tu as 35000 checkboxes avec le même nom et cela ne marche pas. Avec le code ci dessous tu vas virer toutes les checkboxes avant de les rajouter

Toto sera la macro a mettre dans annuler

Sub Ajout_checkbox()
Dim i As Integer
Dim horizontal As Double
Dim vertical As Double

horizontal = ActiveSheet.Columns("a").Width 'Position horizontale = colonne C

i = ActiveSheet.UsedRange.Rows.Count 'compte le nombre de lignes dans la feuille

For Each sh In Sheets("Table Excel").Shapes
    If sh.Type = msoFormControl Then
        If sh.FormControlType = xlCheckBox Then
            sh.Delete
        End If
    End If
Next sh

For J = 3 To i 'boucle sur chaque ligne
vertical = ActiveSheet.Rows("1:" & J - 1).Height 'Fixe la hauteur de la ligne j
ActiveSheet.CheckBoxes.Add(horizontal, vertical, 15, 15).Select 'position et taille de la checkbox
Selection.Characters.Text = "" 'pas de texte dans la checkbox
Selection.Name = "CheckBox" & J 'Nomme la checkbox pour pouvoir travailler dessus par après

Next J

End Sub

Sub toto()
With Sheets("Table Excel")
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Shapes("CheckBox" & i).ControlFormat.Value = 1 Then
            .Shapes("CheckBox" & i).Delete
            .Range(.Cells(i, 3), .Cells(i, 17)).Copy Destination:=Sheets("Journal de rejet").Range("A" & Sheets("Journal de rejet").Range("A" & Sheets("Journal de rejet").Rows.Count).End(xlUp).Row + 1)
            .Rows(i).Delete
        End If
    Next i
End With
End Sub

Merci beaucoup EngueEngue pour ta réponse rapide.

en fait pour le bouton Valider je souhaiterai aussi si je coche une case ou des cases et que j'appuie sur le bouton "valider" la ligne ou les lignes concernées seront transférées à la feuille "BD" (couper coller), sans écraser ce qu'il y a déjà dans la table BD.

Merci d'avance

Amicalement

tu as vu l'esprit. Tu t'en inspires et tu te le fais

capture errreur

je l'ai fait c'est bon merci bcp. j'ai repris le meme code pour Annuler et je l'ai fait pour le bouton valider.

mais que soit pour annuler ou pour valider quand je coche deux ou plusieurs checkbox à la fois et je clique que soit sur Valider ou sur le bouton Annuler j'ai un message d'erreur.

Merci d'avance

je pense le problème est liée à la mise à jour des cases à cocher. la j'ai créé un bouton pour déclencher l’événement. il n y a pas un déclencheur automatique genre mettre à jour les cases à cocher à l'ouverture du fichier sans cliquer sur le bouton.

Je te dis ça parce que quand j'actualise les cases à cocher puis je coche puis j'appuie sur l'un des boutons ça marche nikel par contre si je mets pas à jour les cases à chaque fois ça pause problème

Merci d'avance

Amicalement

En effet je n'y avais pas pensé.

De même pour ton autre bouton

Sub toto()
With Sheets("Table Excel")
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Shapes("CheckBox" & i).ControlFormat.Value = 1 Then
            .Shapes("CheckBox" & i).Delete
            .Range(.Cells(i, 3), .Cells(i, 17)).Copy Destination:=Sheets("Journal de rejet").Range("A" & Sheets("Journal de rejet").Range("A" & Sheets("Journal de rejet").Rows.Count).End(xlUp).Row + 1)
            .Rows(i).Delete
        End If
    Next i
Call Ajout_checkbox
End With
End Sub

Merci beaucoup EngueEngue, c'est très gentil de ta part.

Une dernière demande stp, je souhaiterai lancer une mise à jour des cases à l'ouverture du fichier.

Merci bcp

Amicalement

Il faut le mettre dans le module thisworkbook ET SEULEMENT DANS CELUI CI

Private Sub Workbook_Open()
call Ajout_checkbox
End Sub

Merci bcp c'est vraiment gentil

Bonjour le forum, Bonjour EngueEngue et merci bcp encore une fois

En fait ça ne répond pas à mon besoin, je t'explique pourquoi

Mon fichier excel est connecté à une base de données sql, cette base de données alimente ma feuille Table Excel, lors de la configuration de la connexion à la base j'ai coché la case actualiser les données à l'ouverture du fichier (Chose que j'ai réussi à faire)

Avec le code que tu m'as filé ça répond trés bien à ma demande mais pas au besoin puisque je constate que la mise à jour des cases à cocher se fait avant la mise à jour des données et du coup je me retrouve avec des lignes sans cases.

Est ce que tu vois une solution ?

Merci beaucoup

Amicalement.

Qu'est ce qui déclanche ta mise à jour SQL ? Quand se fait elle ? Combien de temps dure t'elle ?

Admettons qu'elle dure 3.5 secondes

Private Sub Workbook_Open()
Dim s, p As Variant
p = 3.5: s = Timer: Do While Timer < s + p: DoEvents: Loop
call Ajout_checkbox
End Sub
capture 20

j'ai connecté ma base à mon fichier excel, avec mysql connector ODBC

La mise à jour se fait à l'ouverture du fichier excel ( voir ci joint l'image)

Je ne sais pas combien de temps elle dure mais je pense que c'est rapide (petite base)

Dis moi si ma solution marche... Sinon essaye de mettre avant ton call

Application.CalculateUntilAsyncQueriesDone

Et sinon nous allons devoir modifier la façon d'appeller la requête par une ADODB

ça ne marche pas EngueEngue en fait t'as macro bloque les deux événements j'ai même mis 20 sec et je constate que les deux événements se déclenchent après 20 sec mais toujours la mise à jour des cases avant la maj des données

Et comme ceci ?

Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:15"), "Ajout_checkbox"
End Sub

Oui ça marche très bien merci bcp EngueEngue c'est très gentil de m'avoir consacrer de ton temps

Une autre question (je sais que j'ai abusé)

Est ce qu'il y a moyen de lancer une instruction afin de supprimer les lignes validées ou annulées de ma base de données sql.

Je m’explique, une fois que je clique sur le bouton valider ou annuler , la ligne est transférée soit vers la feuille "BD" soit vers la feuille "journal de rejet", je ne souhaiterai pas avoir cette ligne sur ma feuille "Table Excel" lors de la mise à jour des données autrement dit sur le champ quand je coche et je valide ça transfere la donnée mais supposant j'ai fermé mon fichier je le ré-ouvre il y aura la mise à jour des données et la ligne réapparaît dans ma feuille Table Excel

là ça devient touchy. Sans avoir accès à ta DB SQL je ne peux pas t'aider. Mais en théorie oui c'est possible.

Bon courage

j'ai constaté un problème avec le code sur thisworkbook

en fait ça marche niquel chrome ça met à jour les cases et les données par contre j'ai un bug monstre quand je change de feuille et je sauvegarde le fichier.

avant de sortir du fichier je sauvegarde mais pas sur la feuille Table Excel mais en étant sur la feuille BD sur laquelle j'ai un userform

Merci d'avance EngueEngue

Amicalement

Il faut que tu ajustes le code... Ce n'est plus le classeur actif, c'est le classeur en question

Sub Ajout_checkbox()
Dim i As Integer
Dim horizontal As Double
Dim vertical As Double

horizontal = Sheets("Table Excel").Columns("a").Width 'Position horizontale = colonne C

i = Sheets("Table Excel").UsedRange.Rows.Count 'compte le nombre de lignes dans la feuille

For Each sh In Sheets("Table Excel").Shapes
    If sh.Type = msoFormControl Then
        If sh.FormControlType = xlCheckBox Then
            sh.Delete
        End If
    End If
Next sh

For J = 3 To i 'boucle sur chaque ligne
vertical = Sheets("Table Excel").Rows("1:" & J - 1).Height 'Fixe la hauteur de la ligne j
Sheets("Table Excel").CheckBoxes.Add(horizontal, vertical, 15, 15).Select 'position et taille de la checkbox
Selection.Characters.Text = "" 'pas de texte dans la checkbox
Selection.Name = "CheckBox" & J 'Nomme la checkbox pour pouvoir travailler dessus par après

Next J

End Sub
Rechercher des sujets similaires à "case cocher"