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 :

Exporer des valeurs dans une fichier fermé.


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Points : 24
    Points
    24
    Par défaut Exporer des valeurs dans une fichier fermé.
    Bonjour, aprés avoir lu et relu http://silkyroad.developpez.com/VBA/...sFermes/#LIV-B, je n'arrive pas à ecrire une plage de cellule à la premiere cellule vide de la colonne B.
    Est-il possible de faire ceci dans un fichier destination qui est nativement en lecture seul.
    Je vous remercie de m'avoir lu et je vous souhaite une bonne journée.
    Cordialement
    Guillaume
    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:\Users\Moi\Desktop\1.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 = Range("A65536").End(xlUp).Row    
        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

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    En ôtant la propriété "Lecture seule" avant l'inscription de la valeur et en la remettant une fois ceci fait. La recherche de la dernière ligne non vide est fait avec "ExecuteExcel4Macro" (c'est pas jeune mais ça marche encore pour Excel 2007, à voir pour ultérieur). Il y a sûrement une possibilité en ADO, je planche dessus. La connexion du classeur est faite dans une proc séparée pour plus de clarté mais adapte à tes besoins :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Private Sub ConnectCLasseur(ConnectCL As Object, _
                                Fichier As String, _
                                Optional Rs)
     
        Set ConnectCL = CreateObject("ADODB.Connection")
     
        If Not IsMissing(Rs) Then
            Set Rs = CreateObject("ADODB.Recordset")
        End If
     
        ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                  "Data Source=" & Fichier & ";" & _
                  "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 2;"""
     
    End Sub
     
    Sub Valeur()
     
        Dim ConnectCL As Object
        Dim Rs As Object
        Dim Classeur As String
        Dim NomFeuille As String
        Dim Plage As String
        Dim Valeur
        Dim DerCel As Integer
        Dim Dossier As String
     
        'chemin du classeur cible
        Classeur = "C:\Users\Moi\Desktop\1.xls"
        Dossier = Left(Classeur, InStrRev(Classeur, "\"))
     
     
        'nom de la feuille où se trouve la cellule
        NomFeuille = "Feuil1"
     
        'défini la ligne vide sous la dernière cellule non vide de la colonne A
        DerCel = ExecuteExcel4Macro("COUNTA('" & Dossier & _
                                    "[" & Dir(Classeur) & "]" & _
                                    NomFeuille & "'!R1C1:R65536C1)") + 1
     
        'cellule à mettre à jour
        'doit être définie comme "Ax:Ax"
        Plage = "A" & DerCel & ":A" & DerCel
     
        'valeur à inscrire
        Valeur = "Donnée test"
     
        'mets le classeur à "Normal" (ôte la lecture seule)
        SetAttr Classeur, 0
     
        'connecxion
        ConnectCLasseur ConnectCL, Classeur, Rs
     
        With Rs
     
            .CursorType = 1
            .LockType = 3
            .Open "SELECT * FROM `" & NomFeuille & "$" & _
            Plage & "` ", ConnectCL
            .Fields(0).Value = Valeur
            .Update
        End With
     
        ConnectCL.Close
     
        'remet le classeur à "Lecture seule"
        SetAttr Classeur, 1
     
        Set Rs = Nothing
        Set ConnectCL = Nothing
     
    End Sub
    Hervé.

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Avec une requête :
    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
    54
    55
    56
    57
    58
    59
    60
     
    Sub Valeur()
     
        Dim ConnectCL As Object
        Dim Rs As Object
        Dim Classeur As String
        Dim NomFeuille As String
        Dim Plage As String
        Dim Valeur
        Dim DerCel As Integer
     
        'chemin du classeur cible
        Classeur = "C:\Users\Moi\Desktop\1.xls"
     
        'nom de la feuille où se trouve la cellule
        NomFeuille = "Feuil1"
     
        'défini la plage sur la colonne A pour la recherche du nombre
        'de cellules non vides
        Plage = "A1:A65536" 'adapter l'adresse
     
        'ouvre une première connecxion pour la recherche
        ConnectCLasseur ConnectCL, Classeur, Rs
     
        'défini la ligne vide sous la dernière cellule non vide de la colonne A
        Set Rs = ConnectCL.Execute("SELECT COUNT(*) FROM `" & NomFeuille & "$" & Plage & "` ")
        DerCel = Rs.Fields(0).Value + 1
     
        'cellule à mettre à jour, doit être définie comme "Ax:Ax"
        Plage = "A" & DerCel & ":A" & DerCel
     
        'valeur à inscrire
        Valeur = "Donnée test"
     
        'mets le classeur à "Normal" (ôte la lecture seule)
        SetAttr Classeur, 0
     
        'ferme le Recordset
        Rs.Close
     
        'puis le réouvre pour inscrire la valeur
        With Rs
     
            .CursorType = 1
            .LockType = 3
            .Open "SELECT * FROM `" & NomFeuille & "$" & Plage & "` ", ConnectCL
            .Fields(0).Value = Valeur
            .Update
     
        End With
     
        ConnectCL.Close
     
        'remet le classeur à "Lecture seule"
        SetAttr Classeur, 1
     
        Set Rs = Nothing
        Set ConnectCL = Nothing
     
    End Sub
    Hervé.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Merci Hervé de m'avoir aidé hier soir .

    Je n'ai pu me pencher sur ta solution que cette A.M., j'étais au travail cette nuit.

    Je dois être un gros nigo, car je n'arrive pas du tout à faire fonctionné ton modèle.

    J'ai les deux fichiers (la source & la destination) en pièces jointes.

    Si tu avais la gentillesse de bien vouloir-y regarder
    Pour la valeur à copie peut-on indiquer une plage de valeur ex. A1:g3
    Merci
    Guillaume
    Fichiers attachés Fichiers attachés

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Hier soir, un des administrateurs m'a fait remarquer que je ne me comportais pas correctement sur le forum.

    Je tiens à m'excuser publiquement, Vous n'êtes pas des serviteurs, mais des âmes charitables qui, donne de leur temps de repos pour aider des gens comme moi.

    Je tiens à vous remercier.

    Veuillez SVP ne pas m'en tenir rigueur.

    Guillaume

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Que signifi l'erreur " la table n'est pas dans le format attendu"?
    Sur le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                  "Data Source=" & Fichier & ";" & _
                  "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 2;"""

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Il te faut l"enregistrer en ".xls" (Excel 97 à 2003)

    Comme j'ai mal lu ton message initial (valeur en colonne B) il te faut adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Plage = "A1:A65536" en Plage = "B1:B65536"
    et
    Plage = "A" & DerCel & ":A" & DerCel en Plage = "B" & DerCel & ":B" & DerCel
    Hervé.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Points : 24
    Points
    24
    Par défaut
    Merci Hervé pour ton aide mais j'ai vraiment besoin d'être sous excel 2010.
    Effectivement en 2003 cela fonctionne trés bien.
    Comment puis-je faire si je veux exporté une plage de donnée de type "a1:g13"ou la selection , cette macro ne sera pas dans le fichier initial mais dans un autre projet.
    Cordialement
    Guillaume

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2013, 16h39
  2. Tracer une courbe en fonction des valeurs dans un fichier
    Par Yann_69 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 24/04/2012, 09h03
  3. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  4. Attribuer des valeurs dans une ListBox
    Par OjBarbare dans le forum MFC
    Réponses: 5
    Dernier message: 06/12/2005, 11h28
  5. fonction récupérant des valeurs dans une fonction popup...
    Par petitsims dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2005, 14h51

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