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 :

Lire, copier et coller une plage d'un autre classeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut Lire, copier et coller une plage d'un autre classeur
    Bonjour à tous,

    J'ai besoin de votre aide concernant l’intégration dans un classeur récapitulatif (patron) d'une plage nommée qui se trouve dans un autre classeur protégé et fermé (vendeur).
    J'ai essayé ceci mais cela ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub LireFichierVendeur()
     
        Dim Fichiersource As String
        Dim Cheminsource As String
        Dim Formule As String
            Dim x As Integer
                Cheminsource = "\\serveur\DOSSIER PARTAGE\GESTIONCOMMERCIAL"
                Fichiersource = "Vendeur.xlsm"
                Cheminsource.Fichiersource.Range("codep") = x
            With Worksheets("Patron").Feuil1
                Range("A5") = x
            End With
    End Sub
    En même temps je me dis que c'est un peu léger mais je vois pas vraiment où ça coince.
    Je vous remercie par avance pour votre aide précieuse.
    Bonne Journée à tous
    Cordialement

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonjour
    pour copier depuis un dossier fermé je fais avec :
    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
    Sub importProdVte()
    Dim wkA As Workbook, wkB As Workbook
    Dim chemin As String, fichier As String
    Dim j As Long
    Application.ScreenUpdating = False
    Set wkA = ThisWorkbook
    chemin = "Z:\TRAVAUX COMPTABLES BNA\Controle de Gestion\"
    fichier = "RAPPORT JOURNALIER.xlsx"
    Workbooks.Open chemin & fichier
    Set wkB = ActiveWorkbook
     j = wkB.Sheets("Alf3").Range("A" & Rows.Count).End(xlUp).Row
    wkA.Sheets("Feuil1").Range("C1:G" & j).Value = wkB.Sheets("Alf3").Range("D1:H" & j).Value
    wkA.Sheets("Feuil1").Range("A1:B" & j).Value = wkB.Sheets("Alf3").Range("L1:M" & j).Value
     
    wkB.Close True
     Application.ScreenUpdating = True
    End Sub

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Vatreni Voir le message
    J'ai essayé ceci mais cela ne fonctionne pas.
    Se contenter de dire "ça ne fonctionne pas", ce n'est pas très éclairant pour se faire une idée du problème.
    Quand un code bug, il faut au moins signaler le message d'erreur et la ligne de code désignée par le débuggage.

    En même temps je me dis que c'est un peu léger mais je vois pas vraiment où ça coince.
    Perso, au contraire, je me dis que je ne vois pas pourquoi ça pourrait fonctionner.

    Fichiersource et Cheminsource sont des String, c'est-à-dire juste des chaines de caractères.
    Ce ne sont pas des objets auxquels on pourrait assigner des propriétés ou des méthodes.
    Donc ta ligne Cheminsource.Fichiersource.Range("codep") = x n'a aucune chance de fonctionner.

    De plus, on ne peut pas assigner une valeur à un classeur sans l'ouvrir (à moins de le traiter comme une base de donnée, ce qui n'est qu'une méthode pour l'ouvrir différemment).

    Tu utilises la variable "x" mais tu ne lui assignes aucune valeur.
    A moins que tu considères que Cheminsource.Fichiersource.Range("codep") = x soit là pour donner une valeur à "x". Dans ce cas, la ligne est écrite à l'envers.

    De plus, si ce sont les valeurs d'une "plage" que tu veux copier, une simple variable Integer ne te suffira pas.
    Une variable Integer ne peut contenir qu'une seule valeur, pas toutes les valeurs d'une plage.

    Ton With est inutile puisqu'il n'est supposé s'appliquer qu'à une seule propriété.
    D'ailleurs, il ne s'y applique pas puisque tu n'as pas mis de "." devant cette propriété.

    Bref, je te conseille de passer un peu de temps à étudier les bases du VBA avant de te lancer dans du codage.
    http://bidou.developpez.com/article/VBA/

    d'une plage nommée qui se trouve dans un autre classeur protégé et fermé (vendeur).
    On ne peut pas lire ou écrire dans un classeur fermé.
    Le plus simple est de demander à VBA de l'ouvrir avec une méthode Workbooks.Open.

    Comme je le disais plus haut, il est possible aussi de l'ouvrir comme une base de données et de donner l'illusion qu'on y accède sans l'ouvrir, mais il s'agit là d’acrobaties qui sont d'un autre niveau.

    Si ton classeur est "protéger", il faudrait signaler de quelle façon il est protégé.
    Est-ce qu'il est protégé contre l'ouverture au niveau fichier ?
    Est-ce qu'il est protégé pour être ouvert en lecture seule ?
    Est-ce que ce sont les cellules qui sont protégées ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut
    Bonjour à tous les deux,

    Merci BENNASR pour votre proposition qui corresponds à ce que je recherchais.

    Oui Menhir je sais que j'ai pas les bases mais je fais de mon mieux pour apprendre et répondre aux besoins de l'entreprise qui m'a pris en stage et qui ne veut pas investir dans une base de données.
    Je suis dans une formation en management qui ne propose aucun cours de programmation en VBA ou autre. On a un peu de Excel mais le niveau est médiocre.
    Je dois donc apprendre malgré que je ne connaissait même pas l’existence du langage VBA il y a 3 semaine.
    J'ai écris ces lignes de code à 3h cette nuit voyez-vous. Donc je m'excuse pour mes erreurs qui paraissent affligeantes pour vous et je ne vous oblige en rien à répondre a cette discussion.
    Autrement :
    Le classeur source doit être protéger par mdp en plus d’être verrouillé. Mais l'administrateur aura tous les mdp et pourra les rentrer pour cette opération.
    Oui je voulais attribuer les valeurs d'une plage à une variable mais j'ai donc compris qu'il va falloir que je fasse autrement.
    Je vois apparaître une erreur de qualification de la macro.

    Merci pour votre réactivité et votre pertinence à tous les utilisateurs de ce forum.
    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut
    Rebonjour,
    J'ai travaillé sur le code que BENNASR m'a transmis ce matin mais je suis à nouveau confronté à un problème lorsque je l'adapte.

    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
    Sub importProdVte()
        Dim wkA As Workbook, wkB As Workbook
        Dim chemin As String, fichier As String
        Dim j As Long
        Application.ScreenUpdating = False
        Set wkA = ThisWorkbook
        Set f3 = Sheets("Jurgen")
        chemin = "C:\Users\......"
        fichier = "Vendeur.xlsm"
        Workbooks.Open chemin & "\" & fichier
        Set wkB = ActiveWorkbook
        Set f2 = Sheets("Prospects")
     
     
     j = wkB.Application.WorksheetFunction.CountA(f2.Range("$A:$A")) - 4
     k = j + 9
    Set Plage1 = Range(Cells(1, 1), Cells(j, 26))
    Set Plage2 = Range(Cells(10, 1), Cells(k, 26))
    wkA.f3.Plage1.Value = wkB.f2.Plage2.Text 'erreur 438 propriété ou méthode non gérée...
     
    wkB.Close True
     Application.ScreenUpdating = True
    End Sub
    Ça doit pas être encore très compliqué mais je bloque encore dessus depuis ce matin..

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Une variable de type Range ne continent pas seulement les coordonnées d'une cellule, elle est la référence de la cellule.
    Elle contient donc aussi la référence de son onglet et de son classeur (entre autre).

    Donc, quand tu utilises Plage1 ou Plage2, inutile d'indiquer qu'elles appartiennent à wkA, wkB, f3 ou f2.

    Par contre, c'est nécessaire d'y faire référence lorsque tu affectes un Range à ces variable comme dans les deux lignes qui précèdent.
    Tel que tu as écrit ton code, Plage1 et Plage2 sont des zones de Sheets("Prospects").

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut
    Bonjour,
    Je vous remercie pour votre réponse,
    Cela m'a aider à revoir toutes mes définitions de variable.
    Je n'y suis toujours pas, le déboguer m'affiche à la première ligne (sub) une erreur de compilation

    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
    Sub Import_vendeur()
     
        Dim wkA As Workbook
        Dim wkB As Workbook
        Dim chemin As String
        Dim fichier As String
        Dim J As Long
        Dim K As Long
        Dim plage1 As Range
        Dim plage2 As Range
        Dim f1 As Sheets
        Dim f2 As Sheets
        Application.ScreenUpdating = False
            Set wk1 = ThisWorkbook
            Set f1 = wk1.Sheets("vendeur1")
            chemin = "\\serveur-2012\......"
            fichier = "Vendeur1.xlsm"
        Workbooks.Open chemin & "\" & fichier, Password:="*****"
            Set wk2 = ActiveWorkbook
            Set f2 = wk2.Sheets("Prospects")
            J = Application.WorksheetFunction.CountA(f2.Range("$A:$A"))
            K = J + 9
            Set plage1 = f1.Range(Cells(1, 1), Cells(J, 26))
            Set plage2 = f2.Range(Cells(10, 1), Cells(K, 26))
        plage1.Value = plage2.Value
     
    wkB.Close True
     Application.ScreenUpdating = True
     
    End Sub
    Je fais appel à nouveau à votre aide après pas mal de recherche.
    Bonne journée

Discussions similaires

  1. [XL-2007] Coller une sélection vers un autre classeur
    Par Didikgk dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/05/2018, 11h51
  2. [XL-2013] Rechercher, copier et coller une plage de cellules avec critères précis.
    Par DanRo1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/08/2016, 19h05
  3. Réponses: 4
    Dernier message: 02/07/2015, 23h51
  4. Réponses: 1
    Dernier message: 29/06/2015, 18h01
  5. [VBA] Copie d'une plage vers un autre classeur
    Par Pachee dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/08/2008, 15h14

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