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 :

Débogage & Suppression objet range [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut Débogage & Suppression objet range
    Bonjour à tous,

    N'étant pas un pro de VBA, j'ai besoin d'un coup de main pour déboguer ma macro.

    Mon problème est le suivant:

    J'ai 2 classeurs Excel, un que l'on peut qualifier de classeur source qui contient une seule feuille avec des données à extraire et un autre que l'on peut qualifier de classeur destination contenant plusieurs feuilles dans lesquelles il faut copier certaines cellules (non contiguës) de la feuille du classeur source sous certaines conditions (portant sur les valeurs de cellules).

    ...j'espère n'avoir perdu personne pour le moment

    J'ai donc écrit la macro suivante dans le classeur destination qui ouvre le classeur source et va chercher les données à copier:

    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
     
     
    Option Explicit
     
    Public Sub importData()
     
    Dim dataCollector As Integer, iteration As Integer, i As Long
    dataCollector = 1
     
    Dim dataWorkbook As Workbook
    Set dataWorkbook = Application.Workbooks.Open("fichier_source.xls")
    'En vrai ce n'est pas le "fichier_source.xls" mais le nom de mon fichier avec son chemin absolu...
     
    Dim inputSheet As Worksheet, outputSheet As Worksheet
    Set inputSheet = dataWorkbook.Worksheets(1)
     
    Dim sourceRange As Range
    inputSheet.Cells(2, 6).Activate
    Set sourceRange = Range(ActiveCell, ActiveCell.End(xlDown))
     
    For dataCollector = 1 To 6 Step 1
     
        Dim myRange As Range
        Set outputSheet = Workbooks("Analyse temps de parcours.xls").Worksheets(dataCollector + 1)
     
        For iteration = 1 To 6 Step 1
     
            For i = sourceRange.End(xlUp).Row To sourceRange.End(xlDown).Row Step 1
     
                If Cells(i, 1).Value = iteration Then
                    Set myRange = Application.Union(myRange, Range(Cells(i, 6)))
                End If
     
            Next i
     
            myRange.Copy (outputSheet.Cells(6, iteration + 1))
     
     
        Next iteration
     
    Next dataCollector
     
    End Sub
    A la compilation je me prends un "Erreur d'exécution '1004': Erreur définie par l'application ou l'objet" et je ne sais pas d'où ça vient.

    J'ai l'intuition que je fais de la m**** en manipulant des objets (au hasard du type range ) mais je ne comprends pas pourquoi.
    Peut être le fait de re-déclarer à chaque passage dans ma boucle "dataCollector" mon range "myRange", ce qui m'amène donc à la question suivante:

    Comment fait-on pour supprimer le contenu de l'objet range ou l'objet lui-même (du genre Set myRange = NULL ou DeleteRange(myRange))?

    PS:

    Etant que la liste de cellules à balayer est plutôt longue (2812 dans mon cas précis), il serait plus judicieux de créer un tableau de 6 objets de type range et de ne balayer qu'une fois la liste plutôt en remplissant tous les ranges avec les bonnes cellules plutôt que de balayer 6 fois la liste comme je fais ici...mais ça dépasse mes compétence de "codeur" VBA débutant. Si quelqu'un se sent de m'expliquer comment faire, je suis preneur!


    Merci d'avance pour le coup de main.

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    J'espère ne pas dire de bêtises, mais il me semble qu'en VBA les variables sont créés à la compilation du code. Il est donc de coutume de les déclarer en début de procédure.
    Je te déconseille donc de faire la déclaration de la variable Myrange dans une boucle.

    Pour vider une variable (je ne crois pas que ce soit utile dans ton cas)

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir à tous
    J'ajoute qu'il faut adresser convenablement les ranges

    Pour ton cas avec plusieurs classeurs, pour désigner une plage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dataWorkbook.worksheets(X).Range(Y)
    'Ou 
    ThisWorkbook.worksheets(A).Range(B)
    Un Range sans parents dans un code qui fait intervenir plusieurs feuilles, voir plusieurs classeurs est de la pure peste à erreurs.

    Encore une ambiguïté ici (En plus de la remarque sur les ranges)
    Au départ myRange=nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set myRange = Application.Union(myRange, Range(Cells(i, 6)))
    Union de rien avec quelque chose c'est une erreur garantie
    Et Range(Cells(x,y)) c'est plutôt simplement Cells(x,y)

    Restructure ton code et peut être, pour ton cas, repartie directement les données désirées entre tes feuilles.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Je réponds avec un peu de retard mais déjà merci à tous les deux pour vos conseils.

    En ce qui concerne l'impossibilité de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Union(Nothing, myRange)
    ça me chagrine par contre un peu plus...

    Y a-t-il un autre moyen de partir d'une collection de "ranges" vide (qui doit elle-même être un "range" si je ne m'abuse) et de la remplir progressivement (ce que j'essaie de faire dans ma boucle)?

    Sinon ne vous cassez pas trop la tête, j'ai contourné le problème (c'est donc juste par curiosité).

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Sheets("Feuil1")
        For i = 1 To 100
            If .Cells(i, 1) = Iteration Then
                If MyRange Is Nothing Then
                    Set MyRange = .Cells(i, 6)
                Else
                    Set MyRange = Union(MyRange, .Cells(i, 6))
                End If
            End If
        Next i
    End With

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Effectivement, j'ai honte de ne pas y avoir pensé. Merci encore!

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

Discussions similaires

  1. [VBA-E]Pb avec objet Range
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2006, 16h02
  2. [VBA-E] Accès à l'objet Range (oui puis non ?)
    Par gapgap dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/05/2006, 20h00
  3. L'objet Range - automation excel
    Par Celia1303 dans le forum Access
    Réponses: 6
    Dernier message: 21/12/2005, 17h03
  4. VBA Excel Débutant : Graphique et objet Range
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/11/2005, 18h34

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