Fonction .find, filtres, et copié collé [Résolu]

Signaler
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011
-
tomtom4456
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011
-
Bonjour à vous,
Je suis actuellement entrain de développer une macro assez complexe, j’ai cherché partout sur internet et sur ce forum la solution à mon problème mais malheureusement impossible de trouver LA bonne solution. C’est pourquoi je me permet de poster ici.
Voici les actions que la macro effectue :
Import fichier CSV dans un onglet « temp »
Filtre des données en fonction d’une colonne
Une fois les données filtrées elle doit récupérer les données d’une colonne appelée « Position Fin » le problème est que, selon le fichier CSV importé, la colonne n’est pas toujours ou même endroit..
J’ai essayé avec le méthode .find, je pense que je ne suis pas loin. En fait, maintenant le problème est qu’une fois les données filtrées, la colonne trouvée, je dois faire un copier collé des données de la colonne en questions dans un autre onglet. Le problème est là, les données étant filtrées, le copié collé n’est pas « bon » il prend en compte les cellules masquées par le filtre.
Ci-dessous la macro récalcitrante…
Avez-vous une idée ?

Par avance merci
Sub Macro28()
'
' Macro28 Macro
'
'
Dim F As Variant

F = Application.GetOpenFilename("csv Files (*.csv), *.csv")
If F = False Then Exit Sub
ThisWorkbook.Sheets(4).Select
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & F, Destination _
:=Range("$A$1"))
.Refresh BackgroundQuery:=False
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False

Sheets("temp").Select





Set R = Sheets("temp").Range("A1:Z1").Find("Position debut")

If R Is Nothing Then

MsgBox "la valeur " & "Position debut" & " n'a pas été trouvée"

Exit Sub

End If

Set R2 = Sheets("temp").Range("A1:Z1").Find("Position fin")

If R2 Is Nothing Then

MsgBox "la valeur " & "Position fin" & " n'a pas été trouvée"

Exit Sub

End If


Range(R2.Address & "2:" & R2.Address & "65000").Select
Selection.Copy
Sheets("% de visibilité").Select
Range("B9").Select
ActiveSheet.Paste
Sheets("temp").Select
Range("A1").Select
Application.CutCopyMode = False
Selection.AutoFilter
ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Google"
Range(R.Address & "2:" & R.Address & "65000").Select
Selection.Copy
Sheets("Positions").Select
ActiveSheet.Paste
Sheets("temp").Select
Range(R2.Address & "2:" & R2.Address & "65000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Positions").Select
Range("W7").Select
ActiveSheet.Paste
Sheets("temp").Select
ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Yahoo"
Range(R.Address & "2:" & R.Address & "65000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Positions").Select
Range("D7").Select
ActiveSheet.Paste
Sheets("temp").Select
Range(R2.Address & "2:" & R2.Address & "65000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Positions").Select
Range("X7").Select
ActiveSheet.Paste
Sheets("temp").Select
ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Bing"
Range(R.Address & "2:" & R.Address & "65000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Positions").Select
Range("E7").Select
ActiveSheet.Paste
Sheets("temp").Select
Range(R2.Address & "2:" & R2.Address & "65000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Positions").Select
Range("Y7").Select
ActiveSheet.Paste
Range("C7").Select

End With


End Sub

11 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Il te faut apprendre (surtout si tu es débutant) :
- à bien "cerner" ce que tu écris
- à ne pas hésiter à faire des petis essais

Entraîne-toi un peu.
Je te propose, par exemple, de voir et analyser ce que ferait ceci (et d'en tirer des conclusions)
Private Sub CommandButton1_Click()
  Dim R As Range
  Set R = Sheets("Temp").Range("A1:Z1").Find("Position debut")
  If R Is Nothing Then
    MsgBox "entête inexistante"
    Exit Sub
  End If
  MsgBox R.Address
  MsgBox R.Column
  Dim coucou As Range
  Set coucou = R.EntireColumn.SpecialCells(xlCellTypeVisible)
  MsgBox coucou.Address
End Sub


Garde à l'esprit que ce sont des petits exercices de ce genre qui t'y feront voir très clair et qui te transformeront peu à peu en véritable développeur.
Bonne chance.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour,

Pense s'il te plait à indenter ton code et à le présenter ici en utilisant les balises CODE.

Développer à coups de Select, Activate, Paste etc... n'est pas du tout recommandé.
On se réfère à un Range directement, par exemple :
Range("B1") = Range("H2")
La méthode Copy peut utiliser le paramètre destination

Ceci étant dit :
Ton problème est-t-il uniquement (et tout le reste n'avait alors pas à être exposé ici) :
"Comment copier vers une destination les seules lignes (ou colonnes) non masquées d'une plage ?"


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Désolé pour mes erreurs de présentations, je ferrai attention à l’avenir.
Pour ce qui est du problème il est en parti de savoir comment ne copier que les cellules non masquées d’une plage, mais aussi faire en sorte que cette plage corresponde à la colonne ayant pour en tête « Position début » sachant que cette colonne n’est pas toujours placée au même endroit.
Merci de votre réponse.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Je n'ai pas pour habitude d'accepter (ton "mais aussi") de répondre à deux questions à la fois.
Je choisis donc ici (l'autre étant trop simple) la moins évidente :
Voici comment ne copier vers Feuil3 que les lignes non masquées de la plage A1:A20 :
Dim plage As Range
Set plage = Range("A1:A20").SpecialCells(xlCellTypeVisible)
plage.Copy Destination:=Worksheets("Feuil3").Range("A1")

Tu observeras que je n'y utilise ni Select, ni Activate, ni Paste et que j'y utilise la méthode Copy avec un paramètre destination .
Voilà !
et je te laisse faire le reste (trop simple) , quand-même (déterminer la colonne qui a telle entête) !

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Merci pour cette réponse ! J'avance !
Le seul problème est que la plage sélectionnée l'est en fonction de l'en-tête... T'es sûr que tu veux pas me dire ? Même contre un mars ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Même contre un sac de Mars et 3 sacs de carambars.
La seule récompense que tu puisses m'offrir est un effort de ta part.
Je l'attends. J'attends cet effort et on verra.
Une piste, parmi d'autres : la fonction Find (à voir dans ton aide VBA).


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Bon tempis...
Du côté de la fonction find j'ai ajouté ça :
Set R = Sheets("temp").Range("A1:Z1").Find("Position debut") 

Mais ensuite, impossible de le récupérer dans le range j'ai essayé avec ça :
Range(R2.Address & "2:" & R2.Address & "65000").SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
Je sais tu vas me dire qu'il ne faut pas utiliser cette écriture, mais je débute !
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Bien sûr "R2" a été défini de la même manière que "R"
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Je pense que je tiens quelque chose là.

Dim R As Range
  Set R = Sheets("temp").Range("A1:Z1").Find("Position debut")

If R Is Nothing Then

MsgBox "la valeur " & "Position debut" & " n'a pas été trouvée"

Exit Sub

End If

Set R2 = Sheets("temp").Range("A1:Z1").Find("Position fin")

If R2 Is Nothing Then

MsgBox "la valeur " & "Position fin" & " n'a pas été trouvée"

Exit Sub

End If

Dim S As Range
  Set S = R.EntireColumn.SpecialCells(xlCellTypeVisible)
Dim E As Range
  Set E = R2.EntireColumn.SpecialCells(xlCellTypeVisible)

    Range(E.Address).Copy Destination:=Worksheets("% de visibilité").Range("B9")


Le seul problème c'est que la zone d'arrivée ne peut pas contenir toutes les cellules (vu que c'est "entirecolumn", j'ai essayé d'ajouter .(x1up) mais du coup ça ne copie que l'en-tête...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Te voilà sur la voie
Continue à cogiter et à faire des petits tests ==>> et tu pourras pêcher ton propre poisson plutôt que d'attendre un poisson pêché par d'autres
Allez (ce n'est pas difficile).
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
7
Date d'inscription
mardi 2 août 2011
Statut
Membre
Dernière intervention
3 août 2011

Bon finalement j'ai contourné la difficulté mais j'arrive tout à fait à mon résultat. Je te remercie mille fois !
Pour infos mon code :
Dim R As Range
  Set R = Sheets("temp").Range("A1:Z1").Find("Position debut")

If R Is Nothing Then

MsgBox "la valeur " & "Position debut" & " n'a pas été trouvée"

Exit Sub

End If

Set R2 = Sheets("temp").Range("A1:Z1").Find("Position fin")

If R2 Is Nothing Then

MsgBox "la valeur " & "Position fin" & " n'a pas été trouvée"

Exit Sub

End If

Dim S As Range
  Set S = R.EntireColumn.SpecialCells(xlCellTypeVisible)
Dim E As Range
  Set E = R2.EntireColumn.SpecialCells(xlCellTypeVisible)

    Range(E.Address).Copy Destination:=Worksheets("temp2").Range("A:A")
   Selection.AutoFilter
   ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Google"
    Range(S.Address).Copy Destination:=Worksheets("temp2").Range("B:B")
    Range(E.Address).Copy Destination:=Worksheets("temp2").Range("E:E")
    ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Yahoo"
    Range(S.Address).Copy Destination:=Worksheets("temp2").Range("C:C")
    Range(E.Address).Copy Destination:=Worksheets("temp2").Range("F:F")
    ActiveSheet.Range("$A$1:$K$235").AutoFilter Field:=3, Criteria1:="Bing"
    Range(S.Address).Copy Destination:=Worksheets("temp2").Range("D:D")
    Range(E.Address).Copy Destination:=Worksheets("temp2").Range("G:G")
    Sheets("Positions").Select

Bonne journée !