Utiliser un fichier exel sans l'ouvrir VB

vacilis Messages postés 5 Statut Membre -  
michel_m Messages postés 18903 Statut Contributeur -
Bonjour,

Je reprends le code de quelqu'un, je dois l'omptimiser. On utilise une grande quantitée de fichier excel qui servent à effectuer des calculs . Le problème est qu'à chaque utilisation d'un fichier il est affiché ( une feuille excel apparaît). Il disparait une fois qu'il a finit d'être utilisé mais cela ralenti les calculs et bloque le pc pendant ce temps. Le bout de code pour ouvrir le fichier est :


If toto = tata Then
pathname = pathinit & "\titi.xlsx"
Workbooks.Open pathname
Sheets(Phase).Select
End If

J'ai essayé de placer un opendata mais je n'arrive pas à le faire fonctionner .

Merci.
A voir également:

6 réponses

Ran2
 
J'ai pas fait de VBA depuis des siècles mais essai de remplacer :

Workbooks.Open pathname
Sheets(Phase).Select
par un truc du genre (pas sur que ça marche XD)
Workbooks("file.xls").Worksheets("Sheet1").select

Sinon pour activer une feuille y'a ça qui marche :
Workbooks("file.xls").Worksheets("Sheet1").Activate

puis comme c'est la feuille active, tu en fait ce que tu veux...

Sinon cherche là dedans : https://docs.microsoft.com/fr-fr/welcome-to-docs
0
vacilis Messages postés 5 Statut Membre
 
Merci pour la réponse rapide !

Les lignes de code ci dessus ne fonctionnent pas pour mon projet. Cependant j'ai trouvé une astuce pour ne plus lui demander d'ouvrir la feuille. Cependant , il me faut tout de même activer le workbook et là je suis encore coincé.

Merci de me consacrer un peu de temps.

ps j'ai regardé sur le lien fournit mais mon problème n'est pas dans l'aide ni dans les forums.
0
michel_m Messages postés 18903 Statut Contributeur 3 318
 
Bonjour,

la méthode à utiliser est d'aller chercher les données sans ouvrir les classeurs sous certaines conditions

si tu as peu de données à chercher dans chaque classeur tu pourrais utiliser la macro dite de Walkenbach
voici un exemple
Range("E9") = ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R7C4")
renvoie dans E9 la valeur de D7 (R7C4)
démo:
https://www.cjoint.com/?mookudu5Zv

Autrement, tu as la méthode ADO: il faut que les zones sources soient sous forme de bases de données
ci joint petite démo basique
https://www.cjoint.com/?mooaiLOsGF

de toutes façons, évite d'utiliser select-selection ainsi que copy-paste
tu iras beaucoup + vite en insérant cette ligne au départ
application.screenupdating=false qui fige le défilement de l'écran (temps divisé par 10)

0
vacilis Messages postés 5 Statut Membre
 
Ca marche nikel ! Merci beaucoup !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
inthes Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   6
 
Bonjour,
je dois faire une application sous VB Excel, à chaque utilisation de cette application necessitera l'utilisation d'un nouveau fichier excel toujours avec le même mais pas le même contenu. Ce fichier à toujours 36 colonnes par contreles lignes peuvent aller jusqu'a 4000. Je ne peux pas contourner ce contraintes: utilisation de excel pour faire l'application. Comment puis je faire pour exploiter ce fichier sans l'ouvrir.
Merci de votre collaboration.
0
michel_m Messages postés 18903 Statut Contributeur 3 318
 
Bonjour,

Il manque beaucoup de renseignements dans ta demande notamment dans la restitution dans ton classeur cible: feuille, emplacement de la restitution, compilation ou non des précédentes extractions...
macro ci dessous non testée sous XL<2007
si difficultés mettre un extrait du classeur source

Const Camin As String = "D:\ledossierdufichier"  'CONSTANTES A ADAPTER  AU CLASSEURSOURCE
Const Fichier As String = "monfichier.xls"
Const onglet As String = "Feuil1"
Const plage As String = "A1:AH4500"

Sub extraire()
Dim Source As Object, Requete As Object
Dim Col As String, Lig As Byte
Dim Texte_SQL As String


onglet = onglet & "$" ' le $ est obligatoire après le nom de l'onglet

'connexion ADO au fichier mensuel désigné par etape (1 à 255)
Set Source = CreateObject("ADODB.Connection")
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Camin & "\" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
    
     'exerce la requete ADO sur la donnée à recopier
    Texte_SQL = "SELECT * FROM [" & onglet & plage & "]"
    Set Requete = CreateObject("ADODB.Recordset")
    Set Requete = Source.Execute(Texte_SQL)
    
 'restitue sur le classeur récap
    Cells(2, "A").CopyFromRecordset Requete 'A ADAPTER AU CLASSEUR CIBLE
    
End Sub
0
Vacilis
 
Mets :
Application.ScreenUpdating = False
en début de code et ta macro tournera plus vite
0
michel_m Messages postés 18903 Statut Contributeur 3 318
 
relire le lien #3....
0