Bonjour à tous,
Je souhaite importer un fichier .csv dans une feuille d'un classeur excel.
Mon problème est que je souhaite seulement importer les colonnes A à N et le nombre de ligne peut varier de 2 à 300.
J'ai créer une macro (voir ci-dessous) mais j'ai un bug. au niveau de
With wbSource 'classeur csv
Dl = wbSource.Worksheets(wbSource.Name).Range("A" & .Rows.Count).End(xlUp).Row
Quelqu'un peut m'aider ?
Sub ImportationCSV()
On Error GoTo GestionErreur
Application.DisplayAlerts = False
Application.Cursor = xlWait
Dim wbSource As Workbook
Dim wsBD As Worksheet
Dim strFileExtraction As Variant
' Choix du fichier par l'utilisateur
ChDir "C:\Documents and Settings\O.muths.CLINIQUE-STFRAN.000\bureau"
strFileExtraction = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv", , _
"Sélectionnez le fichier à ouvrir")
If strFileExtraction = False Then
GoTo FinTraitement
End If
If strFileExtraction <> False Then
Set wbSource = Workbooks.Open(strFileExtraction, , , 4, , , , , , , , , , True)
Dim Nb As Long
Dim x As Long, y As Long
'tbGeneral reprendra toutes les données dans les colonnes concernées
Dim TbGeneral, TbCopié(), Dl As Long, TbFinal()
With wbSource 'classeur csv
Dl = wbSource.Worksheets(wbSource.Name).Range("A" & .Rows.Count).End(xlUp).Row 'dernière cellule renseignée en col A de la feuille nommé comme le classeur csv
TbGeneral = wbSource.Worksheets(wbSource.Name).Range("A2:N" & Dl) 'plage à traiter
Nb = 0 ' je mets ou remet, par sureté cette variable à 0
For x = 1 To UBound(TbGeneral, 1) 'une boucle qui parcoure tout TbGeneral,
For y = 1 To 14 'une boucle intégrée qui parcoure les colonnes
If (TbGeneral(x, y)) <> "" Then 'donc 1ere écriture vérifiée
'ci-dessous, s'il y une valeur
Nb = Nb + 1 'on ajoute 1 à la variable Nb si la condition est remplie
ReDim Preserve TbCopié(1 To 14, 1 To Nb) 'on redimensionne le tableau TbCopié dans sa deuxième dimension (impossible dans la 1ère quand 2 dimensions)
TbCopié(1, Nb) = TbGeneral(x, 1)
TbCopié(2, Nb) = TbGeneral(x, 2)
TbCopié(3, Nb) = TbGeneral(x, 3)
TbCopié(4, Nb) = TbGeneral(x, 4)
TbCopié(5, Nb) = TbGeneral(x, 5)
TbCopié(6, Nb) = TbGeneral(x, 6)
TbCopié(7, Nb) = TbGeneral(x, 7)
TbCopié(8, Nb) = TbGeneral(x, 8)
TbCopié(9, Nb) = TbGeneral(x, 9)
TbCopié(10, Nb) = TbGeneral(x, 10)
TbCopié(11, Nb) = TbGeneral(x, 11)
TbCopié(12, Nb) = TbGeneral(x, 12)
TbCopié(13, Nb) = TbGeneral(x, 13)
TbCopié(14, Nb) = TbGeneral(x, 14)
End If
Next y
Next x
End With
'une fois les données copiées dans TbCopié
ReDim TbFinal(1 To UBound(TbCopié, 2), 1 To 14) 'on dimensionne TbFinal (on peut au départ sur la 1ere dimension)
For x = 1 To UBound(TbFinal, 1) 'une boucle qui reprend les données de TbCopié
TbFinal(x, 1) = TbCopié(1, x)
TbFinal(x, 2) = TbCopié(2, x)
TbFinal(x, 3) = TbCopié(3, x)
TbFinal(x, 4) = TbCopié(4, x)
TbFinal(x, 5) = TbCopié(5, x)
TbFinal(x, 6) = TbCopié(6, x)
TbFinal(x, 7) = TbCopié(7, x)
TbFinal(x, 8) = TbCopié(8, x)
TbFinal(x, 9) = TbCopié(9, x)
TbFinal(x, 10) = TbCopié(10, x)
TbFinal(x, 11) = TbCopié(11, x)
TbFinal(x, 12) = TbCopié(12, x)
TbFinal(x, 13) = TbCopié(13, x)
TbFinal(x, 14) = TbCopié(14, x)
Next x
ActiveSheet.Range("B4:O4").Resize(UBound(TbFinal, 1)) = TbFinal 'je rends le résultat à la plage en feuil "01"
'Transfer the array to the worksheet starting at cell A2
'ActiveSheet.Range("B4").Resize(297, 14).Value = dataarray
'wsImport.Columns.AutoFit
wbSource.Close
End If
GoTo FinTraitement
GestionErreur:
MsgBox Err.Description, vbCritical
FinTraitement:
Application.DisplayAlerts = True
Application.Cursor = xlDefault
End Sub
Partager