Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Récupération de plages de cellules autre classeur

  • Initiateur de la discussion Initiateur de la discussion Tok-Ra
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

Tok-Ra

Guest
Bonsoir,
Je voudrais aller chercher, via une une feuille excel, des valeurs de plages de cellules dans un classeur sans l'ouvrir.
J'ai vaguement entendu parler de la méthode ADO, mais je n'arrive plus à retrouver le lien qui avait été donné dans un autre fil.
Et puis j'aurais voulu avoir un peu d'aide quand à l'utilisation de cette méthode en commencant par la syntax et les explication de ceci.
Peut etre qu'il y a tout ça dans un lien que j'avais vu mais encore une fois je n'arrive pas à le retrouver.
Merci à vous et bonne nuit 😉
 
Re : Récupération de plages de cellules autre classeur

Bonjour,


Code:
Sub ImportADO()
 'Microsoft ActiveX Data Object doit être coché
 'Le fichier BDSource.XLS contient:
 '
 'Nom     Service
 'Dupont  Etudes
 'Martin  Marketing
 '
 ' Le champ A1:B3 est nommé MaBD
 
  ChDir ActiveWorkbook.Path
  Dim rs As ADODB.Recordset
  Set Cnn = New ADODB.Connection
  Cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=BDSource.XLS"
  Set rs = Cnn.Execute("SELECT nom,service FROM MaBD")
  [A1].CopyFromRecordset rs
End Sub

Code:
Sub LitClasseurFermé()
  ChampOuCopier = "A1:B4"
  Chemin = ThisWorkbook.Path
  Fichier = "BDSource.XLS"
  onglet = "Feuil1"
  ChampAlire = "A1:B3"   ' ou  "MaBD"
  LitChamp ChampOuCopier, Chemin, Fichier, onglet, ChampAlire
End Sub

Sub LitChamp(ChampOuCopier, Chemin, Fichier, onglet, ChampAlire)
  Range(ChampOuCopier).FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & onglet & "'!" & ChampAlire
  Range(ChampOuCopier) = Range(ChampOuCopier).Value
End Sub

Code:
Sub Excel4()
  repertoire = ThisWorkbook.Path & "\"
  classeur = "BDSource.xls"
  i = 1
  Do
   temp = Application.ExecuteExcel4Macro("'" & repertoire & "[" & classeur & "]feuil1'!R" & i & "C1")
   If temp <> 0 Then
     Cells(i, 1) = temp
     Cells(i, 2) = Application.ExecuteExcel4Macro("'" & repertoire & "[" & classeur & "]feuil1'!R" & i & "C2")
     i = i + 1
   End If
  Loop Until temp = 0
End Sub
 
Re : Récupération de plages de cellules autre classeur

Autres exemples:

Récupération dans le tableur
Code:
Sub Essai2()
 '
 ' Nom    Prenom  Salaire
 ' Dupont Jean    4000
 ' Martin Daniel  5000
 ' Campas Pierre  6000
 '
 Set cnn = New ADODB.Connection
 cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
    ThisWorkbook.Path & "\" & "ADOsource2.xls"
 Set rs = cnn.Execute("[A1:C4]")
 [A1:C3] = Application.Transpose(rs.GetRows)
 rs.Close
 cnn.Close
 Set rs = Nothing
 Set cnn = Nothing
End Sub

Récupération dans un tableau
Code:
Sub Essai()
 '
 ' Nom    Prenom  Salaire
 ' Dupont Jean    4000
 ' Martin Daniel  5000
 ' Campas Pierre  6000
 '
 Set cnn = New ADODB.Connection
 cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
    ThisWorkbook.Path & "\" & "ADOsource2.xls"
 Set rs = cnn.Execute("[A1:C4]")
 Tbl = rs.GetRows    ' tableau à 2 dimensions on ne récupère pas la première ligne
 MsgBox Tbl(0, 0)
 MsgBox Tbl(0, 1)
 rs.Close
 cnn.Close
 Set rs = Nothing
 Set cnn = Nothing
End Sub


Formulaire avec ADO
Code:
Private Sub UserForm_Initialize()
 ' Nom    Prenom
 ' Dupont Jean
 ' Martin Daniel
 ' Campas Pierre
 '
 Set cnn = New ADODB.Connection
 cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & _
    ThisWorkbook.Path & "\" & "ADOsource2.xls"
 Set rs = cnn.Execute("[A1:B4]")
 Me.ListBox1.List = Application.Transpose(rs.GetRows)    
 rs.Close
 cnn.Close
 Set rs = Nothing
 Set cnn = Nothing
End Sub

JB
 

Pièces jointes

Re : Récupération de plages de cellules autre classeur

Bonjour le forum !!
Merci pour ces réponses.
Je vais tenter de mettre le nez dedans et je vous tiendrais au courant de ma réussite... ou pas 😉

Bonne journée !
 
Re : Récupération de plages de cellules autre classeur

Bonsoir le forum !
Alors voila, j'ai réussi grace à cette formule:

Code:
Sub LitClasseurFermé()
  ChampOuCopier = "A1:B4"
  Chemin = ThisWorkbook.Path
  Fichier = "BDSource.XLS"
  onglet = "Feuil1"
  ChampAlire = "A1:B3"   ' ou  "MaBD"
  LitChamp ChampOuCopier, Chemin, Fichier, onglet, ChampAlire
End Sub

Sub LitChamp(ChampOuCopier, Chemin, Fichier, onglet, ChampAlire)
  Range(ChampOuCopier).FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & onglet & "'!" & ChampAlire
  Range(ChampOuCopier) = Range(ChampOuCopier).Value
End Sub

Ca marche plutot pas trop mal. Merci BOISGONTIER !!!
Sauf que lorsque j'ai une cellule cible apparement vide, j'ai des 0:00:00 qui viennent se mettre dans mes cellules de destination.
Le format de cellule de destination est heure type hh:mm.
Je vous aurais bien mis un exemple de feuille, mais le classeur fait 1.6 Meg donc si jamais vous comprenez pas, je vous le metterais sur un ftp.

Bonne nuit le forum !!!


EDIT:
Un petit poil de précision.
En fait, je souhaiterais faire comme un copier/collage spéciale "valeur uniquement".
 
Dernière modification par un modérateur:
Re : Récupération de plages de cellules autre classeur

Re-Bonjour le forum !
Je n'ai pas eu de réponses surement car je me suis mal exprimé !
Je me ré-éxplique donc:

La formule cité au dessus marche bien, mais il y a quand même un problème.
Lorsque les cellules "source" sont vides, excel me met des valeurs "0" dans les cellules "destination". Ce qui fait que mes formules de calcul d'heure qui font référence à ces cellules destination ne marchent pas car elle n'aiment pas les 00:00 :'(

Donc si on pouvais utiliser cette méthode tout en "oubliant" les cellules vides, ça serait parfait !

Merci d'avance !
 
Re : Récupération de plages de cellules autre classeur

Bonjour Tok Ra

modifies peut être la dernière procédure comme suit :

Code:
Sub LitChamp(ChampOuCopier, Chemin, Fichier, onglet, ChampAlire)
Dim c As Range
  Range(ChampOuCopier).FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & onglet & "'!" & ChampAlire
  Range(ChampOuCopier) = Range(ChampOuCopier).Value
For Each c In Range(ChampOuCopier)
    If c.Value = 0 Then c.ClearContents
Next c

bonne soirée
@+
 
Re : Récupération de plages de cellules autre classeur

Bonsoir Pierrot !!!
Ta boucle marche superbe ! Elle fait très bien son taff, mais le traitement des données prend 5 fois plus de temps sur un essais de 365 récupération, sachant que je dois le faire au maximum 25 fois.
En gros, 25*365, je crois que excel ne va pas supporter :/
Si vous avez une méthode plus legere, je suis preneur, sinon je prendrais celle de pierrot qui marche bien !!!!

Merci Pierrot et merci le forum 😉
 
Re : Récupération de plages de cellules autre classeur

Bonsoir Tok-Ra, BOISGONTIER, Pierrot93,

Je ne sais pas si ma réponse te conviendra, mais une idée simple pour contourner ton problème sans modifier le code d'origine :
menu Outils / Options / onglet Affichage / Décocher "Valeurs zéro"

Cordialement,
 
Re : Récupération de plages de cellules autre classeur

Re,

les données ainsi récupérées sont sur combien de colonnes ?

@+

Edition : bonsoir Didier, t'avais pas vu...
Re-Edition : en plus tu as tout à fait raison, bravo...
 
Dernière édition:
Re : Récupération de plages de cellules autre classeur

re !
Les données récupérées sont sur trois colonnes et 372 lignes et ce sur 25 onglets.
En fait, le Valeur Zero n'est pas coché ! J'avais déjà cherché de ce coté la.
C'est le code:
Range(ChampOuCopier).FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & onglet & "'!" & ChampAlire
Range(ChampOuCopier) = Range(ChampOuCopier).Value

qui fait que des cellule vide deviennent pleine mais pleine de 0 🙁

Bonsoir MyDear 😉
 
Re : Récupération de plages de cellules autre classeur

Re

essaye peut être en passant par un tableau, comme ci dessous, tu gagneras sans doute en vitesse, en espérant que cela fonctionne :

Code:
Dim t(), i As Integer, j As Integer, k As Integer
t = Range(ChampOuCopier)
For i = LBound(t, 1) To UBound(t, 1)
    For j = LBound(t, 2) To UBound(t, 2)
        For k = LBound(t, 3) To UBound(t, 3)
            If t(i, j, k) = 0 Then t(i, j, k) = ""
        Next k
    Next j
Next i
Range(ChampOuCopier) = t

mais étonnant que la proposition de Didier ne fonctionne pas...

@+
 
Re : Récupération de plages de cellules autre classeur

re !
Alors le code que tu m'a donné bug à ce niveau la:
For k = LBound(t, 3) To UBound(t, 3)

Code erreur 9, l'indice n'appartient pas à la selection !!

Pour te faciliter la tache, je te file le code en entier, à défaut du classeur 🙁

Code:
Sub LitChamp(ChampOuCopier, Chemin, Fichier, onglet, ChampAlire)
  Range(ChampOuCopier).FormulaArray = "='" & Chemin & "\[" & Fichier & "]" & onglet & "'!" & ChampAlire
  Range(ChampOuCopier) = Range(ChampOuCopier).Value
Dim t(), i As Integer, j As Integer, k As Integer
t = Range(ChampOuCopier)
For i = LBound(t, 1) To UBound(t, 1)
    For j = LBound(t, 2) To UBound(t, 2)
        For k = LBound(t, 3) To UBound(t, 3)
            If t(i, j, k) = 0 Then t(i, j, k) = ""
        Next k
    Next j
Next i
Range(ChampOuCopier) = t
End Sub

Sub MAJ_Chr()
'test ADO
  ChampOuCopier = "B6:D372"
  Chemin = "H:\test"
  Fichier = "MAS_Caisse_Centrale.xls"
  onglet = "SAISIE"
  ChampAlire = "E7:G373"   ' ou  "MaBD"
  LitChamp ChampOuCopier, Chemin, Fichier, onglet, ChampAlire

    'Données de CCA
'    Windows("MAS_Caisse_Centrale.xls").Activate
'    Sheets("SAISIE").Select
'    Range("E7:G373").Select
'    Selection.Copy
'    Windows("Calcul pointage.xls").Activate
    Sheets("Christophe").Select
    Range("B6").Select
'    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
'        :=False, Transpose:=False
    Range("B6").Select
End Sub

Ne tient pas compte des lignes avec des ', c'est pour des essais 😉
 
Re : Récupération de plages de cellules autre classeur

Re

essaye comme ceci :

Code:
Dim t(), i As Integer, j As Integer
t = Range(ChampOuCopier)
For i = LBound(t, 1) To UBound(t, 1)
    For j = LBound(t, 2) To UBound(t, 2)
        If t(i, j) = 0 Then t(i, j) = ""
    Next j
Next i
Range(ChampOuCopier) = t

bonne soirée
@+
 
Re : Récupération de plages de cellules autre classeur

Re !
Pierrot, tu es un Dieu !!!!
Milles merci !!!!
Tout marche niquel et je n'ai plus de perte de temps.
Bon bah encore une fois, merci au forum et surtout aux génies excelliens que vous etes.

La suite au prochain épisode 😉
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

D
Réponses
4
Affichages
900
D
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…