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
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
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