doublon avec ADO

domb

XLDnaute Nouveau
bonjour à tous,

J'ai trouvé sur le net le code suivant, qui me permet (normalement) de récupérer des données dans des fichiers fermès sans avoir à les ouvrir :

'récupère dans une série de classeurs fermés (dans le même répertoire)
'les valeurs d'une plage et les écrit dans la feuille active

Sub LoopThruFiles()
Dim place As String
Dim FilesArray() As String, FileCounter As Integer
Dim FName As String, LoopCounter As Integer

FName = Dir("H:\Controle de gestion\CHANTIERS\Budgets chantiers\*.XLS")
Do While Len(FName) > 0
FileCounter = FileCounter + 1
ReDim Preserve FilesArray(1 To FileCounter)
FilesArray(FileCounter) = FName
FName = Dir()

Loop
If FileCounter > 0 Then
Application.ScreenUpdating = False
For LoopCounter = 1 To FileCounter

x = LoopCounter
'calcul de la plage de destination
place = Range(Cells((x + 7), 2), Cells((x + 7), 19)).Address
GetValues "H:\Controle de gestion\CHANTIERS\Budgets chantiers", FilesArray(LoopCounter), "Feuil1", "N151:AG151", place
Next
Application.ScreenUpdating = True
End If
End Sub

Sub GetValues(fPath As String, FName As String, sName, _
cellRange As String, place As String)
'recopie une plage des valeurs externes dans une plage de
'la feuille active sous forme d'une formule matricielle
With ActiveSheet.Range(place)
.FormulaArray = "='" & fPath & "\[" & FName & "]" & sName & "'!" & cellRange
.Value = .Value
End With
End Sub

J'ai fait quelques essais sur un fichier, tout va bien.

aujourd'hui j'ai une quinzaine de fichiers dans lesquels je dois récupérer les données et là les ennuis commencent.

J'ai des lignes en doublons comme si il lisait deux fois le fichier mais pas avec les mêmes données, et j'ai des données qui ne remontent pas du tout (case vide ou #divo!)

Est-ce que vous auriez une piste ? ou y a t-il des options à cocher dans l'éditeur VBA ? ou autres...:rolleyes:
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : doublon avec ADO

Bonjour,


Exemple avec SQL:

Code:
Sub RecupTableurSQL() 
  'Microsoft ActiveX DataObject doit être coché
  ChDir ActiveWorkbook.Path
  Dim rs As ADODB.Recordset
  Set cnn = New ADODB.Connection
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & ThisWorkbook.Path & "\" & "ADOsource.xls"
  Set rs = cnn.Execute("SELECT nom,Prenom,Salaire FROM MaBD where nom<>''")
  [A2].CopyFromRecordset rs
End Sub

Pour supprimer les doublons, utiliser GROUP BY

JB
 
Dernière édition:

Jam

XLDnaute Accro
Re : doublon avec ADO

Salut à tous,

J'ai pas testé mais pour ce type de problème j'ai peur que tes variables se marchent dessus d'où les doublons. Et je suis peut-être aveugle mais je ne vois pas de référence à du code ADO dans ton code.

As-tu mis un Option Explicit en début de module ?
Lance ton code en mode pas à pas et vérifie le contenu des variables. Pour cela affiche le volet Variables locales et regarde ce qu'il se passe avec tes variables.

Bon courage,

@BOISGONTIER -> GROUP BY ne supprime pas les doublons mais agrège les données identiques. SELECT DISTINCT permet de ne sélectionner que les données différentes et donc de supprimer les doublons ;)
 

domb

XLDnaute Nouveau
Re : doublon avec ADO

Bonjour jam et boisgontier et à tous et merci pour vos réponses

pour tout vous dire c'est un code que j'ai adapté à mes besoins. Là ou Je l'ai trouvé, il faisait mention d'ADO.

j'ai mis "option explicit" en début de module mais soit cela ne change rien soit j'ai un message "instruction incorrect dans une procédure"

J'ai essayé en pas à pas en affichant le volet variables locales, N'étant pas ultra calé (plutot bidouilleur), je n'ai pas vu de truc bizarre.

Est-ce le code qui est défaillant quelque part ou le code en entier qui n'est pas fiable auquel cas est-il préférable de passer par la proposition de Boisgontier ? et là il va me falloir de l'aide pour l'adapater... :(

dom
 

Jam

XLDnaute Accro
Re : doublon avec ADO

Salut Domb,

J'ai testé ton code, bon à part le x pas déclaré, je n'ai pas de problème à l'exception du fait que j'avais des #REF avec mon premier fichier de test...jusqu'à ce que je l'ouvre pour vérifier son contenu...pas d'idée donc sur ton problème. Par contre je ne mettrais pas le fichier source avec les fichiers de données, car il passerai dans la boucle avec les autres !

Bref, je sèche. dernière hypothèse si tu es sur H: j'imagine que c'est parce que tu es sur u lecteur rézo. Il faudrait peut-être utiliser les nom long (chemin complet du réseau) pour voir si cela ne provient pas de là et que le programme ne va pas chercher ailleurs les données. J'ai testé sur mon rézo et cela a marché correctement.

Bon courage
 
Dernière édition:

Jam

XLDnaute Accro
Re : doublon avec ADO

Salut Domb,

les noms longs (UNC) convention de dénomination de fichiers qui fournit un moyen de situer un fichier quelle que soit la machine où il se trouve. Plutôt que de spécifier une lettre de lecteur et un chemin d'accès, un nom UNC utilise la syntaxe \\serveur\partage\chemin\nom_fichier.extension), au lieu de la lettre d'identification d'une unité réseau mappée dans l'Explorateur Windows de Microsoft

Pour trouver le nom long d'un répertoire réseau tu peux utiliser le code suivant (utilise les API):
Code:
Private Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long

Public Function GetUNCPath(ByVal PathName As String) As String

    Dim sUNCPath As String
    sUNCPath = String(260, 0)
    
    If WNetGetConnection(Left$(PathName, 2), sUNCPath, 260) = 0 Then
    
        sUNCPath = Trim(Left(sUNCPath, InStr(sUNCPath, vbNullChar) - 1))
        sUNCPath = sUNCPath & Mid$(PathName, 3)
        
    End If
    
    GetUNCPath = sUNCPath
    
End Function
Utilisation:
Code:
Dim sCheminUNC as String
sCheminUNC = GetUNCPath("Z:\MonFichier.txt")

Bon courage,
 

Discussions similaires

Réponses
2
Affichages
176

Statistiques des forums

Discussions
312 493
Messages
2 088 959
Membres
103 990
dernier inscrit
lamiadebz