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
| 'Nom de la macro
Sub ImprotCSV()
'Déclaration des variables
Dim table() As String
Dim lig As Integer
Dim cl As Range
Dim off1 As Integer
Dim off2 As Integer
'Le bout de macro que tu avais implémenté qui ouvre le dossier (ici C:\) et qui te permet de sélectionner le dossier que tu veux
With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = "C:\"
.Show
If .SelectedItems.Count > 0 Then Workbooks.Open (.SelectedItems(1))
End With
'Active le classeur ainsi que la feuille "Fichiers à importer"
With ActiveWorkbook.Worksheets("Fichiers à importer")
'Recherche sur la colonne 1 la dernière cellule non-vide et récupère le numéro de la ligne qu'on place dans "lig"
lig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row
'Remidentionne le tableau "table" à deux dimensions 1 à 5 colonnes et 1 à "lig" lignes
ReDim table(1 To 5, 1 To lig)
'boucle de 0 à lig - 1 (soit lig fois)
For i = 0 To lig - 1
'positionne "cl" sur la case "A1" avec un offset de i ligne(s) et 0 colonne => soit parcours les cellules "A1" puis "A2"... etc... jusqu'à la dernière ligne de la colonne A
Set cl = .Range("A1").Offset(i, 0)
'off1 enregistre la position du premier caractère ";" de la chaine de caractère dans "cl"
off1 = InStr(cl.Value, ";")
'Enregistre dans table(1, i+1) ce qui se trouve à gauche de ce premier ;
table(1, i + 1) = Left(cl.Value, off1 - 1)
'boucle 3 fois pour avoir les chaines de caractères qui se trouve entre les ; et place ces valeurs dans table
For j = 2 To 4
off2 = InStr(off1 + 1, cl.Value, ";")
table(j, i + 1) = Mid(cl.Value, off1 + 1, off2 - off1 - 1)
off1 = off2
Next j
'Dernière étape : place ce qui se trouve à droite du dernier ; dans table
table(5, i + 1) = Right(cl.Value, Len(cl.Value) - off1)
Next i
End With
'ferme le classeur csv préalablement ouvert
ActiveWorkbook.Close
'Avec la feuille "Data"
With Worksheets("Data")
'Boucle de 1 à lig
For i = 1 To lig
'Fait une recherche sur la colonne 1 en fonction de ce qui se trouve dans la première case du tableau, récupère la ligne "-1" => .Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1
'Fait un recherche sur la ligne 1 en fonction de ce qui se trouve dans la deuxième case du tableau, récupère la colonne => .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column
'Finalement re-set "cl" sur ces deux recherches ce qui signifie que l'on se situe bien à l'endroit que l'on préalablement enregistrer dans la tableau "table" pour placer les valeurs par la suite
Set cl = .Cells(.Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column)
'Boucle de 0 à 2
For j = 0 To 2
'place se qui se trouve dans la tableau table au bons endroits (puisque la recherche à été faite au préalable)
cl.Offset(j, 0) = table(3 + j, i)
Next j
Next i
're-set "cl" sur la première case du tableau qu'on a dans "Data" => c-a-d sur la ligne où l'on à A "-1" et sur la colonne où l'on a 1.
Set cl = .Cells(.Columns(1).Find("A", LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(1, LookIn:=xlFormulas, lookat:=xlWhole).Column)
'Boucle de 0 à la dernière cellule non vide sur la ligne 1 (sur laquelle on récupère la colonne) "-1"
For i = 0 To .Rows(1).Find("*", , , , xlByColumns, xlPrevious).Columns - 1
'Boucle de 0 à la dernière cellule non vide sur la colonne 1 (sur laquelle on récupère la ligne) "-1"
For j = 0 To .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row - 1
'Si j+1 n'est pas un multiple de 3 (pour faire simple)
If j + 1 <> 3 * Int((j + 1) / 3) Then
'Si "cl" avec un offset de j ligne(s) et i colonne(s) est égal à "rien"
If cl.Offset(j, i) = "" Then
'Alors on place un "WAIT" dans cette cellule
cl.Offset(j, i) = "WAIT"
End If
End If
Next j
Next i
End With
End Sub
'Fin |
Partager