VBA word supprimer lignes en doubles

VBA word supprimer lignes en doubles - VB/VBA/VBS - Programmation

Marsh Posté le 18-08-2017 à 15:37:28    

Bonjour
j'ai une macro VBA qui fait une opération un peut compliquée
elle vérifie si un fichier PDF est ouvert, puis si c'est le cas sauve ce fichier PDF en txt, et le reinjecte ensuite dans une zone de texte dans word
 
je fais cela car j'ai une autre macro qui effectue un contrôle, mais qui ne sais le faire que dans des zone de texte et donc dans l'environement MSOffice
 
ca marche , mais  j'ai quelque soucis !
 
lorsque je save le fichier pdf en txt, j'ai parfois des lignes en double
et donc je les reinjecte en double
ce qui allonge le traitement et parasite le contrôle
 
 
voici la partie de code qui récupère le contenu du txt pour le mettre dans word
 

Code :
  1. i = 0 'Initialisation du compteur de lignes
  2.         While Not EOF(IndexFichier) '
  3.             Line Input #IndexFichier, ContenuLigne
  4.             Selection.TypeText Text:=ContenuLigne
  5.             Selection.TypeParagraph
  6.             i = i + 1
  7.             If i = 100 Then 'Toutes les 100 lignes on ajoute une nouvelle textbox
  8.                 Set txtBx = ThisDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 20, 100, 500, 200)
  9.                 txtBx.Select
  10.                 i = 0
  11.             End If
  12.         Wend


 
comment faire pour au passage, supprimer les lignes en doubles ?
 
 
 
 
 
 

Reply

Marsh Posté le 18-08-2017 à 15:37:28   

Reply

Marsh Posté le 22-08-2017 à 11:58:19    

 
            Bonjour,
 
            utiliser une Collection ou l'objet Dictionary, les deux étant consultables dans l'aide VBA interne …
 

Reply

Marsh Posté le 22-08-2017 à 18:08:34    

Code :
  1. Sub Sup_doublons()
  2. Dim objDictionary As Scripting.Dictionary
  3. Dim objFSO As Scripting.FileSystemObject
  4. Dim objFile As Scripting.TextStream
  5. Dim oTxt As Scripting.TextStream
  6. Set objDictionary = CreateObject("Scripting.Dictionary" )
  7. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  8. Set objFile = objFSO.OpenTextFile("C:\Temp\tempo_pour_controle.txt", ForReading)
  9. Dim strName As String
  10. Do Until objFile.AtEndOfStream
  11. strName = objFile.ReadLine
  12. If Not objDictionary.Exists(strName) Then
  13. objDictionary.Add strName, strName  'creation du dico en ingorant les ligne en doubles
  14. End If
  15. Loop
  16. objFile.Close
  17. Dim strKey As Variant
  18. Set objFile = objFSO.OpenTextFile("C:\Temp\tempo_pour_controle.txt", ForWriting)   'reecriture du fichier a partir du dico
  19. For Each strKey In objDictionary.Keys
  20. objFile.WriteLine strKey
  21. Next
  22. objFile.Close
  23. End Sub


 
ca marche  :D  
j'ai creé une routine juste pour faire la manip
elle lit le fichier, met les données dans le dico, mais sans les doublons
puis elle reecrit le fichier a partir du dico
 
on peut faire plus propre ?


Message édité par daniel-12 le 22-08-2017 à 18:08:57
Reply

Marsh Posté le 22-08-2017 à 19:15:49    

 
            • En ligne 16 la chaîne peut être vide car seule la clef compte …
 
            • Ne pas oublier de libérer chaque variable objet en fin de procédure …
 
            • J'ai bien l'impression que les références à des ActiveX ont été activées (déclaration anticipée / early binding) et
               utilisées lors de la déclaration de variables objet mais l'affectation de ces variables ne les utilise pas (late binding)
               vu l'utilisation de la fonction CreateObject !
 
            VBA ayant déjà tout le nécessaire pour un fichier texte, je n'utiliserais pas l'ActiveX FileSystemObject …              
 

Reply

Marsh Posté le 22-08-2017 à 19:25:50    

en effet c'est coché Microsoft Scripting Runtime
car j'avais des soucis en adaptant ce code venant d'un VBS
 
comment tu verrais le code ?
 
 
j'ai un autre soucis
mais on verra après


Message édité par daniel-12 le 22-08-2017 à 19:26:27
Reply

Marsh Posté le 23-08-2017 à 16:24:30    

 
            Peu importe en déclaration anticipée pour profiter de l'Intelisense ou en déclaration tardive mais en évitant de les mélanger !
 
            L'autre souci pouvant remettre en cause une procédure déjà développée,
            mieux vaut donc avoir une vision globale avant d'écrire ne serait-ce la première ligne de code …
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed