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 :

MAJ d'un classeur depuis un autre (sans ADODB pour l'instant) [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Points : 48
    Points
    48
    Par défaut MAJ d'un classeur depuis un autre (sans ADODB pour l'instant)
    Bonjour à tous,

    Effectivement le titre est quasiment le même que sur le sujet juste avant (par rapport aux dates) mais la demande est bien plus avancée !

    Je vous présente mon problème :
    J'ai d'un côté un fichier .xlsm qui me sert de mini-database (pas de quoi passer sur Access + personne dans le service ne sait utiliser Access) et d'un autre côté un fichier qui souhaite récupérer les données (via une petite macro sur un bouton) de cette database sans l'ouvrir.

    Pour cela j'ai fais des recherches et la connection ADODB ne répondait pas très bien à mes demandes car les boucles vérifier la valeur cellule sont trop complexes.

    Voila ce que j'ai repris :
    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
    sub maj()
     
    Dim appli As Excel.Application, fichier As Window
    Set appli = CreateObject("Excel.application")
    appli.Workbooks.Open myPath 'mypath (string) étant le chemin jusqu'à la database, déjà identifié
    appli.Visible = False
    Set fichier = appli.Windows("DATA.xlsm")
    fichier.Activate
     
    'Requête très simple comme
    Dim var as integer
    var = Range("A1")
     
    'je ferme tout
    fichier.close
    set appli = Nothing
     
    'je reviens sur le classeur demandeur
    WorkSheets("Feuil1").Activate
    Range("A1") = var
     
    end sub
    (Ce code est simplifié)
    En réalité ce code fonctionne uniquement si le classeur actif EST la database.
    Dans tous les autres cas, la macro ne me renvoie que des valeurs NULL. (par exemple si j'appuie sur le bouton du classeur demandeur)
    Si vous avez une solution pour ce problème ou quelque chose de complétement différent pour faire la même chose, je suis preneur ! (peut être pas ADODB )

    Je vous remercie pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    un petit exemple pour récupérer la valeur d'une cellule dans un fichier fermé avec ExecuteExcel4Macro
    rien ne t'empeche de faire ca dans une boucle pour en récupérer plusieurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        Dim chemin$, fichier$, feuille$, cellule As Range
        chemin = "C:\Users\polux\Desktop"
        fichier = "hhhhhtml.xls"
        feuille = "Feuil1"
        Set cellule = Range("c4")
        MsgBox GetVal_on_closed_fich(chemin, fichier, feuille, cellule)
    End Sub
    '
    Function GetVal_on_closed_fich(ByVal chemin As String, ByVal fichier As String, ByVal feuille As String, cel As Range) As String
        Dim Rc$
        Rc = "R" & cel.Row & "C" & cel.Column
        GetVal_on_closed_fich = ExecuteExcel4Macro("'" & chemin & "\[" & fichier & "]" & feuille & "'!" & Rc)
    End Function
    apres tu peux effectivement l'ouvrir recup et fermer

    a ma connaissance ce sont les deux seules olution vba qui existe a part adobconnection
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Overeath Voir le message
    récupérer les données de cette database sans l'ouvrir.
    Impossible.
    Si tu veux lire les données d'un fichier, il faut l'ouvrir d'une façon ou d'une autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim appli As Excel.Application, fichier As Window
    Set appli = CreateObject("Excel.application")
    appli.Workbooks.Open myPath
    Set fichier = appli.Windows("DATA.xlsm")
    fichier.Activate
    Si ton code est dans Excel, je ne comprends pas pourquoi tu te compliques la vie comme ça.
    Fais directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim WBSource As Workbook, WBDest As Workbook
    Set WBDest = ActiveWorkbook
    Set WBSource = Workbooks.Open myPath
    WBDest.WorkSheets("Feuil1").Range("A1") = Range("A1")
    WBSource.Close
    set WBSource = Nothing
    Personnellement, je ne laisserai pas "tout seul" le = Range("A1"). Je lui collerai la référence de sa Worksheet.
    Il est possible (mais pas sûr) que ce soit la cause de ton problème.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    Effectivement, ta solution marche parfaitement et le temps de traitement est nettement inférieur (ma macro prenait 1 sec) alors merci beaucoup
    Je vais adapter ça de ce pas !

    Citation Envoyé par Menhir Voir le message
    Impossible.
    Quand je dis que je ne veux pas l'ouvrir, c'est graphiquement. Bien entendu pour lire n'importe quel fichier il faut l'ouvrir.

    Citation Envoyé par Menhir Voir le message
    Personnellement, je ne laisserai pas "tout seul" le = Range("A1")
    Oui c'était un exemple mais aussi la cause de mes erreurs. Le compilo Excel me donnais des erreurs lorsque je voulais préciser en donnant le Workbook et le Worksheet.

    Le code que tu me donnes est très sympathique aussi mais le compilo me dit "Attendu : fin d'instruction" à la ligne : Set WBSource = Workbooks.Open myPath.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    c'est normal il faut renseigner mypath
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim WBSource As Workbook, WBDest As Workbook,mypath$
    mypath="C:\mondossier\mofichier.xlsx"
    application.screenupdating=false
    Set WBDest = ActiveWorkbook
    Set WBSource = Workbooks.Open myPath
    WBDest.WorkSheets("Feuil1").Range("A1") = Range("A1")
    WBSource.Close
    set WBSource = Nothing
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    Oui oui pas de problème de ce côté là, je l'ai fait ^^

    il ne me donne pas l'erreur à l’exécution mais seulement quand je change de ligne.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    peut tre faut-il renseigner le classeur source et dans quel sheets du classeur source tu veux pecher la donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim WBSource As Workbook, WBDest As Workbook,mypath$
    mypath="C:\mondossier\mofichier.xlsx"
    application.screenupdating=false
    Set WBDest = ActiveWorkbook
    Set WBSource = Workbooks.Open myPath
    WBDest.WorkSheets("Feuil1").Range("A1") = WBSource.sheets("toto").Range("A1")
    WBSource.Close
    set WBSource = Nothing
    cela dit je prefere pour quelques cellule utiliser executeexcel4macro
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oupss!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set WBSource = Workbooks.Open(mypath)
    j'avais betement copier le code de menhir sans verifier menhir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    j'avais betement copier le code de menhir sans verifier menhir
    J'ai aussi recopié bêtement son code en supposant que mypath n'avait été placé là qu'à titre indicatif pour anonymiser le code, la remarque en fin de ligne laissant supposer qu'il y avait autre chose dans le vrai code.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    comme quoi on c'est fait avoir tout les deux a recopier vetement
    mais qu'importe mypath referencé ou pas doit etre entre parenthese quand la ligne commence par set variable=workbooks.open(..........)
    cela dit je réhitere mon avis quand a executeexcel4macro pour quelques cellules (bien plus rapide )
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    Effectivement, ca marche beaucoup mieux

    Merci à tous les deux !

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

Discussions similaires

  1. Appeler une méthode d'une appli depuis une autre sans toucher à son code
    Par Omegnight dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/03/2016, 18h58
  2. [XL-2007] Lire dans un classeur depuis un autre classeur
    Par Kimy_Ire dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2013, 18h30
  3. [XL-2010] Ouverture d'un classeur depuis un autre - Userform
    Par AidezMoiSvp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/01/2012, 11h51
  4. Accéder a un classeur depuis un autre classeur
    Par lou57lou dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/01/2009, 17h23
  5. Réponses: 4
    Dernier message: 15/06/2007, 19h59

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