Base Donnée ouvert par Excel et VB

Signaler
Messages postés
110
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
110
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
11 mars 2010
-
Allo...

J'utilise une base de donnée qui est ouverte a la fois par Excel et VB. Mon problème est que je ne sais pas comment couper la connexion a ma BD en Excel.

Car VB ouvre ma BD, par la suite c'est Excel pour retourner vers VB. Toutefois, quand j'essai de retourner vers VB il me marque un message d'erreur car la BD est déja ouverte. Mais une fois que j'ai importé mes données dans excel, j'ai pu besoin du lien mais je dois garder Excel ouvert.

Quoi faire a part sauvegarder le fichier et le ré-ouvrir???

Merci

6 réponses

Messages postés
114
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
17 novembre 2014

Si tu donnait un peu + d'info peut être qu'on pourrait t'aider.
Quelle est cette base de donnée qui n'accepte qu'une seule connexion (Access ?).
Quelle méthode est utilisée pour lier Excel et la base ?

--------------------
Skrol 29
www.skrol29.com
--------------------
0
Messages postés
110
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
11 mars 2010
1
Allo... je me débrouille pas si mal en C++ mais je commence en VB la... Alors, je ne connais pas encore tout les termes!

Mon programme VB utilise un controleur ADO pour ouvrir une base de donnée ACCESS...

Voici la déclaration de l'ouverture qui plante...
message d'erreur: Couldn't use "; file already in use.

Cat.ActiveConnection = "provider=microsoft.jet.oledb.3.51;" & "Data source =" & link & ";"

ou link= le chemin d'acces et Private Cat As New ADOX.Catalog

c'est ici que ca plante...

par la suite, j'active les tables comme ca:

cmdado.ActiveConnection = Cat.ActiveConnection
cmdado.CommandText = " select * from Project"

rsProject.CursorLocation = adUseClient
rsProject.CursorType = adOpenDynamic
rsProject.LockType = adLockOptimistic
rsProject.Open cmdado

Private cmdado As New ADODB.command
Private rsProject As New ADODB.Recordset

Pour lire excel... je fais l'équivalent de cliquer sur: Données, Données Externes, Importer des données... (cette fonction n'est pas valide en Excel97...)

Voici ce qu'il fait...
project.pname=== chemin d'acces de ma BD

Dim Excel97 as Excel.application

With excel97.Application.ActiveWorkbook
.Sheets.Add
.ActiveSheet.Name = "All Class"
With .Sheets("All Class")


With .QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:" & Project.pName & ";Mode=Share Deny Write;Extended Properti" _
, _
"es="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=4;Jet OLEDB:D" _
, _
"atabase Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=" _
, _
""""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLED" _
, "B:Compact Without Replica Repair=False;Jet OLEDB:SFP=False"), Destination:= _
Range("C5"))
.CommandType = xlCmdTable
.CommandText = Array("Data")
.Name = Project.pName
.FieldNames = False
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = Project.pPath & Project.pName
.Refresh BackgroundQuery:=False
End With
end with

Voila, j'espère avoir été clair...
0
Messages postés
114
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
17 novembre 2014

Ton problème vient du fait que Access n'est pas client/serveur. Il est obligé de gérer le multi-utilisateur par des vérrous de fichier.

Je vois 2 moyens pour te dépatouiler :

1/ modifier la chaîne de connexion Excel pour spécifier une lecture seule. Y'a des paramètres pour ça mais je sais plus lequel 'sorry).

2/ + propre : supprime le code généré par Excel et pilote le transfert de données en pilotant Excel depuis ton prog VB (avec OLE).

Explications : Excel utilise une connexion spéciale qui est ouverte et maintenue tant que le classeur est ouvert. C'est pratique pour un utilisateur neuneu, mais crée des complications pour les programmeurs.
Sous VB, tu peux créer une instance du moteur Excel (voir CreateObject), et piloter Excel avec un nouveau classeur ou un classeur déjà existante, exactement comme le faisait le code sous Excel. C'est le même language. Quand le job est fini, tu détruit l'instance.

--------------------
Skrol 29
www.skrol29.com
--------------------
0
Messages postés
110
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
11 mars 2010
1
Allo...

CE que tu me parle, avec le OLE... c'est d'ajouter une feuille excel dans une de mes forms...

Si c'est ca, ca cause un petit probleme car mon but est de convertir ma base de donné en fichier Excel pour faire plein de calculs et de stat et de tracer des graphs...

Alors, je ne peux pas vraiment ne pas utiliser excel dans toute sa puissance! C'est qu'il calcul pas mal plus vite que si je le ferais faire par mon programme par ailleurs.

Bye!
0
Messages postés
114
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
17 novembre 2014

>CE que tu me parle, avec le OLE... c'est d'ajouter >une feuille excel dans une de mes forms...

Non, non. Pas de l'OLE incorporée. Pas de feuille Excel dans tes forms. Beark caca.

Il s'agit de l'instruction
AppExcel = CreateObject("excel.application")

Tu peux aussi ajouter la Référence 'Microsoft Excel' à ton project, et le code suivant dans ta proc :
Dim AppExcel as Excel.Application
...
Set AppExcel = New Excel.Application 'charge Excel
...
Set AppExcel = Nothing 'décharge Excel

En ajoutant la référence, c'est + facile à programmer car l'environnement de prog te liste des propritétés et méthode d'Excel.

Maintenant, ta variable AppExcel contient un instance de la classe Excel entière. C'est à dire que tu peux faire depuis ton appli tout ce que tu faisait sous Excel, exctement de la même manière.
Par exemple :
AppExcel.ActiveWorkbook.Sheets.Add

Il te reste à remplir les cellules une par une.

Ha oui au fait : les graph existent aussi déjà sous Access. Ce sont les mêmes graph que sous Excel.
C'est peut être + simple.

--------------------
Skrol 29
www.skrol29.com
--------------------
0
Messages postés
110
Date d'inscription
jeudi 9 mai 2002
Statut
Membre
Dernière intervention
11 mars 2010
1
C'est exactement de cette facon que je procède...

Au départ, j'ouvrais ma BD avec VB et je copiais les infos dans excel mais je me suis rendu compte que c'était beaucoup plus rapide (1min de moins) d'ouvrir la BD avec Excel meme si j'avais a interchanger des colonnes.

Faire une boucle qui parcours ma BD et qui acceder a mes recordset étais tres lent... 1min environ. Maintenant, j'importe mes données et je fais tout mes traitements en 45sec... Alors, le gain de temps est énorme!
0