Recherche dans fichier fermé entre 2 valeurs et copie des données

Pierre31

XLDnaute Junior
Bonjour à toutes et tous,

Par VBA et éventuellement par ADO je souhaite pouvoir copier dans le classeur ouvert "Ouvert.xls" les données des cellules de A(i) à (M(i) du fichier fermé "Fermé.xls" si dans ce fichier la cellule M(i) = > à 4500 ou M(i) =< à 5200. Le collage de la première donnée dans le fichier "Fermé.xls" commence à la cellule "A20".

D'avance merci pour vos réponses.

Cordialement
Pierre
 

Pierre31

XLDnaute Junior
Bonjour à toutes et tous,

Éventuellement est ce que je peux faire une boucle dans ADO du nombre de fois (5200-4500) et chercher dans le fichier fermé la valeur 4500 + numéro d'itération, copier les cellules de A à M qui correspondent à l'adresse si la valeur est trouvée et ce jusqu'à 5200.

Cordialement
Pierre
 

Pierre31

XLDnaute Junior
Re bonjour à toutes et tous,

Est ce que avec cette procédure je peux vérifier que la donnée de chaque cellule est égale ou supérieure par exemple à 4500.

Private Sub RechVal_Click()

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 = "M2:M60000"
'Pour une plage de cellules, utilisez:
'Cellule = "A4:C10"

Feuille = "Liste$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
'Chemin complet du classeur fermé
Fichier = "E:\Sous-Traitance\Sitia\GMAO\Budget\Facturation\Recap_Couts_Maint.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
Else
End If


Rst.Close
Source.Close
Set Source = Nothing
Set Rst = Nothing
Set ADOCommand = Nothing

End Sub

Cordialement
Pierre
 

YANN-56

XLDnaute Barbatruc
Re : Recherche dans fichier fermé entre 2 valeurs et copie des données

Bonjour Pierre, Michel, et à ceux qui passeront par ici,

Si tu es en réseau, et que la méthode ADO est indispensable pour éviter des télescopages: O.K.

Sinon, je te conseille d'éviter,
car il peut y avoir des surprises en cas de mauvaise configuration de la page Source!
(Je l'ai beaucoup testé à mes dépends)

Hormis ce point, puisque ADO peut te copier correctement les données,
je pense qu'il ne reste qu'à imaginer le travail à faire avec dans le Classeur maître.
(Voire à se satisfaire d'une copie traditionnelle de cette page source)

Là je soupçonne que tu saches le faire,

Amicalement, et au besoin si tu coinces quelque part

Yann

P.S. Salut Michel :) :) :) Heureux de te croiser.
 

Pierre31

XLDnaute Junior
Bonjour Michel et Yann,

Tout d'abord merci Michel pour la solution MS Query à laquelle je n'avais pas pensé alors que j'ai eu l'occasion de l'utiliser il y a quelques années. Je travaille en réseau et effectivement cette solution nécessite comme le souligne Yann d'avoir un fichier source, dont là structure reste bien figée. La solution qui consiste à copier toute la base du fichier fermé (je l'utilise aussi dans d'autres cas) suivi de manipulations en local sur le fichier ouvert est intéressante, mais lorsque le nombre de lignes atteint les 5 à 6000 sur 14 colonnes c'est un peu lourd.
Je regarde à nouveau tout cela de près et j'opterais pour l'une ou l'autre des solutions, sachant que dans les deux cas je serais débloqué.

Bonne journée
Cordialement
Pierre
 

Pierre31

XLDnaute Junior
Bonjour à toutes et tous,

Dans la procédure ci dessous (MS_Query) comment remplacer les nombres 40500 et 41000 par les variables ValDeb pour la première valeur et ValFin pour la seconde valeur ceci afin de lancer la procédure à partir d'un bouton de la feuille de calcul après avoir saisi les valeurs dans les champs "deb" et "fin". J'ai essayé de mettre les variables directement à la place des nombres dans la procédure mais j'ai chaque fois un message d'erreur de syntaxe.


ValDeb = CDbl(Range("deb"))
ValFin = CDbl(Range("Fin"))


With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=Fichiers Excel;DBQ=E:\Sous-Traitance\Sitia\GMAO\Budget\Facturation\Recap_Couts_Maint.xls;DefaultDir=E:\Sous-Traitance\Sitia" _
), Array( _
"\GMAO\Budget\Facturation;DriverId=790;MaxBufferSize=2048;PageTimeout=5;")), _
Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Histo.Date, Histo.`N°_OT`, Histo.ATL, Histo.C_C, Histo.Type_TRX, Histo.MO_Meca, Histo.Coeff_Meca, Histo.MO_Elect, Histo.Coeff_Elec, Histo.MO_Autre, Histo.Coeff_Autre, Histo.Mont_Tot_Fournit, Hi" _
, _
"sto.Date_Num" & Chr(13) & "" & Chr(10) & "FROM Histo Histo" & Chr(13) & "" & Chr(10) & "WHERE (Histo.Date_Num>=40500 And Histo.Date_Num<=41000)" & Chr(13) & "" & Chr(10) & "ORDER BY Histo.Date_Num, Histo.`N°_OT`")
.Name = "Lancer la requête à partir de Fichiers Excel_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub


Cordialement
Pierre
 

Pierre31

XLDnaute Junior
Bonjour à toutes et tous,

Ne trouvant pas de solution avec MS_Query je me rabat sur ADO mais là encore je n'arrive pas à passer dans une variable la valeur à rechercher

Sub Extrac_ADO()
'
' Extrac Macro
' Macro enregistrée le 31/05/2011 par ADMIN
'


ValDeb = Range("Deb")
répertoire = ThisWorkbook.Path & "\"
Dim rs As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & répertoire & "Recap_Couts_Maint.xls"
Set rs = cnn.Execute("SELECT N°_OT,Mont_Tot_Fournit,Date_Num FROM Histo where Date_Num >40700 ")
[G2].CopyFromRecordset rs
'
End Sub

A la place de la valeur 40700 je voudrais mettre la variable ValDeb mais celà me provoque une erreur

D'avance merci pour vos réponses.

Cordialement
Pierre
 

Pierre31

XLDnaute Junior
Re bonjour,

J'ai enfin trouvé:

Set rs = cnn.Execute("SELECT N°_OT,Mont_Tot_Fournit,Date_Num FROM Histo where Date_Num >=" & ValDeb & "And Date_Num <=" & ValFin)

Ce qui me permet de récupérer la valeur des variables ValDeb et ValFin à partir des valeurs contenues dans les cellules de la feuille

Cordialement
Pierre
 

Discussions similaires

Statistiques des forums

Discussions
312 427
Messages
2 088 302
Membres
103 812
dernier inscrit
klcrabi