IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Selection de plusieurs cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Par défaut Selection de plusieurs cellules
    Bonjour,
    Je sèche littéralement sur un problème assez simple, mais vu mon incompétence en VB, c'est normal....

    Je souhaite sélectionner une plage de cellules discontinues à partir d'une ligne, en ayant fait des tests sur des valeurs de cellules de cette ligne et d'un autre ligne de cellules. J'ai donc créé des objets range et je souhaite utiliser Union pour les ajouter les unes aux autres après le test de la valeur de la cellule

    Le bout de code que j'ai écrit ressemble à cela, et VBA me plante à la ligne 9 (en gras) car je crois comprendre qu'il ne peut faire d'unions qu'entre range qui existent... Est-ce que quelqu'un aurait une idée là-dessus?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub correlation2()
    Dim range1, range2, r1, r2 As Range
    Set r1 = Worksheets("residus").Range("")
    For i = 1 To 12988
        For j = 1 To 20
            If (Worksheets("Ratios").Cells(j + 1, 3).Value = 1) Then
                If (Worksheets("residus").Cells(i + 3, j + 2).Value <> 0) Then
                    Set range1 = Range(Worksheets("residus").Cells(i + 3, j + 2), Worksheets("residus").Cells(i + 3, j + 2))
                    Set range2 = Range(Worksheets("residus").Cells(i + 4, j + 2), Worksheets("residus").Cells(i + 4, j + 2))
                   Set r1 = Union(r1, range1)
                End If
             End If
        Next j
    Next i
    End Sub

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,
    quand tu declare range1,r2 etc la derniere variable est considérée comme un objet range les autres sont considérés comme variant, c peut etre la que ce
    situe le pb
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim range1 as range
    dim range2 as range
    dim r1 as range
    dim r2 as range

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Par défaut
    Je viens d'essayer, mais ça marche toujours pas... Erreur d'exécution 5: Argument ou appel de procédure incorrect... C'est un peu du chinois pour moi.... Voilà le code modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub correlation2()
    Dim range1 As Range
    Dim range2 As Range
    Dim r1 As Range
    Dim r2 As Range
    Dim i As Integer
    Dim k As Integer
    Dim j As Integer
     
    For i = 1 To 12988
        For j = 1 To 20
            If (Worksheets("Ratios").Cells(j + 1, 3).Value = 1) Then
                If (Worksheets("residus").Cells(i + 3, j + 2).Value <> 0) Then
                    Set range1 = Range(Worksheets("residus").Cells(i + 3, j + 2), Worksheets("residus").Cells(i + 3, j + 2))
                    Set range2 = Range(Worksheets("residus").Cells(i + 4, j + 2), Worksheets("residus").Cells(i + 4, j + 2))
                    Set r1 = Union(r1, range1)
                End If
            End If
        Next j
    Next i
    End Sub
    Bon, j'ai aussi pensé à une autre solution, à savoir donner la première valeur à r1 puis continuer le script en rajoutant les autres range... Je n'ai pas encore vérifié (notamment si la première cellule du range n'est pas entrée deux fois) mais je suppose qu'il y a plus élégant pour faire cela, non???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub correlation2()
    Dim range1 As Range
    Dim range2 As Range
    Dim r1 As Range
    Dim r2 As Range
    Dim i As Integer
    Dim k As Integer
    Dim j As Integer
    Dim toto As Double
     
    For i = 1 To 12988
    For k = 1 To 20
           If (Worksheets("Ratios").Cells(k + 1, 3).Value = 1) Then
                If (Worksheets("residus").Cells(i + 3, k + 2).Value <> 0) Then
                    Set r1 = Range(Worksheets("residus").Cells(i + 3, k + 2), Worksheets("residus").Cells(i + 3, k + 2))
                    k = k + 20
                End If
            End If
    Next k
        For j = 1 To 20
            If (Worksheets("Ratios").Cells(j + 1, 3).Value = 1) Then
                If (Worksheets("residus").Cells(i + 3, j + 2).Value <> 0) Then
                    Set range1 = Range(Worksheets("residus").Cells(i + 3, j + 2), Worksheets("residus").Cells(i + 3, j + 2))
                    Set range2 = Range(Worksheets("residus").Cells(i + 4, j + 2), Worksheets("residus").Cells(i + 4, j + 2))
                    Set r1 = Union(r1, range1)
                End If
            End If
        Next j
    toto = Application.WorksheetFunction.Sum(r1)
    Next i
    End Sub

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je reparts de ton code de départ
    Range1 et range2 sont des variants
    Au passage, comme le dit patbou, ce n'est pas comme en c, tu dois préciser le type de donnée pour chaque variable. Dans ta déclaration, seul "r2 As Range" est un range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    dim range1
    dim range2
    dim r1 as range
    dim r2 as range
    For i = 1 To 12988
        For j = 1 To 20
            If (Worksheets("Ratios").Cells(j + 1, 3).Value = 1) Then
                If (Worksheets("residus").Cells(i + 3, j + 2).Value <> 0) Then
                    range1 = Range(Worksheets("residus").Cells(i + 3, j + 2), _
                             Worksheets("residus").Cells(i + 3, j + 2)).address
                    range2 = Range(Worksheets("residus").Cells(i + 4, j + 2), _
                             Worksheets("residus").Cells(i + 4, j + 2)).address
                   Set r1 = Union(r1, range1)
                End If
             End If
        Next j
    Next i
    A tout hasard puisque tu dis que ça ne fonctionne pas en instanciant range1 et 2
    A quoi te sert range2, puisque tu ne l'utilises pas ?
    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Par défaut
    Merci pour ta réponse ouskel'n'or. En fait range ne servait pas encore, mais j'en ai besoin. J'ai réécrit en "initialisant" r1 et d'autres avec une petite boucle, mais franchement je ne trouve pas le résultat très propre.... Mais bon, ça marche... Enfin, pour la fonction somme.... Pour la corrélation, pour l'instant ça ne marche pas.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub correlation2()
    Dim range0 As Range
    Dim range1 As Range
    Dim range2 As Range
    Dim range3 As Range
    Dim range4 As Range
    Rem r0=distances non filtrées et sans distances nulles
    Rem r1=distances filtrées et sans distances nulles
    Rem r2=ratios non filtrés et sans distances nulles
    Rem r3=ratios filtrés et sans distances nulles
    Rem r4=ratios filtrés et sans distances nulles puis randomisés
    Dim r0 As Range
    Dim r1 As Range
    Dim r2 As Range
    Dim r3 As Range
    Dim r4 As Range
    Dim i As Integer
    Dim k As Integer
    Dim j As Integer
    Application.ScreenUpdating = False
    For i = 1 To 1
        For k = 1 To 20
            If (Worksheets("residus").Cells(i + 3, k + 2).Value <> 0) Then
                Set r0 = Range(Worksheets("residus").Cells(i + 3, k + 2), Worksheets("residus").Cells(i + 3, k + 2))
                Set r2 = Range(Worksheets("Ratios").Cells(i + 2, 2), Worksheets("Ratios").Cells(i + 2, 2))
                If (Worksheets("Ratios").Cells(k + 1, 3).Value = 1) Then
                    Set r1 = Range(Worksheets("residus").Cells(i + 3, k + 2), Worksheets("residus").Cells(i + 3, k + 2))
                    Set r3 = Range(Worksheets("Ratios").Cells(k + 1, 2), Worksheets("Ratios").Cells(k + 1, 2))
                    Set r4 = Range(Worksheets("Ratios").Cells(k + 22, 2), Worksheets("Ratios").Cells(k + 22, 2))
                    k = k + 20
                End If
            End If
        Next k
        For j = 1 To 20
            If (Worksheets("residus").Cells(i + 3, j + 2).Value <> 0) Then
                Set range0 = Range(Worksheets("residus").Cells(i + 3, j + 2), Worksheets("residus").Cells(i + 3, j + 2))
                Set range2 = Range(Worksheets("Ratios").Cells(i + 2, 2), Worksheets("Ratios").Cells(i + 2, 2))
                Set r0 = Union(r0, range0)
                Set r2 = Union(r2, range2)
                If (Worksheets("Ratios").Cells(j + 1, 3).Value = 1) Then
                    Set range1 = Range(Worksheets("residus").Cells(i + 3, j + 2), Worksheets("residus").Cells(i + 3, j + 2))
                    Set range3 = Range(Worksheets("Ratios").Cells(j + 1, 2), Worksheets("Ratios").Cells(j + 1, 2))
                    Set range4 = Range(Worksheets("Ratios").Cells(j + 22, 2), Worksheets("Ratios").Cells(j + 22, 2))
                    Set r1 = Union(r1, range1)
                    Set r3 = Union(r3, range3)
                    Set r4 = Union(r4, range4)
                End If
            End If
        Next j
    Worksheets("residus").Cells(i + 3, 31).Value = Application.WorksheetFunction.coefficient.correlation(r0, r2)
    Worksheets("residus").Cells(i + 3, 32).Value = Application.WorksheetFunction.Sum(r2)
    Worksheets("residus").Cells(i + 3, 33).Value = Application.WorksheetFunction.Sum(r2alea)
    Next i
    Application.ScreenUpdating = True
    End Sub

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si tu instanciais aussi tes feuilles, on aurait tout de suite l'impression que c'est plus "propre"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim FRes as worksheet
    Dim FRas as worksheet
    Set FRes = Worksheets("residus")
    Set FRas = Worksheets("Ratios")
    Ex de ce que donnerait ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                Set range1 = Range(FRes.Cells(i + 3, j + 2), FRes.Cells(i + 3, j + 2))
                Set range3 = Range(FRas.Cells(j + 1, 2), FRas.Cells(j + 1, 2))
                Set range4 = Range(FRas.Cells(j + 22, 2), FRas.Cells(j + 22, 2))
    Juste une idée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD17] Table - selection de plusieurs cellules et scrolling
    Par davcaz dans le forum WinDev
    Réponses: 3
    Dernier message: 17/04/2014, 18h52
  2. selection de plusieurs cellules
    Par jijie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/11/2007, 16h55
  3. Comment selection plusieur cellules avec Cells?
    Par darkspoilt dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/07/2007, 13h56
  4. [VBA-E] selection de plusieurs rangés avec des cellules définies
    Par noir_desir dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 24/02/2007, 15h26
  5. [VBA-E]selection de plusieurs cellules
    Par SekanS dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 22/03/2006, 19h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo