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 :

[Excel - VBA] Sélection de plage récalcitrante


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Par défaut [Excel - VBA] Sélection de plage récalcitrante
    Bonjour,

    J'ai un petit problème que je n'arrive pas à solutionner.

    D'abord le contexte : J'ai environ 500 classeurs excell. Dans chacun d'eux, la première page ("sheet1") contient des informations dans les cellules A18 à Q45 que je souhaite récupérer dans un seul fichier.

    J'essaie donc de récupérer ces infos avec les trois petites procédures suivantes (je débute en VBA, il y a sûrement moyen d'améliorer).

    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
    Public monFichier As String, cellCour As String, PosCour As Integer
    
    Sub TestCopie()
    '
    ' CopiePlage
    ' 14/05/2008
    '
        Application.DisplayAlerts = False
        monFichier = ActiveWorkbook.Name
        monPath = "F:\Facturen 2007\"
        workfile = Dir(monPath & "*.xls")
        PosCour = 1
        cpt = 5
        fichouv = 0
        Do While workfile <> "" And fichouv <> cpt
            Application.StatusBar = "Traitement de " & workfile
            Workbooks.Open Filename:=monPath & workfile
            CopiePlage
            Descend
            Windows(workfile).Activate
            Windows(workfile).Close savechanges:=False
            fichouv = fichouv + 1
            Windows(monFichier).Activate
            workfile = Dir()
        Loop
    End Sub
    
    Sub CopiePlage()
    '
    ' CopiePlage
    '   14/05/2008
    '
    '
        Dim maFeuille As Worksheet
        Set maFeuille = ThisWorkbook.Worksheets("Sheet1")
        maFeuille.Range(maFeuille.Cells(18, 1), maFeuille.Cells(45, 17)).Select
    '    Range("A18:Q45").select
        Selection.Copy
        Windows(monFichier).Activate
        ActiveSheet.Paste
    End Sub
    
    Sub Descend()
    '
    ' Descend
    ' 14/05/2008 
    '
    
    '
        PosCour = PosCour + 27
        cellCour = "A" & PosCour
        Range(cellCour).Select
    End Sub
    L'instruction qui me pose problème est celle en gras dans le code. D'après le tutorial formation excell - VBA débutant * page 116 * Paragraphe référence implicite * ce devrait être la forme à utiliser pour que cela fonctionne. Mais l'éxécution me renvoit un code d'erreur 1004.

    Quelqu'un pourrait-il éclairer ma lanterne et m'aider à corriger ce soucis, svp ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Par défaut
    Salut,

    Il te faut mettre .address comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Modifie_Annuaire.Range(Cells(Adresse.Row, 1).Address, Cells(Adresse.Row, Numéro_Colonne + 5).Address).Copy
    sinon je vais te donner quelque conseil pour gagner du temps d'exécution (qui doit être gros vu le nombre de fichier)

    pour la recherche dans un dossier (que je trouve plus complet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim Fichier_Trouvés As Variant
    Private Chemin_Dossier As String
    With Application.FileSearch
            .NewSearch
            .LookIn = Chemin_Dossier ' "C:\Mon dossier\"
            .Filename = "*.xls"
            .Execute
                    'FoundFiles.Count pour connaître le nombre de fichier trouvés
            For Each Fichier_Trouvés In .FoundFiles   'Fichier_Trouvés contient que le chemin
                    'traitement sur les fichiers
            Next
    pour ouvrir un fichier sans utiliser activate (tu ouvre tous tes fichiers et tu te sert plus que de la variable "Classeur" et adieu Workbooks("Nom_Fichier.xls"))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Classeur As Workbook
    Set Classeur = Workbooks.Open (Fichier_Trouvés, True) 'déclare le classeur en l'ouvrant en lecture seule
    pour stocker les données d'une plage dans un tableau (gain de temps d'exécution, mais perte des informations sur la cellule (couleur du texte, couleur de fond, bordure, ...))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim Plage As Range 'contient une plage de cellule
    Dim Tableau As Variant
        'création de la plage
        Set Plage = Classeur.Worksheets(1).Range(Cellule1 & ":" & Cellule2)
        Tableau = Plage 'stockage de la plage dans le tableau
    Quand dans la déclaration d'une variable le nom du type de la variable (ex: Range, Workbook) est de couleur noir (integer, String sont en bleu) alors c'est un objet, quand tu n'a plus besoin de l'objet en question tu peut le détruire pour gagner de l'emplacement mémoire en fesant Set Nom_Variable = Nothing

    Voila ++

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Par défaut
    Citation Envoyé par nawake Voir le message
    Salut,

    Il te faut mettre .address comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Modifie_Annuaire.Range(Cells(Adresse.Row, 1).Address, Cells(Adresse.Row, Numéro_Colonne + 5).Address).Copy
    Je ne suis pas certain d'avoir compris. Je vais essayer cela pour voir. Merci pour les conseils, en tous cas. Je vais d'abord tenter de solutionner le problème de la plage, finir le travail à faire puis tester tes améliorations. Un grand merci.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Bonjour

    en simplifiant un peu la copie tu peux aussi utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub CopiePlage()
    '
    ' CopiePlage
    '   14/05/2008
    '
    '
        Dim maFeuille As Worksheet
        Set maFeuille = ThisWorkbook.Worksheets("Sheet1")
        maFeuille.Range(Cells(18, 1), Cells(45, 17)).Copy Workbooks(monFichier).Worksheets("Sheet1").Range(cellCour)
    End Sub
    ce qui évite que Select ne renvoie une erreur si le classeur ou la feuille n'est pas activée.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Par défaut
    Soit je ne suis vraiment pas doué... soit quelque chose m'échappe, j'ai essayé vos solutions, jusqu'à faire un copier coller de la procédure de zyhack, j'ai toujours cette erreur laconique 1004.

  6. #6
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    As-tu réellement une feuille qui se nomme Sheet1 (nom de l'onglet) ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/03/2007, 07h52
  2. [VBA-Excel] - Empêcher sélection de certaines cellules
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/01/2007, 10h04
  3. Réponses: 2
    Dernier message: 27/09/2006, 19h41
  4. [VBA] excel croisé dynamique et plage de données variables
    Par totoche dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/01/2006, 18h14
  5. [VBA-E] [Excel] Protection d'une plage de cellules
    Par fikou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2002, 11h28

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