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 :

Copier une valeur depuis une autre instance d'Execl


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Novembre 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2021
    Messages : 4
    Par défaut Copier une valeur depuis une autre instance d'Execl
    Bonjour à Toutes et Tous,

    Je souhaite [simplement] copier une valeur depuis un fichier source dans une autre instance d'Excel et la coller dans le classeur actif.
    J'ai 2 instances d'Excel parce que j'ai 2 écrans avec des fenêtre Excel de taille différente et je ne peux pas tout avoir la même instance, désolé...

    Je ne trouve pas le moyen d'assigner l'autre instance. J'ai vu des usages de getObject, mais je n'arrive pas à me l'approprier.

    Voici mon code:

    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
    Sub copierDailleurs()
    '
        Dim NomFic As String
     
    ' le fichier destination est variable
        NomFic = ActiveWorkbook.Name
     
        Application.WindowState = xlNormal
    ' le fichier source a toujours le même nom:
        Windows("source.xlxs").Activate
        Application.CutCopyMode = False
    ' il faut copier la cellule qui est 3 colonnes plus à droite que la cellule active
        ActiveCell.Offset(0, 3).Select
        Selection.Copy
        Windows(NomFic).Activate
    ' on colle toujours dans la cellule B3 du fichier destination
        Range("B3").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    End Sub
    A la place de Windows("source.xlxs") je pensais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetObject("source.xlxs").ActiveCell.Offset(0, 3).Copy
    mais ça ne fonctionne pas.

    Pouvez-vous me donner un coup de main?
    Merci d'avance
    Olivier

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 437
    Par défaut
    Bonjour,

    Il est possible de le faire, mais à mon avis la solution que je propose n'est vraiment pas une façon recommandée:
    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
    Option Explicit
     
    Private Declare PtrSafe Function BringWindowToTop Lib "user32" _
                    (ByVal hWnd As Long) As Long
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
                    (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
     
    Sub Copier_de_ailleurs()
        Dim xHandle As Long
        '--- aller sur l'autre instance
        xHandle = FindWindow("XLMAIN", "source.xlsx - Excel")  '--- =0 si non trouvé
        BringWindowToTop xHandle
        '--- copier
        SendKeys ("{RIGHT 3}")
        Application.Wait (Now + TimeValue("0:00:01"))
        SendKeys ("^c")
        Application.Wait (Now + TimeValue("0:00:01"))
        SendKeys ("{LEFT 3}")
        Application.Wait (Now + TimeValue("0:00:01"))
        '--- coller dans B3 du classeur actif
        Range("B3").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    End Sub
    Un lien qui m'a servi: Capture Window Handles, Class Names and Titles

    Cordialement.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,

    A mon avis tu te complique la tache pour rien. je comprends l'intérêt de la seconde instance pour la visualisation, mais pour le traitement ...

    Pourquoi ne pas fermer ta seconde instance, puis dans la première réouvrir, faire tes manips simplement, puis fermer et réouvrir ta seconde instance

  4. #4
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 035
    Par défaut
    Citation Envoyé par opalias Voir le message
    J'ai vu des usages de getObject, mais je n'arrive pas à me l'approprier
    Bonjour.
    Effectivement GetObject est une bonne piste.
    L'aide explique comment l'utiliser : https://docs.microsoft.com/fr-fr/off...bject-function

    Attention : dans Set MyXL = GetObject(NomCompletDuFichier) il faut NomCompletDuFichier = chemin + nom du fichier et pas simplement son nom.

    Et pour obtenir la cellule active du fichier, il faut au préalable l'activer : MyXL.Worksheets(MyXL.ActiveSheet.Name).Activate

    Ce qui donne ce code qu'il faudra adapter à votre besoin.

    Code VBA : 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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    '------------------------------------------------------------------------------------------------
    ' Permet de manipuler Excel dans une autre instance.
    ' Sources: https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/getobject-function
    '------------------------------------------------------------------------------------------------
     
    Option Explicit
     
    ' Declare necessary API routines:
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
                                                                  ByVal lpWindowName As Long) As Long
     
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                                                                    ByVal wParam As Long, ByVal lParam As Long) As Long
     
    '------------------------------------------------------------------------------------------------
    Sub GetExcel()
    '------------------------------------------------------------------------------------------------
    Dim MyXL As Object                  ' Variable to hold reference to Microsoft Excel.
    Dim ExcelWasNotRunning As Boolean   ' Flag for final release.
     
    ' Test to see if there is a copy of Microsoft Excel already running.
    ' Getobject function called without the first argument returns a
    ' reference to an instance of the application. If the application isn't
    ' running, an error occurs.
    On Error Resume Next
    Set MyXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear
     
    ' Check for Microsoft Excel. If Microsoft Excel is running enter it into the Running Object table.
    If DetectExcel = True Then
     
        ' Set the object variable to reference the file you want to see.
        Set MyXL = GetObject("C:\Test\Monfichier.xlsm")
     
        ' Show Microsoft Excel through its Application property. Then show the actual window containing
        ' the file using the Windows collection of the MyXL object reference.
        MyXL.Application.Visible = True
        MyXL.Parent.Windows(1).Visible = True
     
        ' ....... Placez ici vos instructions :
     
        ' Active la feuille pour pouvoir utiliser ActiveSheet
        MyXL.Worksheets(MyXL.ActiveSheet.Name).Activate
        Debug.Print ActiveCell.Value
     
        ' Autre exemple si l'on connait le nom de la feuille et la cellule concernée:
        Debug.Print MyXL.Sheets("Feuil2").Range("A1")
     
        ' .......
     
        ' If this copy of Microsoft Excel was not running when you started, close it using the
        ' Application property's Quit method. Note that when you try to quit Microsoft Excel, the
        ' title bar blinks and a message is displayed asking if you want to save any loaded files.
        If ExcelWasNotRunning = True Then MyXL.Application.Quit
     
    End If
     
    Set MyXL = Nothing    ' Release reference to the application and spreadsheet.
    End Sub
     
    '------------------------------------------------------------------------------------------------
    Function DetectExcel() As Boolean
    '------------------------------------------------------------------------------------------------
    ' Procedure dectects a running Excel and registers it.
    Const WM_USER = 1024
    Dim hWnd As Long
     
    ' If Excel is running this API call returns its handle, 0 means Excel not running.
    hWnd = FindWindow("XLMAIN", 0)
    If hWnd <> 0 Then
        ' Excel is running so use the SendMessage API function to enter it in the Running Object Table.
        SendMessage hWnd, WM_USER + 18, 0, 0
        DetectExcel = True
    End If
    End Function
    '------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------


    Bonne programmation.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Novembre 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2021
    Messages : 4
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour halaster08,

    Merci pour l'idée. Le fichier qu'il faudrait fermer et rouvrir est gros et se trouve sur un serveur. Ca va prendre un temps infini, là où j'essaie de gagner du temps dans les manip... Mais je retiens l'idée...

    Citation Envoyé par laurent_ott Voir le message
    Bonjour laurent_ott,

    Merci beaucoup! Je vais essayer ça, d'autant plus que je connais le nom des classeurs et des feuilles. La cellule à copier sera la cellule active quand on arrive dans le classeur.

Discussions similaires

  1. Copier des valeurs depuis une autre tableau régulièrement mis à jour
    Par koukou13 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/04/2019, 05h50
  2. [XL-2016] recherche une valeur et copier une autre valeur de la meme ligne
    Par Fdc_53 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/12/2018, 16h31
  3. Réponses: 8
    Dernier message: 07/03/2016, 14h31
  4. Réponses: 19
    Dernier message: 22/06/2007, 09h54
  5. Réponses: 5
    Dernier message: 07/06/2007, 15h19

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