Mise à jour classeur fermé

Bonjour,

J'essaie de comprendre ADO. Les 2 classeurs sont dans le même fichier

Dans les 2 docs joints, le but est de mettre à jourTestModifBase.xlsx depuis SourcesADO.xlsm SI "VRAI" dans colonne G.

J'y suis enfin arrivé pour 2 champs après des heures d'effort .

Dim Fichier As String, Feuille As String, strSQL As String
    Dim Champ1 As Long, Champ2 As Long, Champ3 As Long
    repertoire = ThisWorkbook.Path & "\"
    Fichier = "TestModifBase.xlsx"
    Feuille = "Feuil1"
    Set Cn = New ADODB.Connection
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & repertoire & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    For i = 2 To 350
        If Sheets(1).Cells(i, 7) Then
            Champ1 = CLng(Sheets(1).Cells(i, 1))
            Champ2 = CLng(Sheets(1).Cells(i, 2))
            Champ3 = CLng(Sheets(1).Cells(i, 3))
            strSQL = "UPDATE [" & Feuille & "$] SET " & "New_Loc = " & Champ2 & " , " & "NumMob = " & Champ3 & " WHERE NumEtiq = " & Champ1 & ""
            Cn.Execute strSQL
        End If
    Next i
    Cn.Close
    Set Cn = Nothing

Il n'y aurai pas moyen de mettre à jour toute la ligne en une seule fois plutôt que faire référence 1 à 1 à tous les champs (imaginons un classeur avec 50 colonnes !!!)

Je ne sais pas si c'est possible. Et peut-être en plus qu'il y aurait des problèmes si dans ces 50 colonnes on a des champs date, Vrai/Faux, numériques, texte ... Je ne sais pas

Merci d'avance

7sourceado.xlsm (34.15 Ko)
10testmodifbase.xlsx (23.94 Ko)

Bonjour,

A moins de révolutionner le Sql, je vois pas bien comment ne pas utiliser la liste des champs dans un Update.

Maintenant la chaine de requête est une chaine qu'on peut composer plus facilement. Voici un exemple avec les 3 champs numériques indiqués, mais il serait facile de composer une requête avec 50 champs de la même façon =>

Dim Entete As Variant, T As Variant
Dim i As Integer, j As Integer

    ' blablabla connexion ...

    Entete = Array("NumEtiq", "New_Loc", "NumMob")
    T = Sheets(1).Range(Cells(2, 1), Cells(352, 7)).Value

    For i = 2 To 350
        If T(i + 1, 7) Then
            strSQL = "UPDATE [" & Feuille & "$] SET " '
            For j = 1 To 2
                strSQL = strSQL & Entete(j) & " = " & CLng(T(i - 1, j + 1)) & ", "
            Next j
            strSQL = Left(strSQL, Len(strSQL) - 2) & " WHERE " & Entete(0) & " = " & CLng(T(i - 1, 1))

            cn.Execute strSQL
        End If
    Next i

Pierre

PS : dans la base, il est toujours mieux de grouper les colonnes par types : numériques puis textes, puis dates pour limiter les boucles for j =

Merci

Je vais étudier ça avec attention. Et merci des conseils.

Salutations ,

J'ai aimé l'exemple par Pierrep56 présenté ci-dessus en utilisant le Array("NumEtiq", "New_Loc", "NumMob") .

J'ai essayé d'appliquer le code Pierrep56 dans le fichier provenant de mon collègue boby63, mais je n'ai pas réussi à importer les données .

pourriez-vous s'il vous plaît joindre le fichier fonctionnant déjà avec le code de Pierrep56 .

nota: il n'y avait pas de message d'erreur, il n'a tout simplement pas importé de données .

je te remercie à partir de maintenant .

Bonjour à tous,

@Star : un update est une mise à jour des données et non une lecture.

Pour importer des données, la requête à écrire est un Select,

du genre strSQL = "SELECT * FROM [Feuil1$] WHERE `NumEtiq`=72"

Ensuite il convient de placer le résultat dans un recordset quelconque pour pouvoir l'exploiter dans excel.

(cf mes appli excel en téléchargement sur ce forum pour les exemples de code)

Pierre

Rechercher des sujets similaires à "mise jour classeur ferme"