Suppression lignes [Résolu]

Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
- - Dernière réponse : ptitemeuh
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
- 6 mai 2010 à 11:05
Bonjour à tous,

J'ai un fichier texte qui contient différentes lignes. Par exemple:

5 - Haricots verts
4 - Pâtes
3 - Boeuf bourguignon
2 - Pommes de terre
1 - Sauce tomate

Recette de cuisine n°13


Lorsque je rajoute, par exemple "6 - Carottes", je voudrais supprimer "1 - Sauce tomate" et garder les 5 derniers ingrédients sans supprimer la remarque. On obtiendrais :

6 - Carottes
5 - Haricots verts
4 - Pâtes
3 - Boeuf bourguignon
2 - Pommes de terre

Recette de cuisine n°13


Si on en rajoute un seconde, cela donnerais :

7 - Moutarde
6 - Carottes
5 - Haricots verts
4 - Pâtes
3 - Boeuf bourguignon

Recette de cuisine n°13


J'ai mis en place mon programme mais en ce qui concerne la suppression, quelle fonction je peux prendre pour avoir ces conditions ?
Afficher la suite 

20/21 réponses

Meilleure réponse
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
3
Merci
Salut,

A oui mais non, il n'y a pas de delete pour un tableau en VBA ! C'est à toi de copier dans un nouveau tableau les lignes qui doivent rester, par exemple (de tête, à corriger peut-être) :

Public Function DeleteLine(byref oTableau As String(), byval lIndexLigne as long) As String()

dim i as long
dim oResultat() as String
dim lIndexCopie as long

  redim oResultat(UBound(oTableau))
  for i = 0 to UBound(oTableau)

    if i <> lIndexLigne then
    
      let lIndexCopie = lIndexCopie + 1
      let oResultat(lIndexCopie) = oTableau(i)

    end if

  next i
  Let DeleteLine = oResultat

End Sub


Et pour s'en servir :
Dim i as long
Dim tonTexte As String 
Dim tableauDeString() As String 

' récupération du tableau
tonTexte = "un texte" & vbcrlf & "qui tient" & vbcrlf & "sur plusieurs lignes." 
tableauDeString = Split(tonTexte, vbcrlf) 

'traitement pour supprimer les lignes
tableauDeString = DeleteLine(tableauDeString, 1)

'reconversion en string :
for i = 0 to ubound(tableauDeString)
  
  if i > 0 then
    tonTexte = tonTexte & vbcrlf
  tonTexte = tonTexte & tableauDeString(i)

next i

End if

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
3
Merci
Salut,

Bon j'ai testé et corrigé les quelques petites erreurs :
Public Function DeleteLine(ByRef oTableau() As String, ByVal lIndexLigne As Long) As String()

Dim i As Long
Dim oResultat() As String
Dim lIndexCopie As Long

  ReDim oResultat(UBound(oTableau) - 1)
  For i = 0 To UBound(oTableau)

    If i <> lIndexLigne Then
    
      Let oResultat(lIndexCopie) = oTableau(i)
      Let lIndexCopie = lIndexCopie + 1
      
    End If

  Next i
  Let DeleteLine = oResultat

End Function

Private Sub Form_Load()
    
Dim i As Long
Dim tonTexte As String
Dim tableauDeString() As String

' récupération du tableau
tonTexte = "un texte" & vbCrLf & "qui tient" & vbCrLf & "sur plusieurs lignes."
tableauDeString = Split(tonTexte, vbCrLf)

'traitement pour supprimer les lignes
tableauDeString = DeleteLine(tableauDeString, 1)

'reconversion en string :
tonTexte = ""
For i = 0 To UBound(tableauDeString)
  
  If i > 0 Then
    tonTexte = tonTexte & vbCrLf
  End If
  tonTexte = tonTexte & tableauDeString(i)

Next i

End Sub

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
3
Merci
Salut,

Tu as oublié les parenthèses :
Dim tableauDeString() As String
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
0
Merci
Salut,

Il te faut recréer ton fichier avec les bonnes données.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Bonjour,

C'était juste un petit exemple histoire de montrer où je voudrais supprimer. En fait, je suis sous outlook et lorsque j'envoie un mail, mon programme vérifie si l'adresse mail correspond à l'un des contacts dans mon carnet d'adresses. Si oui, il modifie les notes associées au contact et ajoute un numéro incrémenté à chaque fois avec objet du mail la date et le destinaire. Ces numéros correspondent au nombre de consultations pour chaque contact. Et à chaque ajout, je voudrais vérifier le nombre de ligne avec la numéroration
-> Si ce nombre est >5 alors on supprime la 6ème ligne
-> Si non, rien ne se passe
Je voudrais faire le test avec la numérotation car il peut exister des remarques que je ne voudrais pas effacer

J'ai vu qu'il existait une fonction "sed" mais elle supprime que les lignes vides...
Commenter la réponse de ptitemeuh
Messages postés
215
Date d'inscription
mercredi 26 avril 2006
Statut
Membre
Dernière intervention
2 août 2012
0
Merci
bonjour
Darksidious t'a déjà donnée l'idée, il faut que tu lit ton fichier texte tu le met dans une variable, tu fait tes changement puis tu enregistre la varibale dans le fichier texte en écrasant l'ancien contenu.


Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie (mon site)
Commenter la réponse de lediablo
Messages postés
215
Date d'inscription
mercredi 26 avril 2006
Statut
Membre
Dernière intervention
2 août 2012
0
Merci
donc tu as 3 étapes :
1- Lecture
2- Traitement
3- Enregistrement


Quand on pose une question on est con 5 minutes,Quand on ne la pose pas on le reste toute sa vie (mon site)
Commenter la réponse de lediablo
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Bonjour,

D'accord.

J'ai regardé de mon côté et pour supprimer ma ligne il faut que je découpe ma textbox en un tableau. Quelle est la fonction qui permet de transformer mon texte en un tableau en fonction d'un retour à la ligne [chr(10) ou chr(13)] ?
Commenter la réponse de ptitemeuh
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
0
Merci
Salut,

Utilise la fonction split :

Dim tonTexte As String
Dim tableauDeString() As String

tonTexte = "un texte" & vbcrlf & "qui tient" & vbcrlf & "sur plusieurs lignes."
tableauDeString = Split(tonTexte, vbcrlf)
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut !

Merci pour ton code ^^ Une fois sous forme de tableau, je vais ainsi choisir la ligne à supprimer. Par contre, une dernière question: une fois mon tableau de créer à partir de split et une fois ma modification faite, comment je fais pour transformer ce coup là mon tableau en un texte ? Je réutilise la fonction split ?
Commenter la réponse de ptitemeuh
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
0
Merci
Salut,

Non la fonction split ne permet que de passer d'un texte à un tableau, pour l'inverse, il te suffit de concaténer ton tableau :

Dim i as long
Dim tonTexte As String 
Dim tableauDeString() As String 

' récupération du tableau
tonTexte = "un texte" & vbcrlf & "qui tient" & vbcrlf & "sur plusieurs lignes." 
tableauDeString = Split(tonTexte, vbcrlf) 

'traitement pour supprimer les lignes
'...

'reconversion en string :
for i = 0 to ubound(tableauDeString)
  
  if i > 0 then
    tonTexte = tonTexte & vbcrlf
  tonTexte = tonTexte & tableauDeString(i)

next i

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Merci pour ton aide. J'ai essayé de mettre en place ma suppression de ligne en utilisant
rows(numero_de_la_ligne).Delete
mais il me marque que "Erreur de compilation : Sub ou Function non définie en surlignant Rows Je ne comprends pas pourquoi cela ne veut pas fonctionner alors que dans les programmes que j'ai trouvé cela fonctionne...
Commenter la réponse de ptitemeuh
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
0
Merci
Salut,

C'est quoi ce rows ? Il sort d'où ?
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Apparemment Rows permet de sélectionner la ligne de mon tableau que je veux supprimer mais apparemment ça ne marche pas...
Commenter la réponse de ptitemeuh
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

J'ai essayé :

Dim i as long
Dim tonTexte As String 
Dim tableauDeString() As String 

' récupération du tableau
tonTexte = "un texte" & vbcrlf & "qui tient" & vbcrlf & "sur plusieurs lignes." 
tableauDeString = Split(tonTexte, vbcrlf) 

'traitement pour supprimer les lignes
tableauDeString(6).Delete

'reconversion en string :
for i = 0 to ubound(tableauDeString)
  
  if i > 0 then
    tonTexte = tonTexte & vbcrlf
  tonTexte = tonTexte & tableauDeString(i)

next i

End if



Message d'erreur : qualificateur incorrect. Et en fait, la ligne avec Rows doit être pour Excel, c'est pour ça que ça ne marche pas.
Commenter la réponse de ptitemeuh
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Merci encore de ton aide. Mais il existe une erreur sur DeleteLine "Incompatibilité de type" pourtant, les noms entre parenthèses correspondent bien dans la fonction...
Commenter la réponse de ptitemeuh
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81
0
Merci
Salut,

J'ai mal placé mes parenthèses :
Public Function DeleteLine(byref oTableau() As String, byval lIndexLigne as long) As String()

dim i as long
dim oResultat() as String
dim lIndexCopie as long

  redim oResultat(UBound(oTableau))
  for i = 0 to UBound(oTableau)

    if i <> lIndexLigne then
    
      let lIndexCopie = lIndexCopie + 1
      let oResultat(lIndexCopie) = oTableau(i)

    end if

  next i
  Let DeleteLine = oResultat

End Sub

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Il y a une autre erreur "Incompatibilité du type : tableau ou type défini par l'utilisateur attendu" qui apparaît sur tableauDeString dans le code:

' Traitement pour supprimer les lignes
tableauDeString = DeleteLine(tableauDeString, 1)


J'ai regardé sur internet sur cette erreur, il parle "Pour vous assurer que les types de données pour les deux tableaux sont compatibles, les deux tableaux avec le même type de données de dimension. " Pourtant ça doit bien être compatible vu que c'est le même tableau
Commenter la réponse de ptitemeuh
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Arf' j'ai encore la même erreur même en modifiant le programme, c'est bizarre...

Voici mon code au complet :

Option Explicit

' Copier dans un tableau les lignes qui doivent rester
Public Function DeleteLine(ByRef oTableau() As String, ByVal lIndexLigne As Long) As String()

Dim i As Long
Dim oResultat() As String
Dim lIndexCopie As Long

  ReDim oResultat(UBound(oTableau) - 1)
  For i = 0 To UBound(oTableau)

    If i <> lIndexLigne Then
    
      Let oResultat(lIndexCopie) = oTableau(i)
      Let lIndexCopie = lIndexCopie + 1
      
    End If

  Next i
  Let DeleteLine = oResultat

End Function

Private Sub Application_ItemSend(ByVal Item As Object, _
Cancel As Boolean)

Dim Courriel As MailItem
Dim Destinataires As Recipients
Dim Destinataire As Recipient
Dim UnContact As ContactItem
Dim Nb As Integer
Dim Ns As NameSpace
Dim Carnet As MAPIFolder
Dim V As Object

Set Ns = GetNamespace("MAPI")
Set Carnet = Ns.GetDefaultFolder(olFolderContacts)  'Recherche dans les contacts personnels
'Set Carnet=Ns.GetDefaultFolder(olPublicFoldersAllPublicFolders).folders("Fournisseurs") 'Recherche dans les contacts partagés
Set Courriel = Item
Set Destinataires = Courriel.Recipients


' ENREGISTREMENT DES CONSULTATIONS DE CHAQUE CONTACT
' Pour tous les destinataires du courriel
For Each Destinataire In Destinataires

    ' Rechercher dans les contacts
    For Each V In Carnet.Items
            If TypeName(V) = "ContactItem" Then 'Vérifier s'il s'agit d'un ContactItem
            Set UnContact = V
            If UnContact.Email1Address = Destinataire.Address _
            Or UnContact.Email2Address = Destinataire.Address _
            Or UnContact.Email3Address = Destinataire.Address Then
                ' Destinataire trouvé
                If UnContact.Body = "" Then
                    ' Ajouter la première consultation dans Notes du contact
                    UnContact.Body = "1.  " & Format(Now(), "dddddd") & "   -  De " & Courriel.Session.CurrentUser.Name & "   -  Objet :  " & Courriel.Subject
                    UnContact.Save
                    Else
                        ' Ajouter la dernière consultation à la liste dans Notes du contact

                        Dim Separation As Variant
                        Separation = Split(UnContact.Body, ".  ", , vbTextCompare) 'Extrait chiffre de la première ligne
                        ' Separation(0) représente le premier nombre
                        UnContact.Body = (Separation(0) + 1) & ".  " & Format(Now(), "dddddd") & "   -  De " & Courriel.Session.CurrentUser.Name & "   -  Objet :  " & Courriel.Subject & vbCrLf & UnContact.Body
                        
                        Dim Nbre_lignes As Integer
                        Nbre_lignes = UBound(Split(UnContact.Body, "Objet")) 'Compteur de lignes
                        If Nbre_lignes > 5 Then 'S'il existe plus de 5 lignes
                '__________________________________________________________________________________
                            Dim i As Long
                            Dim tableauDeString As String

                            ' Récupération du tableau
                            tableauDeString = Split(UnContact.Body, vbCrLf)
                            
                            ' Traitement pour supprimer les lignes
                            tableauDeString = DeleteLine(tableauDeString, 1)
                            
                            ' Reconversion en string :
                            For i = 0 To UBound(tableauDeString)
                                If i > 0 Then
                                    UnContact.Body = UnContact.Body & vbCrLf
                                End If
                                UnContact.Body = UnContact.Body & tableauDeString(i)
                            Next i
                                
               '__________________________________________________________________________________
                        
                        End If
                        
                        UnContact.Save
                End If

    Exit For
            End If
        End If

        Next V

        Next Destinataire
    

End Sub


Commenter la réponse de ptitemeuh
Messages postés
83
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Salut,

Merci, faute bête et méchante! Mais ce qui est bizarre c'est que la suppression de ma 6ème ligne, rien ne se passe. J'obtiens une copie de ce qui avait déjà:

6. mercredi 5 mai 2010 - De Dupond - Objet : 123456789
5. mardi 4 mai 2010 - De Dupond - Objet : msgbox
4. mardi 4 mai 2010 - De Dupond - Objet : On veut 127
3. mardi 4 mai 2010 - De Dupond - Objet : On veut 126
2. mardi 4 mai 2010 - De Dupond - Objet : il faut une cinq
1. mardi 4 mai 2010 - De Dupond - Objet : Uncontact6. mercredi 5 mai 2010 - De Dupond - Objet : 123456789
4. mardi 4 mai 2010 - De Dupond - Objet : On veut 127
3. mardi 4 mai 2010 - De Dupond - Objet : On veut 126
2. mardi 4 mai 2010 - De Dupond - Objet : il faut une cinq
1. mardi 4 mai 2010 - De Dupond - Objet : Uncontact129
Commenter la réponse de ptitemeuh