Mise en forme

cdric78

XLDnaute Junior
Bonsoir à tous,

N'ayant pas trouvé de solution pour convertir mon fichier PDF au format Excel.

Je souhaite pouvoir modifier la mise en forme des données obtenu par le biais du "Copier-Coller". La mise en forme n'a pas été conserver lors de la copie.

Dans le fichier ci-joint une copie du fichier PDF, la version copier (AVANT) et la version dans laquelle les données doivent être modifiées (APRES). Dans l'exemple il y a peu de lignes mais dans les fichiers que j'ai à traiter il peu y avoir jusqu’à 1000 lignes.

Je reste à votre disposition si mes explications ne sont pas suffisamment claires.

Merci par avance pour votre aide.

Cédric
 

Pièces jointes

  • Transfo.xlsx
    41.3 KB · Affichages: 47

ROGER2327

XLDnaute Barbatruc
Re : Mise en forme

Bonjour cdric78


SI et seulement SI les données se présentent toujours selon la structure

[texte1 sans espace ni :]espace[texte2 sans espace ni :]espace[texte3 sans espace ni :]:[texte4 sans :]

le code suivant peut faire l'affaire :
VB:
Sub toto()
    Application.CutCopyMode = False
    With Range(Range("A1"), Range("A1").End(xlDown))
        .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
        Range("B1").Select
        .Offset(0, 1).Cut Destination:=.Offset(0, 3)
        .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
        Range("F1").FormulaR1C1 = "=IF((RC[-2]<>"""")*(RC[-3]<>""""),RC[-5],"""")"
        Range("G1").FormulaR1C1 = "=IF(RC[-1]<>"""",RC[-5],IF(RC[-5]<>"""",RC[-6],""""))"
        Range("H1").FormulaR1C1 = "=CHOOSE(1+COUNTBLANK(RC[-2]:RC[-1]),RC[-5],RC[-6],RC[-7])&"":""&RC[-4]"
        .Offset(0, 5).Resize(1, 3).AutoFill Destination:=.Offset(0, 5).Resize(, 3), Type:=xlFillDefault
        .Offset(0, 5).Resize(, 3).Value = .Offset(0, 5).Resize(, 3).Value
    End With
    Columns("A:E").Delete Shift:=xlToLeft
End Sub

Mode d'emploi : coller les données en A1 d'une feuille vierge, exécuter la procédure toto.


ROGER2327
#5621


Mardi 17 Pédale 139 (Saint Dricarpe, prosélyte - fête Suprême Quarte)
21 Ventôse An CCXX, 0,9324h - mandragore
2012-W10-7T02:14:16Z
 

Lone-wolf

XLDnaute Barbatruc
Re : Mise en forme

Bonjour Roger, cdric78

si tu le permet j'aimerais ajouter ton code dans ma liste de Codes VBA,
mais je ne sais pas quel intitulé je dois lui donner.

"Copier-Coller avec séparation de texte" est-il juste?



A+ :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : Mise en forme

Re...



Bonjour Roger, cdric78

si tu le permet j'aimerais ajouter ton code dans ma liste de Codes VBA,
mais je ne sais pas quel intitulé je dois lui donner.

"Copier-Coller avec séparation de texte" est-il juste?



A+ :cool:
Vous me flattez !

Quant au titre à donner, je n'en vois pas qui s'impose naturellement. Alors, pourquoi pas "Copier-Coller avec séparation de texte" ?

Cependant, si ce code doit être archivé (je ne l'avais personnellement pas fait), je vous en propose une version plus sérieuse. En effet, ma proposition initiale est plutôt brute de fonderie ; autant la paramétrer proprement :
VB:
Sub ConversionSpéciale()
    ConvSpé Range("C4"), 0, 2 'première cellule de données, décalage de ligne de sortie, décalage de colonne de sortie
        'Si l=c=0, les données traitées remplacent les données originales.
End Sub

Sub ConvSpé(r As Range, Optional l&, Optional c&)
    With Range(r.Cells, r.Cells.End(xlDown))
        On Error GoTo E
        .TextToColumns Destination:=.Offset(l, c), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True '*
        .Offset(l, c + 1).Cut Destination:=.Offset(l, c + 3)
        On Error GoTo 0
        Application.DisplayAlerts = False
        .Offset(l, c).TextToColumns Destination:=.Offset(l, c), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
        Application.DisplayAlerts = True
        .Offset(l, c + 5).FormulaR1C1 = "=IF((RC[-2]<>"""")*(RC[-3]<>""""),RC[-5],"""")" '*
        .Offset(l, c + 6).FormulaR1C1 = "=IF(RC[-1]<>"""",RC[-5],IF(RC[-5]<>"""",RC[-6],""""))"
        .Offset(l, c + 7).FormulaR1C1 = "=CHOOSE(1+COUNTBLANK(RC[-2]:RC[-1]),RC[-5],RC[-6],RC[-7])&"":""&RC[-4]"
        .Offset(l, c + 5).Resize(, 3).Value = .Offset(l, c + 5).Resize(, 3).Value
        .Offset(l, c).Resize(, 5).Delete Shift:=xlToLeft
        .Offset(l, c).Resize(, 3).EntireColumn.AutoFit
E:  End With
End Sub

La version précédente correspond à cette version ainsi paramétrée :
ConvSpé Range("A1"), 0, 0
ou, simplement,
ConvSpé Range("A1")


ROGER2327
#5622


Mardi 17 Pédale 139 (Saint Dricarpe, prosélyte - fête Suprême Quarte)
21 Ventôse An CCXX, 4,6756h - mandragore
2012-W10-7T11:13:17Z
 
Dernière édition:

cdric78

XLDnaute Junior
Re : Mise en forme

Bonjour Roger,

Merci beaucoup pour ce code. J'ai essayé le premier puis le second. Le premier fonctionne nikel, donc merci beaucoup, par ailleurs le second ne fonctionne pas. Je ne sais pas pourquoi il ne fonctionne pas (pas assez pro :p), et je n'ai pas trop compris l'intérêt des modif.

Merci et bonne journée.

Cédric
 

ROGER2327

XLDnaute Barbatruc
Re : Mise en forme

Re...


Bonjour Roger,

Merci beaucoup pour ce code. J'ai essayé le premier puis le second. Le premier fonctionne nikel, donc merci beaucoup, (...)
Tant mieux !
(...) par ailleurs le second ne fonctionne pas. (...)
Étonnant ! Voyez le classeur ci-dessous.
(...) et je n'ai pas trop compris l'intérêt des modif. (...)
Les modifications permettent de conserver les données de départ si on le souhaite, et d'afficher les résultats à un endroit quelconque de la feuille. Par exemple : vos données étant en C4:C47, vous pouvez obtenir les résultats en G50:G93 en écrivant
VB:
Sub ConversionSpéciale()
    ConvSpé Range("C4"), 46, 4
End Sub
dans le module de la feuille Feuil1.​


ROGER2327
#5623


Mardi 17 Pédale 139 (Saint Dricarpe, prosélyte - fête Suprême Quarte)
21 Ventôse An CCXX, 5,4214h - mandragore
2012-W10-7T13:00:41Z
 

Pièces jointes

  • Transfo_180392.xlsm
    50.4 KB · Affichages: 27
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Mise en forme

Re...


Re Roger,

merci encore pour cette nouvelle version.

Mais je ne comprends pas ceci:
'Si l=c=0, les données traitées remplacent les données originales; ça correspond à quoi Si l=c=0 ?


A+ :cool:
Si l et c sont tous les deux nuls (ou omis) dans l'appel de ConvSpé, les données converties se substituent aux données originales.
Si l=0 et c=1, les données originales sont conservées, les données converties sont placées dans la colonne suivante.​


ROGER2327
#5624


Mardi 17 Pédale 139 (Saint Dricarpe, prosélyte - fête Suprême Quarte)
21 Ventôse An CCXX, 5,4535h - mandragore
2012-W10-7T13:05:18Z
 

Lone-wolf

XLDnaute Barbatruc
Re : Mise en forme

Merci Roger pour les explications.

@cdric78: tu peux aussi mettre tout dans Module 1:

Code:
Sub ConversionSpéciale()
    ConvSpé Range("C4"), 0, 2 'première cellule de données, décalage de ligne de sortie, décalage de colonne de sortie
       'Si l=c=0, les données traitées remplacent les données originales.
End Sub

Sub ConvSpé(r As Range, Optional l&, Optional c&)
    With Range(r.Cells, r.Cells.End(xlDown))
        On Error GoTo E
        .TextToColumns Destination:=.Offset(l, c), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True '*
       .Offset(l, c + 1).Cut Destination:=.Offset(l, c + 3)
        On Error GoTo 0
        Application.DisplayAlerts = False
        .Offset(l, c).TextToColumns Destination:=.Offset(l, c), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=True, Other:=False, OtherChar _
            :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
        Application.DisplayAlerts = True
        .Offset(l, c + 5).FormulaR1C1 = "=IF((RC[-2]<>"""")*(RC[-3]<>""""),RC[-5],"""")" '*
       .Offset(l, c + 6).FormulaR1C1 = "=IF(RC[-1]<>"""",RC[-5],IF(RC[-5]<>"""",RC[-6],""""))"
        .Offset(l, c + 7).FormulaR1C1 = "=CHOOSE(1+COUNTBLANK(RC[-2]:RC[-1]),RC[-5],RC[-6],RC[-7])&"":""&RC[-4]"
        .Offset(l, c + 5).Resize(, 3).Value = .Offset(l, c + 5).Resize(, 3).Value
        .Offset(l, c).Resize(, 5).Delete Shift:=xlToLeft
        .Offset(l, c).Resize(, 3).EntireColumn.AutoFit
E:  End With
End Sub

et dans le module de la feuille mettre ceci:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ConvertionSpeciale
End Sub

Code testé fonctionnel.


A+ :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : Mise en forme

Re...


(...)

@cdric78: tu peux aussi mettre tout dans Module 1:

(...)
Certes, mais c'est perdre tout l'intérêt du paramétrage. Mon idée était qu'on pouvait avoir plusieurs feuilles à traiter, les données n'étant pas nécessairement situées identiquement dans chaque feuille.

En mettant la procédure ConvSpé dans un module standard, et la procédure ConversionSpéciale dans chacune des feuilles à traiter, on a une solution assez souple.

Voyez par exemple l'adaptation pour traiter deux feuilles dans le classeur joint.


ROGER2327
#5626


Mardi 17 Pédale 139 (Saint Dricarpe, prosélyte - fête Suprême Quarte)
21 Ventôse An CCXX, 5,6676h - mandragore
2012-W10-7T13:36:08Z
 

Pièces jointes

  • Transfo_180392_2.xlsm
    51.4 KB · Affichages: 44
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz