Importer fichier CSV tout en le manipulant avec VBA

Bonjour à tous,

Je voudrais automatiser un processus très répétitif et qui peut causer des erreurs assez important,

donc je pense qu'une macro VBA pourrait être la solution mais je n'y comprend pas grand chose en VBA et suis même novice de chez novice.

En pièce jointe un exemple de ce que je souhaiterais obtenir, avec une explication qui je l'espère sera clair.

Merci énormément pour votre aide.

34database.xlsm (10.96 Ko)

Salut FabVBA,

Quelque chose comme ça ?

Un double-clic sur la feuille démarre la macro.

Le code est dans le module VBA de la feuille traitée.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab
'
Cancel = True
'
tTab = Range("Z1:AAA" & Range("I" & Rows.Count).End(xlUp).Row).Value
Range("I:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlUp
Range("Z1").Resize(UBound(tTab, 1), UBound(tTab, 2)).Value = tTab
'
End Sub

A+

14databasefabvba.xlsm (16.38 Ko)

Bonsoir et merci de m'aider,

Est-ce qu'il faut que je créer une macro ou ça doit se faire ?

Car lorsque j'ouvre excel, il me demande d'activer les macros, je répond oui mais sur quelle feuille doit-elle agir ?

Merci d'avance pour votre aide

Salut FabVBA,

Quelque chose comme ça ?

Un double-clic sur la feuille démarre la macro.

Le code est dans le module VBA de la feuille traitée.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab
'
Cancel = True
'
tTab = Range("Z1:AAA" & Range("I" & Rows.Count).End(xlUp).Row).Value
Range("I:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlUp
Range("Z1").Resize(UBound(tTab, 1), UBound(tTab, 2)).Value = tTab
'
End Sub

A+

Salut FabVBA,

double-clic sur la feuille 'DataBase'... La macro est déjà en place, évidemment!

Si la macro te donne satisfaction, tu la copies telle quelle dans ton "vrai" fichier dans le module VBA de la feuille .CVS.

Difficile de dire mieux sans autre fichier à ma disposition...

A+

Ça marche du feu de dieu,

le seule icque c'est que la colonne Z j'ai 4 adresses html donc il faut que la colonne A est autant de résultat que la colonne Z.

Je sais pas si je m'exprime clairement ?

Colonne Z contient 4 ligne de html

donc

Colonne A contient 4 fois le nombre

Franchement même en me relisant je sais pas si c'est clair ce que je veux dire

En tout cas c'est vraiment cool de ta part pour l'aide que tu apporte.

Salut FabVBA,

double-clic sur la feuille 'DataBase'... La macro est déjà en place, évidemment!

Si la macro te donne satisfaction, tu la copies telle quelle dans ton "vrai" fichier dans le module VBA de la feuille .CVS.

Difficile de dire mieux sans autre fichier à ma disposition...

A+

J'ai rajouter cette image si ça peu aider.

sans titre

Salut FabVBA,

oui, je comprends mais j'ai si peu de lignes avec un seul Handle [A]...

A chaque Handle ses adresses en [Z] ?

Y a-t-il d'autres règles ?

Un fichier plus conséquent avec une feuille de résultats et, si possible, les éventuelles exceptions expliquées serait un plus!

A+

Le fichier est très important donc j'ai essayer de prendre plus de ligne.

Le voici en pièce jointe

Je sais pas si cela va vous aider ?

Dans la colonne A (handle = référence), le nombre de handle doit-être identique au nombre d'url pour la même référence.

Tout en remontant les colonnes A8 à Y8 de façon à ce que les valeurs de la colonne "I" se suivent.

En tout cas : chapeau tu es un roi du VBA.

Merci de votre aide précieuse

6database2.xlsm (13.53 Ko)

Pour le Handle 41735, par ex., il y a 3 Handle pour 2 adresses mail en [Z] : qui doit se plier à la règle ?

  • une adresse pour chaque Handle et un Handle pour chaque adresse ?
  • un Handle pour chaque adresse et retirer un Handle si en trop par rapport aux adresses ?

Le résultat souhaité n'est pas illustré!

Ça ne doit pas être compliqué à mettre au point mais il y a des choses, qui doivent te sembler des détails, à savoir!

Euh... très loin d'être le roi... Tu rencontreras ici des balaises autrement fortiches !

A+

Si il y a plus de "handle (A)" que de "URL (Z)", le nombre de "handle (A)" doit être égale au nombre de "Option1 Value (I)".

Si il y a plus de "URL (Z)" que de "Option1 Value (I)" alors le nombre de "handle (A) doit être égal au nombre de "URL (Z)".

J'ai mis dans le fichier joint 2 "handle (A)" pour que vous puissiez voir la différence.

1er "handle (A)", plus de "Option1 Value (I)" que de "URL (Z)".

2ème "handle (A)", plus de "URL (Z)" que de "Option1 Value (I)".

En espérant aider ?

Pour le Handle 41735, par ex., il y a 3 Handle pour 2 adresses mail en [Z] : qui doit se plier à la règle ?

  • une adresse pour chaque Handle et un Handle pour chaque adresse ?
  • un Handle pour chaque adresse et retirer un Handle si en trop par rapport aux adresses ?

Le résultat souhaité n'est pas illustré!

Ça ne doit pas être compliqué à mettre au point mais il y a des choses, qui doivent te sembler des détails, à savoir!

Euh... très loin d'être le roi... Tu rencontreras ici des balaises autrement fortiches !

A+

3database.zip (9.68 Ko)
4database.xltm (16.58 Ko)

Salut FabVBA,

comme ceci ?

Toujours un double-clic pour démarrer la macro qui crée une feuille 'Extract' pour l'affichage des résultats.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iRow1%, iRow2%, iRowMAX%, iRowB%, iRowT%, lgNum#, sCol$
'
Application.ScreenUpdating = False
If Sheets(Sheets.Count).Name <> "Extract" Then Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Extract"
'
iRowB = Range("B" & Rows.Count).End(xlUp).Row
sCol = Split(Columns(Cells(1, Columns.Count).End(xlToLeft).Column).Address(ColumnAbsolute:=False), ":")(1)
iRowMAX = WorksheetFunction.Max(Range("A" & Rows.Count).End(xlUp).Row, Range("I" & Rows.Count).End(xlUp).Row, Range("Z" & Rows.Count).End(xlUp).Row)
Cancel = True
'
With Worksheets("Extract")
    .Cells.Delete
    .Range("A1:" & sCol & 1).Value = Range("A1:" & sCol & 1).Value
    Do
        iRow1 = IIf(iRow1 = 0, 2, iRow2 + 1)
        iRow2 = IIf(iRow1 = iRowB, iRowMAX, Range("B" & iRow1).End(xlDown).Row - 1)
        iRowT = IIf(iRow1 = 2, 2, WorksheetFunction.Max(.Range("A" & Rows.Count).End(xlUp).Row, .Range("I" & Rows.Count).End(xlUp).Row, .Range("Z" & Rows.Count).End(xlUp).Row) + 3)
        .Range("A" & iRowT & ":" & sCol & iRowT + (iRow2 - iRow1)).Value = Range("A" & iRow1 & ":" & sCol & iRow2).Value
        .Range("A" & iRowT & ":Y" & iRowT + (iRow2 - iRow1)).SpecialCells(xlCellTypeBlanks).Delete shift:=xlUp
        lgNum = CLng(.Range("A" & iRowT).Value)
        .Range("A" & iRowT & ":A" & iRowT + (iRow2 - iRow1)).Value = ""
        .Range("A" & iRowT & ":A" & WorksheetFunction.Max(.Range("I" & Rows.Count).End(xlUp).Row, .Range("Z" & Rows.Count).End(xlUp).Row)).Value = lgNum
    Loop Until iRow1 = iRowB
    .Columns.AutoFit
    .Activate
End With
'
Application.ScreenUpdating = True
'
End Sub

A+

8database2.xlsm (27.30 Ko)

Bonjour,

Trop trop fort du est un génie.

Çà marche nickel merci beaucoup de ton aide précieuse.

Rechercher des sujets similaires à "importer fichier csv tout manipulant vba"