VBA Excel: sélection et copie de colonnes

Fermé
TheMoon - 14 mai 2009 à 19:46
 TheMoon - 16 mai 2009 à 19:51
Bonjour,

Je suis débutant en VBA Excel, et j'ai un problème avec une macro devant tester la deuxième ligne de chaque colonne sur une feuille, et la coller, ainsi que la colonne suivante dans une autre feuille suivant la valeur lue.

J'ai essayé le code suivant pour sélectionner mes colonnes (je suis désolé si mon code manque de propreté):

If Cells(2, i).Value = 178.6 Then Range(ActiveCell, ActiveCell.End(xlDown)).Select , _
li = Selection.Rows.Count, Range(Cells(1, i), Cells(li, i + 1)).Select, _
Selection.Copy

Il s'avère qu'au moment de l'exécution, j'obtiens une erreur de compilation : "Nombre d'arguments incorrects ou affectation de propriété incorrecte" concernant le premier "Select".

Merci d'avance,

PS: J'avais déjà récupéré ce morceau de code sur ce site au cours de mes recherches, il est possible que je l'ai mal compris et mal adapté de ce fait.

TheMoon

2 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 645
16 mai 2009 à 01:23
Bonjour,

Déja au niveau de la syntaxe il faut écrire ceci :

If Cells(2, i).Value = 178.6 Then
    Range(ActiveCell, ActiveCell.End(xlDown)).Select
    li = Selection.Rows.Count
    Range(Cells(1, i), Cells(li, i + 1)).Select
    Selection.Copy
End If


Ensuite il manque du code avant et aprés pour que l'on puisse juger si cela va donner le bon résultat. En particulier je suppose qu'il y a une boucle sur toutes les colonnes i et un paste ensuite. Mais l'utilisation de ActiveCell me parait curieux. Il me semble qu'il faudrait que la cellule active soit Cells(1,i) en amont de ce code.

A+
0
Bonjour, et merci pour ton aide

Le code a quelque peu évolué depuis ce post, c'est maintenant:

Sub test()
Dim i As Integer, j As Integer, Numcol As Integer, Numcol2 As Integer
For i = 1 To 150
Sheets("VIS-NIR").Select
j = i + 1
Range("A1").Select
Application.CutCopyMode = False
If Cells(2, i).Value = "178,6" Then
Columns(i, j).Select
Selection.Copy
Sheets("VIS").Select
Range("A1").Select
ActiveSheet.Paste
End If
If Cells(2, i).Value = "646,42" Then
Columns(i, j).Select
Selection.Copy
Sheets("NIR").Select
Range("A1").Select
ActiveSheet.Paste
End If
Next i
End Sub

J'y ajouterais une procédure permettant de ne pas copier constamment chaque nouvelle série de valeur sur les anciennes, mais ça ne me pose pas de problème, je l'ai déjà fait.

Mon soucis est donc que je voudrais copier deux colonnes dans un onglet différent en fonction de la valeur de la deuxième ligne de la première colonne. Le problème, c'est que là, j'obtiens une erreur d'exectution 1004 : "Erreur définie par l'application ou par l'objet". Le debugger me surligne la ligne de sélection des colonnes. J'ai essayé pas mal de choses, dont des trucs vraiment pas beaux à voir (et forcément totalement ineficaces), mais je n'arrive pas à voir où est le soucis.

Cordialement,
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 645
16 mai 2009 à 19:46
Bonjour,

Oui à priori c'est la syntaxe Columns(i, j).Select qui n'est pas correcte.
Il faut essayer cette syntaxe : Range(Columns(i), Columns(j)).Select

Je confirme que tu écrases chaque fois les valeurs.

Regardes un exemple de code qui fonctionne :

Sub test()
Dim i As Integer, j As Integer, Numcol As Integer, Numcol2 As Integer
Dim k As Integer, l As Integer
k = 1
l = 1
For i = 1 To 150
    Sheets("VIS-NIR").Select
    j = i + 1
    Range("A1").Select
    Application.CutCopyMode = False
    If Cells(2, i).Value = "178,6" Then
        Range(Columns(i), Columns(j)).Select
        Selection.Copy
        Sheets("VIS").Select
        Cells(1, k).Select
        ActiveSheet.Paste
        k = k + 2
    End If
    If Cells(2, i).Value = "646,42" Then
        Range(Columns(i), Columns(j)).Select
        Selection.Copy
        Sheets("NIR").Select
        Cells(1, l).Select
        ActiveSheet.Paste
        l = l + 2
    End If
Next i
End Sub

A+
0
Merci beaucoup, ça marche très bien, je vais regarder cette syntaxe pour ne pas refaire la même erreur.
0