Suppression lignes

Résolu
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010 - 4 mai 2010 à 11:54
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 ?

21 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 11:49
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
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 15:06
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
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 15:30
Salut,

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

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mai 2010 à 13:26
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
4 mai 2010 à 14:49
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...
0
lediablo Messages postés 214 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 2 août 2012
4 mai 2010 à 15:19
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)
0
lediablo Messages postés 214 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 2 août 2012
4 mai 2010 à 15:20
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)
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 08:53
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)] ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 09:05
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
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 09:14
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 ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 09:19
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
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 11:16
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...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 11:19
Salut,

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

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 11:21
Salut,

Apparemment Rows permet de sélectionner la ligne de mon tableau que je veux supprimer mais apparemment ça ne marche pas...
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 11:43
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.
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 14:31
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...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mai 2010 à 14:40
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
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 14:51
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
0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 15:23
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


0
ptitemeuh Messages postés 83 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 8 juillet 2010
5 mai 2010 à 15:46
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
0
Rejoignez-nous