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 :

Ecrire à partir d'un fichier dans un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut Ecrire à partir d'un fichier dans un autre
    Bonjour,

    J'ai un problème sans doute un peu compliqué (du moins, je m'arrache les cheveux dessus!).

    Je désirerais écrire à partir d'un classeur Excel dans un autre, c'est à dire que par exemple une fenêtre de conversation utilisateur s'ouvre sur un classeur maitre et me demande une valeur, je rentre une valeur, et à partir de ça, Excel se charge d'aller écrire dans une autre feuille esclave, en A1 (par exemple!) la valeur que j'ai rentré.

    Ce qui donnerai à peu près ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    'Ici je suis dans mon fichier maître
     
    variable = InputBox("Tapez ce que vous voulez écrire dans l'autre feuille")
     
    'Maintenant excel se charge d'aller écrire dans le fichier esclave
    'Ici je suis perdu, je ne connais pas du tout la syntaxe pour aller dans l'adresse du fichier
    'Note : il est necessaire que je donne l'adresse du fichier car c'est pour une application réseau
     
    'donc maintenant je considère que je suis sur la feuille de mon réseau
     
    Sheets(1).Cells(1, 1) = variable
    Autre chose importante : il est nécessaire que j'indique l'adresse du fichier dans lequel je veux écrire, car c'est pour dans l'avenir utiliser cette macro sur un réseau : le fichier maître est sur un ordinateur, l'esclave est sur un autre.

    De plus, de préférence, ce serait bien de ne pas ouvrir le fichier esclave.

    Voilà j'espère que c'est possible de faire une telle chose...et que je ne suis pas trop exigeant...

    Merci par avance de vos réponses!

  2. #2
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    si tu ne veux pas ouvrir ton fichier cible, le seul moyen serait de faire une liaison sur ton fichier source.

  3. #3
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    et comment fait-on une telle liaison dans une macro?

    (j'ai peut-être oublié de préciser que c'était avec une macro que je voulais faire ça!)

  4. #4
    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
    Bonjour tlm,

    Si cela peut te mettre sur une piste, jette un oeil sur ce tuto :
    Comment lire et écrire dans un classeur Excel fermé

  5. #5
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Bonjour Fring,

    Je te remercie pour ce lien, qui va m'être fort utile. Je m'en vais de ce pas l'exploiter, et essayer de faire ce que je veux.

    Cependant, je reviendrais peut-être dans la journée, car je voudrais également activer des checkbox d'autres fichiers, sur le même principe que j'ai cité précédemment.

    Merci en tout cas, et à tout à l'heure, je vous tiens au courant si j'y arrive ou pas!

    Merci!

  6. #6
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Re-bonjour,

    Je suis depuis ce matin sur le tuto dont fring m'a donné l'adresse.

    J'arrive juste à me connecter à la feuille, mais je n'arrive ni à écrire, ni à lire.

    J'ai cherché et je cherche encore, mais si quelqu'un pouvait me faire un petit morceau de code pour aller lire la cellule A1 par exemple, et écrire "toto" dans B1, je suis preneur...

    Ou tout du moins pour une piste!

    Merci de votre aide.

  7. #7
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    extraits du lien qui t'as été donné

    lire

    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
    Sub extractionValeurCelluleClasseurFerme()
        Dim Source As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim ADOCommand As ADODB.Command
        Dim Fichier As String, Cellule As String, Feuille As String
     
        'Adresse de la cellule contenant la donnée à récupérer
        Cellule = "B4:B4"
          'Pour une plage de cellules, utilisez:
          'Cellule = "A4:C10"
     
        Feuille = "Feuil1$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
        'Chemin complet du classeur fermé
        Fichier = "C:\Base.xls"
     
        Set Source = New ADODB.Connection
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
     
        Set ADOCommand = New ADODB.Command
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
        End With
     
        Set Rst = New ADODB.Recordset
        Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
        Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
     
        Range("A2").CopyFromRecordset Rst
     
        Rst.Close
        Source.Close
        Set Source = Nothing
        Set Rst = Nothing
        Set ADOCommand = Nothing
    End Sub

    ecrire

    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
    Sub exportDonneeDansCelluleClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Cd As ADODB.Command
        Dim Rst As ADODB.Recordset
        Dim Fichier As String
     
        Fichier = "C:\Documents and Settings\mimi\dossier\LeClasseur.xls"
     
        Set Cn = New ADODB.Connection
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & ";" & _
            "Extended Properties=""Excel 8.0;HDR=No;"";"
     
        Set Cd = New ADODB.Command
        Cd.ActiveConnection = Cn
        Cd.CommandText = "SELECT * FROM [Feuil1$G30:G30]"
     
        Set Rst = New ADODB.Recordset
        Rst.Open Cd, , adOpenKeyset, adLockOptimistic
        Rst(0).Value = "Donnée test"
        Rst.Update
     
        Cn.Close
        Set Cn = Nothing
        Set Cd = Nothing
        Set Rst = Nothing
    End Sub
    ce qui reviens à dire, lorsque tu as effectué la connection, tu doit ouvrir un recordset pour lire ou écrire les données

  8. #8
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Oups je n'avais recopié que la moitié du code...évidemment moi je suis resté la tête dans le guidon...

    Merci!

    Je reviens si j'ai besoin!

  9. #9
    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
    Pour exemple, j'ai repris le code servant à écrire dans une cellule d'un classeur fermé et j'ai commenté les 3 lignes de code que tu dois adapter
    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 exportDonneeDansCelluleClasseurFerme()
    'Vous devez préalablement activer la référence
    'Microsoft ActiveX Data Objects x.x Library
     
        Dim Cn As ADODB.Connection
        Dim Cd As ADODB.Command
        Dim Rst As ADODB.Recordset
        Dim Fichier As String
     
        Fichier = "D:\Divers\Macro\tests\Classeur test.xls" '<-- chemin complet et nom du fichier de destination
     
        Set Cn = New ADODB.Connection
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & ";" & _
            "Extended Properties=""Excel 8.0;HDR=No;"";"
     
        Set Cd = New ADODB.Command
        Cd.ActiveConnection = Cn
        Cd.CommandText = "SELECT * FROM [Feuil1$A1:A1]" '<-- feuille et cellule de destination
     
        Set Rst = New ADODB.Recordset
        Rst.Open Cd, , adOpenKeyset, adLockOptimistic
        Rst(0).Value = "TEST" '<-- texte à insérer dans la cellule de destination
        Rst.Update
     
        Cn.Close
        Set Cn = Nothing
        Set Cd = Nothing
        Set Rst = Nothing
    End Sub
    IMPORTANT : Vous devez préalablement activer la référence Microsoft ActiveX Data Objects x.x Library

  10. #10
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Merci beaucoup, tout fonctionne correctement. C'est presque parfait!

    En effet, pour faire ce que je veux, il ne me reste plus qu'à aller cocher dans ma feuille esclave des checkboxs...

    Est-ce possible?

    Il ne parle de rien à ce sujet dans le tuto...

    Merci pour votre aide!

  11. #11
    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
    On s'éloigne de la simple écriture d'une donnée dans une cellule...

    Je ne suis pas persuadé que l'on puisse manipuler des objets dans un classeur fermé mais si tu as plusieurs manips de ce genre à faire, plus tôt que d'essayer de construire une usine à gaz, pourquoi ne pas ouvrir le classeur en question ?
    En ajoutant des Application.ScreenUpdating = False en début de code et = True en fin de code tu ne t'appercevras même pas de la manip.
    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
    Sub MaMacro()
    Dim Chemin As String, Fichier As String
    Application.ScreenUpdating = False
    Chemin = "C:\Repertoire\Sous_repertoire\"
    Fichier = "MonFichier.xls"
    Workbooks.Open FileName:=Chemin & Fichier
    With Workbooks(Fichier)
    '...
    'code manips à effectuer
    '...
    .Save
    .Close
    End With
    Application.ScreenUpdating = True
    End Sub

  12. #12
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Merci Fring,

    Là je fini ma feuille pour laquelle j'ai posé ma question précédente, et je regarde ça. Merci!

  13. #13
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Bonjour Fring, et les autres,

    Bon j'ai essayé ton code que tu m'as gentiment donné précédemment, le problème c'est que je n'arrive pas à faire la moindre modification de ma feuille Excel, et je n'ai aucun message d'erreur.

    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
     
    If CheckBox1.Value = True Then
    'Si on coche cette case à cocher
     
    Dim Chemin As String, Fichier As String
    Application.ScreenUpdating = False
    Chemin = "D:\Dossiers\"
    Fichier = Cells(4, 5) & ".xls"
     
    Workbooks.Open Filename:=Chemin & Fichier
    With Workbooks(Fichier)
     
    Sheets(3).Cells(5, 1) = "toto"
     
     
    .Save
    .Close
    End With
    Application.ScreenUpdating = True
    Voilà, si une nouvelle fois tu pourrais m'aider, je te serait très reconnaissant!

    Merci beaucoup!



    EDIT : Problème résolu le code ci-dessus est correcte
    Merci quand même!

  14. #14
    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
    A première vue, il manque un point à .Sheets(3)...
    Ce qui permet de faire la liaison entre Sheets(3) et Workbooks(Fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Sheets(3).Cells(5, 1) = "toto"
    EDIT : non finalement cela fonctionne également sans le point vu que Workbooks(Fichier) est à ce moment là le classeur actif
    Le code fonctionne donc correctement

  15. #15
    Membre confirmé Avatar de catsur
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Par défaut
    Merci!

    Mais je viens de trouver mon problème, le code était bon en fait, j'ai édité!

    Merci quand même Fring, désolé pour le dérangement!

  16. #16
    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
    ya 0 dérangement, j'ai édité entre temps ma réponse également

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/12/2012, 11h05
  2. [XL-2007] Créer une liste de validation à partir de données contenues dans un autre fichier
    Par familledacp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/10/2011, 19h03
  3. Ecrire un fichier dans un autre
    Par nesrine6215 dans le forum C
    Réponses: 1
    Dernier message: 13/06/2008, 14h33
  4. Réponses: 2
    Dernier message: 02/07/2004, 14h46
  5. [LG]Ecrire le contenu d'un fichier dans un autre
    Par lucke dans le forum Langage
    Réponses: 10
    Dernier message: 26/04/2003, 21h48

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