Supprimer une ligne dans une base de données EXCEL, SANS VBA

Accueil – Le CFO masqué Forums Excel Supprimer une ligne dans une base de données EXCEL, SANS VBA

  • Ce sujet contient 11 réponses, 2 participants et a été mis à jour pour la dernière fois par Pimpin, le il y a 3 années et 8 mois.
12 sujets de 1 à 12 (sur un total de 12)
  • Auteur
    Articles
  • #66634
    Pimpin
    Participant

    Bonjour à toutes et à tous,

    J’ai trouvé une formule pour surligner une ligne dans une base de données EXCEL, et je voudrais supprimer cette ligne SANS VBA.

    Pour cela, il faudrait récupérer le numéro de la ligne sélectionnée et trouver une formule EXCEL pour effacer la ligne en question ou son contenu dans la base de données.

    Merci pour votre aide.

    #68476
    Lionel
    Participant

    Salut Pimpin,
    (⊙﹏⊙)
    Avec une simple formule, tu ne peux pas supprimer une ligne de ta DB. Tu peux trouver le numéro de ligne mais ensuite, soit tu le fais en manuel soit via VBA. De plus, juste effacer le contenu risque de te poser un problème car tu vas avoir des lignes vides au fur et à mesure dans ta DB ce qui n’est pas très logique, ni performant…

    #68477
    Pimpin
    Participant

    Merci mon ami,

    Par contre peux-tu juste me montrer la bonne formule qui permet de retrouver le numéro de la ligne sélectionnée stp. Avec un peu de chance je vais essayer de bricoler une macro au pire.
    J’ai trouvé une façon pour surligner une ligne dans ma BDD avec la MFC c’est trop top. je rentre dans une cellule la référence recherchée et hop la ligne entière est coloriée. Et à chaque fois que je modifie le contenu de la cellule, la ligne coloriée change aussi.
    Merci bien !

    #68478
    Lionel
    Participant

    Voici un petit fichier.
    J’ai mis une petite DB dans les colonnes A>C. Le critère est en F3 et la ligne trouvée se trouve en G3.

    Attachments:
    You must be logged in to view attached files.
    #68903
    Pimpin
    Participant

    Merci pour ton fichier. Tu es trop fort !
    Finalement je commence à me mettre au VBA MDR
    Au fait, j’ai trouvé un petit programme intéressant mais qui ne m’arrange pas tout à fait.
    Je voudrais que la variable Supprime8_Ligne = Inputbox récupère directement la valeur de la cellule A2.
    Peux-tu m’aider QUESTVBA ?
    Sub Supprime_Reference
    Dim i as integer,
    Dim Supprime_Ligne
    Supprime_Ligne = Inputbox (“Référence à supprimer”)
    With Thisworkbook.sheets (“BDD”)
    For i = .range (“A” &.rows.count).end (xlup).row to 2 step – 1
    If .range (“A” & i).value = Supprime_Ligne then
    Rows (i).delete
    End if
    Next i
    End with
    end Sub

    #68904
    Lionel
    Participant

    Salut,
    Voici ce que je te propose. La méthode Find devrait être plus rapide que passer toutes les cellules en revue (le fichier est en xslx, à modifier en xlsm pour activer les macros) :

    Option Explicit
    
    Sub Find_And_Delete()
    
    Dim LigneASuppr As Range, PlageDeRecherche As Range
    Dim Valeur_Cherchee As String, AdresseTrouvee As String
    
    Valeur_Cherchee = InputBox("Référence à supprimer")
    'Dans la première colonne de la feuille BDD
    Set PlageDeRecherche = Sheets("BDD").Range("A:A")
    '*******************************
    
    'Méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
    Set LigneASuppr = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
    
    'Traitement de l'erreur possible : Si on ne trouve rien :
    If LigneASuppr Is Nothing Then
        'Ici, traitement pour le cas où la valeur n'est pas trouvée
        AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
        MsgBox AdresseTrouvee
    Else
        'Ici, traitement pour le cas où la valeur est trouvée
        AdresseTrouvee = Range(LigneASuppr.Address).Row
        Rows(AdresseTrouvee).Delete
        MsgBox "La ligne " & AdresseTrouvee & " avec la référence " & Valeur_Cherchee & " a été supprimée."
    End If
    
    'Vidage des variables
    Set PlageDeRecherche = Nothing
    Set LigneASuppr = Nothing
    End Sub
    • Cette réponse a été modifiée le il y a 3 années et 9 mois par Lionel.
    Attachments:
    You must be logged in to view attached files.
    #68907
    Pimpin
    Participant

    Salut,

    Merci pour ton fichier, je vais regarder cela plus tard après le taff.
    Tout ceci reste encore du chinois pour moi. Je dois y aller mollo lol
    2 questions :
    1 – Si je me mets vraiment au VBA, est-ce que tu peux vraiment protéger toutes
    tes lignes d’écriture pour que personne n’y accède. Que l’utilisateur se
    contente d’utiliser une application sans fouiller dans tes lignes de programmation ?
    2 – Et maintenant que je m’intéresse au VBA, tu fais comment déjà pour cacher ton mot
    de passe que tu saisies à l’écran par des “*”.
    Merci pour ton aide, QUESTVBA, LE PRO DU VBA

    #68909
    Lionel
    Participant

    Pour ta question 1 :
    Avec ALT F11, tu arrives sur la fenêtre VBA.
    Onglet ‘Outils’ → ‘Propriétés de VBAProject…’ → Onglet ‘Protection’, Cocher ‘Verrouiller le projet pour affichage’ → encoder ton MDP et le confirmer → OK → Quitter → Enregistrer → Fermer le fichier.
    À la prochaine ouverture, il faudra mettre ce MDP pour aller modifier le code des macros.

    #68911
    Lionel
    Participant

    Pour le question 2 :
    Pour le mot de passe tu peux utiliser ce codes.

    Code 1 : à mettre dans ThisWorkbook. Donc, à l’ouverture du fichier, on te demande ton MDP qui est ‘Test’. Si c’est correct, tu continues, sinon Excel se ferme.

    Private Sub Workbook_Open()
        Dim PASSWORD As String, MDP
        PASSWORD = "Test"
        MDP = InputBoxDmdMDP("Entrez le mot de passe...", "Password")
        If MDP <> PASSWORD Then
            MsgBox ("L'accès ne vous est pas autorisé. Bye Bye ! ")
            Application.Quit
        End If
    End Sub

    Code 2 : à mettre dans la partie Modules. Cette partie permet de gérer les *.

    Option Explicit
    Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
    ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _
    ByVal dwThreadId As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _
    (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
    Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
    Private Const EM_SETPASSWORDCHAR = &HCC
    Private Const WH_CBT = 5
    Private Const HCBT_ACTIVATE = 5
    Private Const HC_ACTION = 0
    Private hHook As Long
    
    Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim RetVal
    Dim strClassName As String, lngBuffer As Long
    If lngCode < HC_ACTION Then
        NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
        Exit Function
    End If
    strClassName = String$(256, " ")
    lngBuffer = 255
     If lngCode = HCBT_ACTIVATE Then
        RetVal = GetClassName(wParam, strClassName, lngBuffer)
            If Left$(strClassName, RetVal) = "#32770" Then
            SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
            End If
     End If
    CallNextHookEx hHook, lngCode, wParam, lParam
    End Function
    
    Public Function InputBoxDmdMDP(Prompt, Optional Title, Optional Default, Optional XPos, _
    Optional YPos, Optional HelpFile, Optional Context) As String
    Dim lngModHwnd As Long, lngThreadID As Long
    lngThreadID = GetCurrentThreadId
    lngModHwnd = GetModuleHandle(vbNullString)
    hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
    InputBoxDmdMDP = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
    UnhookWindowsHookEx hHook
    End Function
    • Cette réponse a été modifiée le il y a 3 années et 9 mois par Lionel.
    #68913
    Pimpin
    Participant

    J’ai testé ce programme Sub Find_And_Delete() mais il y a quelques petits points à régler :
    1 – Quand j’ai validé sur le bouton Annuler de la Msgbox lorsque la macro se lance, il m’a
    affiché quand même un message de suppression ??
    2 – Quand je lance la macro, j’ai remarqué que le pointeur de la souris mouline sans arrêt sauf
    si le pointeur est sur la boite de dialogue ??
    3 – J’ai essayé de modifier l’entête de la Msgbox à la place de Microsoft Excel et le programme a planté. Et même après avoir retiré la partie que j’avais rajouté, il a continué à me trouver des erreurs ??
    J’étais obligé de redémarrer mon PC.
    Peux-tu me renvoyer le même programme corrigé stp

    #68934
    Lionel
    Participant

    Voici, pour la gestion de Annuler et l’en-tête.

    Option Explicit
    
    Sub Find_And_Delete()
    
    Dim LigneASuppr As Range, PlageDeRecherche As Range
    Dim Valeur_Cherchee As String, AdresseTrouvee As String
    
    Valeur_Cherchee = InputBox("Référence à supprimer", "RÉFÉRENCE")
    'Dans la première colonne de la feuille BDD
    Set PlageDeRecherche = Sheets("BDD").Range("A:A")
    '*******************************
    'Si appuye sur Annuler ou OK en pas d'encodage
    If Valeur_Cherchee = "" Then Exit Sub
    'Méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
    Set LigneASuppr = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
    
    'Traitement de l'erreur possible : Si on ne trouve rien :
    If LigneASuppr Is Nothing Then
        'Ici, traitement pour le cas où la valeur n'est pas trouvée
        AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
        MsgBox AdresseTrouvee
    Else
        'Ici, traitement pour le cas où la valeur est trouvée
        AdresseTrouvee = Range(LigneASuppr.Address).Row
        Rows(AdresseTrouvee).Delete
        MsgBox "La ligne " & AdresseTrouvee & " avec la référence " & Valeur_Cherchee & " a été supprimée."
    End If
    
    'Vidage des variables
    Set PlageDeRecherche = Nothing
    Set LigneASuppr = Nothing
    End Sub
    #71178
    Pimpin
    Participant

    Salut QUESTVBA,

    Peux-tu m’aider ?
    Je voudrais créer une phrase présentable incluant la date et l’heure.
    J’ai pu afficher ce message :
    Bonjour, nous sommes le 12/07/2020 et il est 18:50:10

    avec cette ligne :
    Sheets (« ACCUEIL ») . range (« d10:w10 ») = « Bonjour, nous sommes le » & d_now & » et il est » & t_now

    Mais je voudrais afficher :
    Bonjour, nous sommes le dimanche 12 juillet 2020 et il est 18 heures 50 minutes.

    De plus, de 18 heures à minuit mettre Bonsoir
    Et mettre au singulier heure et minute si c’est 0 ou 1 (1 heure ou 1 minute).
    Merci pour ton aide.

12 sujets de 1 à 12 (sur un total de 12)
  • Vous devez être connecté pour répondre à ce sujet.