XL 2013 [Résolu] Question sur : Select Case

Lone-wolf

XLDnaute Barbatruc
Bonsoir à tous :)

Voici la macro que j'ai écrit

Select Case Range("a1").CurrentRegion.Column
Case 3, 5, 7, 9
Target.Column.Copy Sheets("Report").Range("a2")
Case Else
Exit Sub
End Select

Évidemment elle n'est pas correcte, malgré les recherches sur le net je n'ai rien trouvé. Comment on écrit la macro pour qu'elle copie les colonnes choisies?
 

Lone-wolf

XLDnaute Barbatruc
Bonjour jacky :), Re Marcel

@ jacky: si tu as lu mon dernier message je copie les colonnes E-G et I en même temps.

@ Marcel: et bien je te propose de regarder le classeur joint.
Edit: je viens de supprimer les .address, c'est vrai elles sont inutiles.
 
Dernière édition:

PMO2

XLDnaute Accro
Bonjour,
Une autre approche qui utilise un Array dans un Variant
VB:
Sub aa()
Dim derlig As Long
Dim Cols As Variant
Dim A$
Dim i&
'---
Cols = Array(5, 7, 9)
Sheets("Report").Cells.ClearContents
With Feuil1
  derlig = .Cells(Rows.Count, 1).End(xlUp).Row
  For i& = LBound(Cols) To UBound(Cols)
    A$ = A$ & .Range(.Cells(1, Cols(i&)), .Cells(derlig, Cols(i&))).Address
    If i& < UBound(Cols) Then A$ = A$ & ","
  Next i&
.Range(A$).Copy
End With
Sheets("Report").Paste
End Sub
 

Pièces jointes

  • Classeur-Test_pmo.xlsm
    21.5 KB · Affichages: 44

TooFatBoy

XLDnaute Barbatruc
je te propose de regarder le classeur joint.
Ne crois-tu pas que cette proposition est en opposition avec le fait que je te pose la question ?...
Un simple "oui" ou "non" m'aurait parfaitement convenu. Mais ce n'est pas grave.

@+


PS : j'ai cru comprendre que tu voulais absolument utiliser un SELECT CASE pour gagner du temps (par rapport à un IF), alors pourquoi mettre ton "Set tb3" dans ta boucle FOR qui te fait perdre du temps pour rien avec ces 8 assignations inutiles ???
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Si on connaît les colonnes à copier, alors on les copie (je ne vois pas ce qu'un Select ou des IF imbriqués peuvent apporter si ce n'est une durée inutile). Je l'aurai codé comme cela :
VB:
Sub test()
Dim derlig&, tabloCol, tablo As Range, n&

  Application.ScreenUpdating = False
  Feuil2.Range("a2:c80000").ClearContents
  With Feuil1
    derlig = .Cells(Rows.Count, 1).End(xlUp).Row
    Set tablo = .Range(.Cells(2, "a"), .Cells(derlig, "i"))
    For Each tabloCol In Array(5, 7, 9)
      tablo.Columns(tabloCol).Copy Feuil2.Range("a2").Offset(, n)
      n = n + 1
    Next tabloCol
  End With
End Sub
 

Pièces jointes

  • Lone-wolf- ClasseurTest- v1.xlsm
    22.4 KB · Affichages: 27

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Mais si tu tiens à un Select:
VB:
Sub test()
Dim derlig&, tablo As Range, i&, n&

  Application.ScreenUpdating = False
  Feuil2.Range("a2:c80000").ClearContents
  With Feuil1
    derlig = .Cells(Rows.Count, 1).End(xlUp).Row
    Set tablo = .Range(.Cells(2, "a"), .Cells(derlig, "i"))
    For i = 1 To tablo.Columns.Count
      Select Case i
      Case 5, 7, 9
        tablo.Columns(i).Copy Feuil2.Range("a2").Offset(, n)
        n = n + 1
      End Select
    Next i
  End With
End Sub
 

Pièces jointes

  • Lone-wolf- Avec Select- v1.xlsm
    23.2 KB · Affichages: 22

Lone-wolf

XLDnaute Barbatruc
Bonsoir tout le monde :)

Ne répondez pas tous en même temps, j'ai du mal à suivre :oops: :D

@Marcel32: et bien, il me semble que c'est toi qui a posé les questions, ou je me trompe.
T'es sûr que tu as besoin du ".Address" pour le deuxième ".Cells" dans tes trois "Set" ?
Et ça ne pose pas de problèmes les ".Set" avec des Range dont les colonnes sont négatives ?
Comme tu était sceptique, je t'ai proposé de regardé le classeur qui est plus parlant, si j'ose dire.
Pour la boucle, oui elle doit être utilisée, puisque il y a la condition Select Case Col. Mettre dans ce cas Range("e2:e & derlig), rend obsolète la condition et le test Select Case.

@jacky: loin de moi à l'idée de vouloir utiliser absolument select case, dans un apprentissage il faut tout essaier pour comprendre qu'est-ce qui est utile ou pas, non?.

@pmo: merci pour la proposition, mais le test se base sur Select Case.
 

Lone-wolf

XLDnaute Barbatruc
Re mapomme

Je viens de le dire aussi à jacky, ce n'est pas du tout dans mes intentions, c'est juste un test. En plus je fume Marlboro depuis 30 ans, ce n'est pas maintenant que je vais me mettre aux Select. ;) :D

En tous cas, chapeau bas pour ton travail que je viens de tester. ;)
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
il me semble que c'est toi qui a posé les questions, ou je me trompe.
Non, tu ne te trompes pas.
Je dis simplement que ton classeur était disponible, donc si j'ai posé la question c'était bien évidemment pour éviter d'avoir à le télécharger.
Ceci dit, il est vrai que tu n'es pas obligé de me dire si ça marche ou pas et que tu peux tout à fait me laisser choisir de DL le fichier pour avoir la réponse ou de ne pas DL le fichier et rester sans réponse. C'est, fort heureusement, ton droit.


Pour la boucle, oui elle doit être utilisée, puisque il y a la condition Select Case Col. Mettre dans ce cas Range("e2:e & derlig), rend obsolète la condition et le test Select Case.
Je pense que tu devrais relire calmement et à tête reposée ce que j'avais écrit car il n'y était absolument pas question de supprimer la boucle FOR. ;)

Bon, je suis sympa, je t'aide un peu à comprendre ce que j'avais écrit en le redisant mais différemment :
le "Set tb3" est inutile à l'intérieur de la boucle et te fait perdre du temps (que tu cherches pourtant à gagner...) en affectant 8 fois de trop la même valeur à la même variable.


Sur ce, bonne soirée.
 
Dernière édition:

Si...

XLDnaute Barbatruc
Bonjour
Ne répondez pas tous en même temps, j'ai du mal à suivre :oops: :D
loin de moi à l'idée de vouloir utiliser absolument select case, dans un apprentissage il faut tout essaier pour comprendre qu'est-ce qui est utile ou pas, non?.
.

Avec un tableau, 4 exemples
- sans boucle
VB:
Sub Copier()
  Application.ScreenUpdating = 0: [A2:C80000] = ""
  [Tb].Columns(5).Copy [a80000].End(xlUp)(2)
  [Tb].Columns(7).Copy [B80000].End(xlUp)(2)
  [Tb].Columns(9).Copy [C80000].End(xlUp)(2)
End Sub
- avec 2 boucles et Case
VB:
Sub Copier_Case()
  Application.ScreenUpdating = 0: [A2:C80000] = ""
  For i = 1 To [Tb].Columns.Count Step 2
      Select Case i
          Case 5, 7, 9: [Tb].Columns(i).Copy Cells(2, Int(i / 3)).End(xlUp)(2)
      End Select
  Next
End Sub
- avec 1 boucle et If
VB:
Sub Copier_If()
  Application.ScreenUpdating = 0: [A2:C80000] = ""
  For i = 1 To [Tb].Columns.Count
      If i = 5 Or i = 7 Or i = 9 Then [Tb].Columns(i).Copy Cells(2, Int(i / 3)).End(xlUp)(2)
  Next
End Sub
- avec 1 boucle et Array
VB:
Sub Copier_Array()
  Application.ScreenUpdating = 0: [A2:C80000] = ""
  For i = 0 To 2
      [Tb].Columns(Array(5, 7, 9)(i)).Copy Cells(2, i + 1).End(xlUp)(2)
  Next
End Sub
A noter une différence notable entre Case et For : dans le premier choix on sort de la boucle Select dès que le cas est trouvé alors que dans le second la boucle teste tous les cas prévus !
 

Pièces jointes

  • Copie de Colonnes.xlsm
    25.9 KB · Affichages: 34

Lone-wolf

XLDnaute Barbatruc
Bonjour Si... :), le Forum :)

Merci pour tous ces exemples. Et compris qu'il faut fumer SELECT avec modération :D, mais comme j'en fume pas... :cool:

Dans le 1er exemple avec Select, tu parle de 2 boucles, mais moi j'en vois qu'une. Est-ce que Select Case 5, 7, 9, est la 2ème??? :rolleyes:

EDIT: bonjour mapomme :)
 

Discussions similaires

Statistiques des forums

Discussions
312 080
Messages
2 085 144
Membres
102 793
dernier inscrit
volfy