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 :

Mise à jour avec méthode ADO


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Bonjour,

    Je lis et j'essaye d'écrire dans des classeurs fermés, j'utilise la méthode ADO, mais j'ai 2 soucis :

    Le premier est que lorsque je veux mettre à jour des données, je fais (repris de la FAQ) :
    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
    Sub miseAJour_Enregistrement()
        Dim Cn As ADODB.Connection
        Dim Fichier As String, Feuille As String, strSQL As String
        Dim PrixUnit As Integer
        Dim leNom As String
     
        Fichier = "C:\Base.xls"
        Feuille = "Feuil1"
        leNom = "NomTest"
        PrixUnit = 45
     
        Set Cn = New ADODB.Connection
     
        With Cn
            .Provider = "MSDASQL"
            .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & Fichier & "; ReadOnly=False;"
            .Open
        End With
     
        'Met à jour la valeur du "Champ4" si le "Champ2" correspond à la variable "leNom"
        strSQL = "UPDATE [" & Feuille & "$] SET " & _
            "Champ4 = " & PrixUnit & " WHERE Champ2 = '" & leNom & "'"
     
        Cn.Execute strSQL
     
        Cn.Close
        Set Cn = Nothing
    End Sub
    Premier souci : "PrixUnit" : j'ai des données hors valeurs numériques (exemple des noms), j'ai donc mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim PrixUnit as string  
    Prixunit = cells(i,1) ' j'ai aussi essayé avec cells(i,1).value
    , mais cela ne fonctionne pas…et je ne comprends pas…
    Deuxième souci : j'ai plusieurs champs à mettre à jour, j'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strSQL2 = "UPDATE [" & Feuille & "$] SET " & _
            "Champ6 = " & PrixUnit & " WHERE Champ2 = '" & leNom & "'"
     
        Cn.Execute strSQL2
    idem, marche pas….


    2ème gros souci (heureusement ils sont limités…)

    j'ai repris le code de la FAQ sur l'écriture dans un classeur fermé, mais dans l'exemple, on ne parle que d'une cellule (G30), avec le texte "Donnée test",
    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
    mais j'aurai besoin de copier une plage de cellule (A1:H50) de mon classeur A vers le classeur fermé B……cela fonctionne très bien sur 1 seule cellule (j'ai fait l'essai avec G30), mais je n'ai pas trouvé avec une plage de cellule….

    Une petite aide pour mes 3 soucis …???

    Merci,

    A+

    Bonjour,

    Après plusieurs essais et recherches, je pense qu'il serait plus simple de copier la plage A3:CA3 du classeur A dans le classeur B.

    Mais je n'ai toujours pas trouvé….La méthode de l'UPDATE était pratique car elle permet de copier sur la "bonne ligne" : A3:CA3 du classeur A peut être A150:AC150 du classeur B…..: le classeur B me sert de base de données : dans mon code, à l'ouverture du classeur A, je lis les données du classeur B.

    J'applique un filtre : n'affiche que les données de l'utilisateurs, il peut les modifier, puis doit les "renvoyer" vers le classeur A….d'où mon premier choix avec l'UPDATE puisu'il permet de faire un filtre avec Merci pour votre aide…

    A+

  2. #2
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    Il faut adapter l'exemple de la faq.

    Si le titre de ta colonne 4 n'est pas Champs4, il faut changer champs4 par ce titre ...

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour,
    si ton fichier Excel ne dispose pas d'entête de colonnes, les entêtes par défaut sont [H1],[H2],[H3]....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci Oliv-,
    Merci rdurupt,

    J'ai bien contrôlé les entêtes de colonne (au passage, merci rdurupt pour ton code, car j'ignorai que l'on pouvait le faire sans).

    Mon problème est que je souhaite copier une plage de cellule (A3:AC3) de mon classeur A (contenant la macro), vers le classeur B fermé....et que je n'y arrive pas....

    Le code de Silkyroad donne la manip pour 1 cellule (G30:G30) et inscrit "Donnée test", cela fonctionne très bien, mais je cherche à le faire sur 1 plage de cellule.....

    J'ai essayé la mise à jour des données via , j'y suis arrivé, enfin presque, car j'ai des données "texte", des "date", des "VRAI/FAUX", et à chaque fois cela bloque....d'où ma recherche de copier/coller la plage complète de cellule......exemple du 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
    21
    strSQL = "UPDATE [" & Feuille & "$] SET  Datecreationdossier = '" & Cells(ligne, 1).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  N° = '" & Cells(ligne, 2).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  Nom = '" & Cells(ligne, 3).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  Prénom = '" & Cells(ligne, 4).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
     
    strSQL = "UPDATE [" & Feuille & "$] SET  Age = " & Cells(ligne, 8).Value & "  WHERE NDossier = '" & numdossier & "';" 'donnée valeur donc modification SQL
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  Commune = '" & Cells(ligne, 9).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  Portable = '" & Cells(ligne, 10).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  Courriel = '" & Cells(ligne, 11).Value & "'" & " WHERE NDossier = '" & numdossier & "';"
       Cn.Execute strSQL
     
    strSQL = "UPDATE [" & Feuille & "$] SET  SexeMasculin = '" & Cells(ligne, 14).Value & "'" & " WHERE NDossier = '" & numdossier & "';" 'bloque sur SQL car "VRAI" ou "FAUX"....
      Cn.Execute strSQL
    strSQL = "UPDATE [" & Feuille & "$] SET  SexeFéminin = '" & Cells(ligne, 15).Value & "'" & " WHERE NDossier = '" & numdossier & "';" 'bloque sur SQL car "VRAI" ou "FAUX"....
     Cn.Execute strSQL
    Merci pour votre aide,

    A+

    Bon, à force de chercher, j'ai trouvé un code intéressant sur le net, un code qui fonctionne…..Mon souci c'est qu'il copie au même emplacement….je m'explique :

    Classeur A (le classeur où se trouve la macro) si je sélectionne A1:E1 , il ira inscrire en A1:E1 dans le classeur B (destination:classeur fermé)
    Classeur A (le classeur où se trouve la macro) si je sélectionne A5:E5 , il ira inscrire en A5:E5 dans le classeur B (destination:classeur fermé)
    etc…

    En fait il faudrait juste que je puisse faire tourner ce code, mais en déterminant la cellule de destination :

    Classeur A (le classeur où se trouve la macro) si je sélectionne A1:E1 , il faudrait pouvoir inscrire en A20:E20 (par exemple) dans le classeur B (destination:classeur fermé)

    Ci joint le code trouvé sur internet, et merci au créateur
    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
    Sub EcritDatas()
    Dim Fich$, cell As Range
     
      Fich = ThisWorkbook.Path & "\C.xls" '‡ adapter
     
      'Ècrit dans le classeur fermÈ la valeur des cellules A1:E5
      'du classeur actif
      For Each cell In ActiveWorkbook.Sheets("Feuil1").Range("A5:E5")
        SetExternalDatas Fich, "Feuil1", cell.Address(0, 0), cell.Text 'cell.Address(0,0), cell.Text
     
      Next
     
      'Ècrit en A6 la date et l'heure de l'opÈration
      'SetExternalDatas Fich, "Feuil1", "A6", "mise ‡ jour du " & Now
     
      'on regarde le rÈsultat
      DoEvents
      Workbooks.Open Fich
     
    End Sub
     
    'Ècrit DataToWrite dans la cellule DestCellAdr
    'de la feuille DestFeuille du classeur fermÈ DestFile
    Sub SetExternalDatas(DestFile As String, _
                   DestFeuille As String, _
                   DestCellAdr As String, _
                   DataToWrite As Variant)
    Dim oConn As ADODB.Connection
    Dim oCmd As ADODB.Command
    Dim oRS As ADODB.Recordset
    Dim RangeDest
    'd'aprËs Rob Bovey, mpep
     
      ' Open a connection to the Excel spreadsheet
      Set oConn = New ADODB.Connection
      oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & DestFile & ";" & _
               "Extended Properties=""Excel 8.0;HDR=No;"";"
     
      ' Create a command object and set its ActiveConnection
      Set oCmd = New ADODB.Command
      oCmd.ActiveConnection = oConn
     
      ' This SQL statement selects a cell range in the "feuilleTest" worksheet.
      '1 SÈlection pour Ècrire dans une seule cellule
      'DestCellAdr = "A2
      RangeDest = DestCellAdr & ":" & DestCellAdr
      oCmd.CommandText = "SELECT * from `" & DestFeuille & "$" & RangeDest & "`"
    Stop
      ' Open a recordset containing the worksheet data.
      Set oRS = New ADODB.Recordset
      oRS.Open oCmd, , adOpenKeyset, adLockOptimistic
     
      ' Update last row
      oRS(0).Value = DataToWrite
      oRS.Update
     
      'Close the connection
      oConn.Close
      Set oConn = Nothing
      Set oCmd = Nothing
      Set oRS = Nothing
     
    End Sub
    J'ai le sentiment que c'est tout simple…..j'ai fait plusieurs essais : j'ai vu que le "Datatowrite" changeait, j'ai essayé aussi avec "RangeDest", et "cell.Address(0,0)" je pense que c'est là que se situe la solution, mais je ne trouve pas…..

    Merci pour votre aide

    A+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Finalement, après plusieurs essais, j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell(1,1).Address(0, 0)
    et cela fonctionne….

    Pour info, il prend la ligne de référence (A5:E5), donc la ligne 5 comme référence, ainsi si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell(4,1).Address(0, 0)
    , il inscrira dans le classeur B en ligne 8 les valeurs de la plage A5:E5, apparemment comme les ….

    Je pense avoir trouvé ma solution, mais merci de me confirmer si je n'oublie pas un "petit truc" …afin d'éviter les "mauvaises surprises"….

    merci,

    A+

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

Discussions similaires

  1. TIBDataSet comment faire de la mise à jour avec jointure
    Par uluru dans le forum Connexion aux bases de données
    Réponses: 8
    Dernier message: 08/07/2006, 10h09
  2. Mise à jour avec les datasetproviders
    Par kafui dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/06/2006, 14h25
  3. Réponses: 3
    Dernier message: 22/12/2005, 17h47
  4. Mise à jour avec jointure
    Par taupain dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 11h27

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