Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/08/2011, 16h41   #1
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Par défaut Récupérer des informations d'un autre classeur sans l'ouvrir

Bonjour,

Je souhaite récupérer des informations dans plusieurs classeurs. Mon problème est qu'actuellement, j'ouvre mon classeur (l'ouverture de ce fichier prend un certain temps), je récupère les informations et je referme le fichier.

Existe-t-il un moyen de récupérer les information d'un fichier excel sans ouvrir son interface graphique?

Code actuel:
Code :
1
2
3
4
5
6
7
8
    Dim objWorkbookmain As Workbook, objWorkbook1 As Workbook
    Dim chemin As String
 
    Set objWorkbookmain = Application.ActiveWorkbook
    chemin = objWorkbookmain.Path
    Set objWorkbook1 = Application.Workbooks.Open(chemin & "\1.xls")
    objWorkbookmain.Sheets(1).Cells(1, 1) = objWorkbook1.Sheets(1).Cells(1, 1)
    objWorkbook1.Close
L'idée est de revoir la lignes 6. J'ai aussi essayé avec .Add mais le résultat est semblable.

Merci d'avance

Manu
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 17h09   #2
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Voilà une piste. Exécute la proc "Test" en adaptant les valeurs. Attention, dans une même colonne les valeurs doivent être de même nature (string avec string ou long avec long, etc...) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
Sub ConnectCLasseur(ConnectCL As Object, _
                    Fichier As String, _
                    Optional Rs)
 
    Set ConnectCL = CreateObject("ADODB.Connection")
 
    If Not IsMissing(Rs) Then
        Set Rs = CreateObject("ADODB.Recordset")
    End If
 
    'HDR > YES ou NO; entêtes de colonnes
    'IMEX > 1 lecture seule, 2 lecture/écriture
    ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Fichier & ";" & _
              "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 1;"""
 
End Sub
 
Function RecupValeur(Classeur As String, _
                     NomFeuille As String, _
                     Cellule As String) As Variant()
 
    Dim ConnectCL As Object
    Dim Rs As Object
    Dim Champ As Object
    Dim Tbl() As Variant
    Dim I As Integer
 
    'connecxion
    ConnectCLasseur ConnectCL, Classeur, Rs
    'lecture
    With Rs
        .CursorType = 1
        .LockType = 3
        .Open "SELECT * FROM `" & NomFeuille & "$" & _
        Cellule & "` ", ConnectCL
 
        Do Until .EOF
 
            For Each Champ In .Fields
 
                I = I + 1
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = Champ.Value
 
            Next
 
            .MoveNext
 
        Loop
 
        'ValeurCellule = .Fields(0).Value
 
    End With
 
    ConnectCL.Close
 
    RecupValeur = Tbl
 
    Set Rs = Nothing
    Set ConnectCL = Nothing
    Set Champ = Nothing
 
End Function
 
 
Sub Test()
 
    Dim Retour() As Variant
    Dim I As Integer
 
    Retour = RecupValeur("D:\Classeur.xls", _
                        "Feuil1", _
                        "B1:C22")
 
 
    For I = 1 To UBound(Retour)
        Debug.Print Retour(I)
    Next I
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2011, 18h37   #3
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
J'ai malheureusement quelques colonnes dans lesquelles on retrouve du String et du Long.

J'ai tout de même une petite idée pour bidouiller le code pour extraire les informations quelque-soit le type d'information (qu'il soit en Long ou en String). Mais avant cela, je crois que je vais avoir besoin de relire quelques tutos sur MySQL.

Si ça intéresse quelqu'un je posterai mon code... Si j'y arrive...

En tout cas merci bien Theze.
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 19h53   #4
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 619
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 619
Points : 30 959
Points : 30 959
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Quelques informations complémentaires : Lire et écrire dans les classeurs fermés

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2011, 22h03   #5
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Merci, pour les informations Philippe. Je me permets donc de corriger le code de Theze. (voir ligne 15)
Attention! Le résultat de ces fonctions ne renvoie que des variables de type String.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Sub ConnectCLasseur(ConnectCL As Object, _
                    Fichier As String, _
                    Optional Rs)
 
    Set ConnectCL = CreateObject("ADODB.Connection")
 
    If Not IsMissing(Rs) Then
        Set Rs = CreateObject("ADODB.Recordset")
    End If
 
    'HDR > YES ou NO; entêtes de colonnes
    'IMEX > 1 lecture seule, 2 lecture/écriture
    ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & Fichier & ";" & _
              "Extended Properties=""Excel 8.0;HDR=NO;IMEX=1;"""
 
              ' ############ Ligne à l'origine ############
              '"Extended Properties=""Excel 8.0;HDR=NO;IMEX= 1;"""
              ' C'est juste l'espace entre le 'IMEX=' et le '1;' qui est en trop 
End Sub
 
Function RecupValeur(Classeur As String, _
                     NomFeuille As String, _
                     Cellule As String) As Variant()
 
    Dim ConnectCL As Object
    Dim Rs As Object
    Dim Champ As Object
    Dim Tbl() As Variant
    Dim I As Integer
 
    'connecxion
    ConnectCLasseur ConnectCL, Classeur, Rs
    'lecture
    With Rs
        .CursorType = 1
        .LockType = 3
        .Open "SELECT * FROM `" & NomFeuille & "$" & _
        Cellule & "` ", ConnectCL
 
        Do Until .EOF
 
            For Each Champ In .Fields
 
                I = I + 1
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = Champ.Value
 
            Next
 
            .MoveNext
 
        Loop
 
        'ValeurCellule = .Fields(0).Value
 
    End With
 
    ConnectCL.Close
 
    RecupValeur = Tbl
 
    Set Rs = Nothing
    Set ConnectCL = Nothing
    Set Champ = Nothing
 
End Function
 
 
Sub Test()
 
    Dim Retour() As Variant
    Dim I As Integer
 
    Retour = RecupValeur("D:\Classeur.xls", _
                        "Feuil1", _
                        "B1:C22")
 
 
    For I = 1 To UBound(Retour)
        Debug.Print Retour(I)
    Next I
 
End Sub
Et voilà, ça fonctionne...
Merci Theze et Philippe.
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h45.


 
 
 
 
Partenaires

Hébergement Web