1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
| Sub Zomaplus() 'By Mr Zomaplus
Dim Curcalc As XlCalculation
Dim ws, Ws2 As Worksheet
Dim Chemin As String, Fichier As String
Application.ScreenUpdating = False
Curcalc = Application.Calculation
Application.Calculation = xlCalculationManual
'Définit le répertoire contenant les fichiers
'On Error GoTo std_errhandler
If Sheets("Menu").Range("B7").Value = "" Then
Chemin = Browseforfolder()
Sheets("Menu").Range("B7") = Chemin
Else
Chemin = Sheets("Menu").Range("B7").Value
End If
If Chemin = "" Then Exit Sub
'Boucle sur tous les fichiers rep du répertoire.
Fichier = Dir(Chemin & "\*.rep")
If Fichier = "" Then MsgBox "Aucun fichier de type .rep dans le répertoire sélectionné"
Do While Len(Fichier) > 0
'Debug.Print Chemin & Fichier
Application.StatusBar = "Traitement en cours : " & Fichier
'On vérifie qu'il n'y ait pas de feuille déjà ayant pour nom le même que celui que l'on veut lui donner
For Each Ws2 In ThisWorkbook.Sheets
If Ws2.Name = Mid(Fichier, 10, 5) Then
MsgBox ("Une feuille existe déjà avec pour nom : " & Ws2.Name & vbCrLf & "Merci de bien vouloir la supprimer ou la renommer")
Exit Sub
End If
Next Ws2
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = Mid(Fichier, 10, 5)
'Contient l'ensemble des opérations à effectuer sur le fichier spécifié
Call Execution(Chemin & "\" & Fichier, ws)
Fichier = Dir()
Loop
Set ws = Nothing
Set Ws2 = Nothing
Sheets("Menu").Select
Application.Calculation = Curcalc
Application.ScreenUpdating = True
Application.StatusBar = False
Exit Sub
std_errhandler:
MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description
Application.Calculation = Curcalc
Application.ScreenUpdating = True
End Sub
Sub Execution(repertoire_source As String, ByVal Cible As Worksheet)
Dim I As Long
Dim Max_ligne As Long
Dim last_source_line As Long
Dim B, Str As String
Dim Val_possibles(60) As Variant
Dim Match As Boolean
Dim Lignes_a_suppr As Collection
Dim L As Variant
Dim source As Worksheet
'Import du fichier
Call copie(Cible, repertoire_source)
'Split en colonnes
Call Split(Cible)
Set source = Sheets("Source")
'Suppression des colonnes B,E,F,I,J,K
Cible.Columns("k:k").Delete Shift:=xlToLeft
Cible.Columns("j:j").Delete Shift:=xlToLeft
Cible.Columns("i:i").Delete Shift:=xlToLeft
Cible.Columns("f:f").Delete Shift:=xlToLeft
Cible.Columns("e:e").Delete Shift:=xlToLeft
Cible.Columns("b:b").Delete Shift:=xlToLeft
'Suppression des lignes pour lesquelles la cellule B est de longueur inférieure à 6
'Les lignes sont d'abord stockées dans une collection, afin de ne pas perturber la boucle
'Puis tous les membres de la collection sont supprimés
Max_ligne = Cible.UsedRange.Rows.Count
Set Lignes_a_suppr = New Collection
For I = 1 To Max_ligne
Str = Cible.Cells(I, 2).Value
Str = Replace(Str, " ", "")
If Len(Str) < 6 Or Str = "------" Then 'la condition 6 tirets n'est pas dans le cahier des charges mais elle m'a paru évidente
Lignes_a_suppr.Add Cible.Cells(I, 2).EntireRow
End If
Next I
For Each L In Lignes_a_suppr
L.Delete
Next L
Set Lignes_a_suppr = Nothing
'Insertion d'une ligne
Cible.Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Titres des colonnes
Cible.Cells(1, 1).Formula = "Code Agence"
Cible.Cells(1, 2).Formula = "RC"
Cible.Cells(1, 3).Formula = "Libellé"
Cible.Cells(1, 4).Formula = "Montant"
Cible.Cells(1, 5).Formula = "Nbre"
'Inscription du nom de la feuille en colonne A si b non vide, ou b rempli de blancs
For I = 2 To Max_ligne
If Replace(Cible.Cells(I, 2).Value, " ", "") <> "" Then
Cible.Cells(I, 1).Value = Cible.Name
End If
Next I
'Suppression des .00 et des virgules
Cible.Range("D:E").Replace What:=".00", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cible.Range("D:E").Replace What:=",", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
Sub copie(Feuille_cible As Worksheet, Path_source As String)
'Copie des lignes des fichiers .rep
'Code par Mr Poulpe, légèrement adapté
Dim intFic, I As Integer
Dim strLigne As String
intFic = FreeFile
Open Path_source For Input As intFic
I = 1
While Not EOF(intFic)
Line Input #intFic, strLigne
Feuille_cible.Cells(I, 1) = strLigne
I = I + 1
Wend
Close intFic
End Sub
Sub Split(Feuille_cible As Worksheet)
'Ce code utilise la ligne 6 des fichiers REP, qui définit la largeur en nombre de caractères de chaque colonne. Le nombre de tirets consécutifs correspond à la largeur de la colonne
'On compte donc le nombre de tirets consécutifs, puis on stocke le résultat de chaque série de tirets dans une collection
'Ensuite, il suffit de découper la première colonne selon les largeurs de colonnes obtenues pour remettre les valeurs en colonne
Dim Col_sizes As Collection
Dim Cnt As Integer
Dim cell_size As Integer
Dim I, j As Long
Dim Master_cell As Range
Dim Max_lignes As Long
Dim gauche_cellule As Long
Dim str_temp As String
Set Col_sizes = New Collection
Set Master_cell = Feuille_cible.Cells(6, 1)
cell_size = Len(Master_cell)
Cnt = 0
For I = 1 To cell_size
If Mid(Master_cell.Value, I, 1) = "-" Then
Cnt = Cnt + 1
Else
Col_sizes.Add Cnt
Cnt = 0
End If
Next I
Max_lignes = Feuille_cible.UsedRange.Rows.Count
With Feuille_cible
For I = 1 To Max_lignes
j = 1
str_temp = .Cells(I, 1).Value
If str_temp <> "" Then
gauche_cellule = 1
For Each c In Col_sizes
If (gauche_cellule + c) < Len(str_temp) Then
.Cells(I, j).NumberFormat = "@"
.Cells(I, j) = Mid(str_temp, gauche_cellule, CLng(c))
j = j + 1
gauche_cellule = gauche_cellule + c + 1
Else
.Cells(I, j).NumberFormat = "@"
.Cells(I, j) = Mid(str_temp, gauche_cellule)
Exit For
End If
Next c
End If
Next I
End With
End Sub |
Partager