Disposer des informations de lignes à colonnes afin de réaliser un publipostage

elcubanito

XLDnaute Nouveau
Bonjour,

J'ai un fichier excel comportant des adresses de mairies que j'ai récupéré en les numérisant avec reconnaissance OCR. Sauf que le logiciel de numérisation m'a sorti un fichier bizarre que je vous transmet en pj (seulement quelques lignes car le fichier en compte plus de 600)

Comment d'après vous faire pour mettre automatiquement les informations dans des colonnes pour réaliser ensuite un publipostage. Colonne 1 NOM, colonne 2 adresse, colonne 3 complément (BP), colonne 4 CP, colonne 5 ville

Pour ma part j'ai réussi à supprimer les caractères au début des noms et à la fin de la ville mais je ne sais pas comment mettre dans des colonnes automatiquement mes lignes adresses, complément d'adresse et cp et enfin ville

voir onglet feuille 3.

Je me demande quelle pourrait être la meilleur démarche pour obtenir ce que je veux sans passer pas des copier coller.

Merci d'avance.

Pierre
 

Pièces jointes

  • fichier mairies forum.xlsx
    13.1 KB · Affichages: 46

Robert

XLDnaute Barbatruc
Repose en paix
Re : Disposer des informations de lignes à colonnes afin de réaliser un publipostage

Bonjour Pierre "Elcubanito", bonjour le forum,

Peut-être comme ça (nom des onglets à adapter) :
Code:
Option Explicit

Sub Macro1()
Dim OS As Object 'déclare la variable OS (Onglet Source)
Dim OD As Object 'déclare la variable OD (Onglet Destination)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set OS = Sheets("fichier original") 'définit l'onglet source OS (à adapter)
Set OD = Sheets("ce que je voudrais") 'définit l'onglet destination OD (à adapter)
'si la cellule A2 de l'onglet OD n'est pas vide, efface les anciennes données
If OD.Range("A2") <> "" Then OD.Range("A1").CurrentRegion.Offset(1, 0).ClearContents
'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet source OS
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row
Set PL = OS.Range("A1:A" & DL) 'définit la plage PL
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
    Select Case Left(CEL.Value, 4) 'agit en fonction des 4 premiers caractères de la cellule CEL
        Case 2014 'cas "2014"
            'définit la cellule de destination dest (première cellule vide de la colonne 1 (=A) de l'onglet OD
            Set DEST = OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)
            'DEST prend la valeur du texte apres le cinquième guillemet (") de la cellule CEL
            DEST.Value = Split(CEL.Value, Chr(34))(5)
        Case Else 'tous les autres cas
            'condition 1 : si le premier caractère de la cellule est numérique
            If IsNumeric(Left(CEL.Value, 1)) Then
                'DEST décalé de 3 colonnes à droite prend la valeur du texte avant le premier espace ( ) de CEl
                DEST.Offset(0, 3).Value = Split(CEL.Value, " ")(0)
                'DEST décalé de 4 colonnes à droite prend la valeur du texte après le premier espace ( ) de CEl
                DEST.Offset(0, 4).Value = Mid(CEL.Value, Application.WorksheetFunction.Search(Split(CEL.Value, " ")(1), CEL.Value, 1))
            Else 'sinon (condition 1 )
                'condition 2 : si la cellule une colonne à droite de DEST est vide
                If DEST.Offset(0, 1).Value = "" Then
                    'DEST décalé de 1 colonne à droite prend la valeur de la cellule CEL
                    DEST.Offset(0, 1).Value = CEL.Value
                Else 'sinon (Condition 2)
                    'DEST décalé de 2 colonnes à droite prend la valeur de la cellule CEL
                    DEST.Offset(0, 2).Value = CEL.Value
                End If 'fin de la condition 2
            End If 'fin de la condition 1
    End Select 'fin de l'action en fonction de...
Next CEL 'prochaihne cellule de la boucle
End Sub
 

Staple1600

XLDnaute Barbatruc
Dernière édition:

elcubanito

XLDnaute Nouveau
Re : Disposer des informations de lignes à colonnes afin de réaliser un publipostage

Merci Robert et JM,

Pour te répondre JM j'ai d'autres fichiers que celui des mairies avec des entreprises privées et je dois de toute façon utiliser uniquement les informations que nous avons sur les enveloppes océrisées car je ne suis pas sensé lui rajouter des mairies.

Robert, je regarde ton code et je vais voir pour créer une macro.
 
G

Guest

Guest
Re : Disposer des informations de lignes à colonnes afin de réaliser un publipostage

Bonjour,

Hello Robert:), Hello JM:)

Proposition:
Code:
Sub FaireLaChose()
Dim i As Integer, j As Integer, k As Integer
Dim datas As Variant, res() As Variant, itm As Variant
With Sheets("fichier original")
    datas = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
For i = 1 To UBound(datas)
    'recherche d'une ligne commençant par une date
    If datas(i, 1) Like "####/##/##*" Then
        
        j = j + 1: ReDim Preserve res(1 To 5, 1 To j)
        'eclater la ligne dans un tableau
        itm = Split(datas(i, 1), ",")
        
        'prendre le dernier élément du tableau comme non de ville
        res(1, j) = itm(UBound(itm)): itm = ""
        
        'Recherche du code postal
        For k = 1 To 3
            'Eviter le dépassement des limites de Datas (en fin de données)
            If i + k > UBound(datas) Then Exit For
            'Si code postal trouvé
            If datas(i + k, 1) Like "#####*" Then
               itm = datas(i + k, 1)
               res(4, j) = Left(itm, 5)
               res(5, j) = Right(itm, Len(itm) - 6)
               Exit For
            End If
        Next k
        'Suivant k récupérer l'adresse et le complément d'adresse
        Select Case k
           Case 2: res(2, j) = datas(i + 1, 1)
           Case 3
            res(2, j) = datas(i + 1, 1)
            res(3, j) = datas(i + 2, 1)
        End Select
     End If
Next i
'Resultat en Cellule A2:E? de la feuille destination
    Sheets("ce que je voudrais").Cells(2, 1).Resize(UBound(res, 2), 5) = Application.Transpose(res)
End Sub

A+
 

elcubanito

XLDnaute Nouveau
Re : Disposer des informations de lignes à colonnes afin de réaliser un publipostage

Bonjour.

Merci Hasco pour l'envoie du fichier. ça fonctionne parfaitement. J'ai eu juste à supprimer les " en début de colonne A.

Merci à vous tous pour la rapidité de vos réponses.

Par ailleurs ne connaissant encore pas grand choses aux macros et au VBA, pourriez-vous m'indiquez des sites que vous trouvez bien pour débuter autres que celui-ci.

A bientôt !

Pierre
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 314
Membres
103 176
dernier inscrit
jean.yvesjean.yves