FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Comment exporter un fichier Excel vers CSV ?
- Comment tester si une feuille Excel existe au sein d'un classeur ?
- Comment piloter Excel depuis Access (exemples d'opérations courantes effectuées sur des cellules, des plages, des lignes ou des colonnes en Excel.) ?
- Comment n'importer que quelques colonnes d'un fichier Excel ?
- Comment forcer Excel à interpréter les données comme du texte lors d'un export vers Excel ?
- Comment exporter le résultat d'une requête sous Excel ?
- Comment envoyer des données Access sur Excel ?
- Comment récupérer le nom du classeur Excel actif ?
- Comment ouvrir un fichier vierge basé sur un modèle et travailler sur cette session d'Excel, puis retourner dans Access ?
- Comment vérifier qu'Excel est installé sur un poste ?
- Comment enregistrer (ou non) les modifications apportées à un classeur Excel, sans demander à l'utilisateur ?
- Comment lister les onglets d'un fichier Excel sans l'ouvrir ?
- Comment modifier la valeur d'une cellule d'un classeur Excel fermé en DAO ?
Depuis Excel 2002, l'export en CSV via VBA prend par défaut une virgule (sauf si on le fait à la main : Fichier/Enregistrer sous/ CSV (séparateur point-virgule)). Pour forcer Excel ou Access à utiliser un point-virgule lors de l'export d'un fichier Excel vers CSV, il faut :
- Vérifier dans les options régionales (panneau de configuration de Windows), onglets Nombres, si le séparateur de liste est bien un point-virgule ;
- Ajouter ceci dans le code : Local:=True pour forcer Excel à utiliser le séparateur configuré sur l'ordinateur utilisé.
Soit :
appXl.ActiveWorkbook.SaveAs
Filename:=
_
"D:\MonFichier.csv"
, FileFormat:=
xlCSV, _
CreateBackup:=
False
, Local:=
True
Et là on a bien des points-virgules comme séparateurs dans le fichier CSV.
Tout d'abord, vous devez ajouter la référence Microsoft Excel X.0 Object Library à votre projet.
Puis dans un module :
Public
Function
TestExistenceFeuille
(
strNomFeuille As
String
, strNomFichier As
String
) As
Boolean
On
Error
GoTo
err
Dim
oAppExcel As
Excel.Application
Dim
oWbk As
Excel.Workbook
Dim
oSht As
Excel.Worksheet
' Lance Excel
Set
oAppExcel =
New
Excel.Application
' Ouvre le classeur
Set
oWbk =
oAppExcel.Workbooks.Open
(
strNomFichier)
' Accède à la feuille
Set
oSht =
oWbk.Sheets
(
strNomFeuille)
TestExistenceFeuille =
True
' Libère les variables et quitte
Set
oSht =
Nothing
oWbk.Close
oAppExcel.Quit
Set
oWbk =
Nothing
Set
oAppExcel =
Nothing
err
:
End
Function
Exemple d'utilisation :
Sub
test
(
)
MsgBox
TestExistenceFeuille
(
"Feuil1"
, "D:\test.xls"
)
End
Sub
Notez que si vous utilisez déjà un objet Excel.Application dans votre code principal, vous pouvez le passer en argument à la fonction afin d'accélérer le traitement. Cela donne :
Public
Function
TestExistenceFeuille
(
strNomFeuille As
String
, strNomFichier As
String
, oAppExcel As
Excel.Application
) As
Boolean
On
Error
GoTo
err
Dim
oWbk As
Excel.Workbook
Dim
oSht As
Excel.Worksheet
' Ouvre le classeur
Set
oWbk =
oAppExcel.Workbooks.Open
(
strNomFichier)
' Accède à la feuille
Set
oSht =
oWbk.Sheets
(
strNomFeuille)
TestExistenceFeuille =
True
' Libère les variables et quitte
Set
oSht =
Nothing
oWbk.Close
Set
oWbk =
Nothing
err
:
End
Function
Que vous utiliserez dans votre code ainsi :
Dim
MonAppli as
Excel.Application
' Ici votre code d'ouverture du fichier, et vos traitements préliminaires
' Appel de la fonction
If
TestExistenceFeuille
(
"Feuil1"
, "D:\test.xls"
,MonAppli) Then
Msgbox
"La feuille existe déjà"
else
Msgbox
"La feuille n'existe pas"
End
if
Pour utiliser ce code, il faut référencer la bibliothèque Excel (VBE : menu Outils/Références).
Private
Sub
DémoPilotageExcel
(
)
Dim
xlApp As
Excel.Application
Dim
xlSheet As
Excel.Worksheet
Dim
xlBook As
Excel.Workbook
Dim
i as
long
Dim
vtemp As
Variant
' Initialiser les variables
Set
xlApp =
CreateObject
(
"Excel.Application"
)
Set
xlBook =
xlApp.Workbooks.Open
(
"C:\Chemin\Feuille.xls"
)
' Ajouter une feuille de calcul nommée Toto
Set
xlSheet =
xlBook.Worksheets.Add
xlSheet.Name
=
"Toto"
' Manipuler une cellule
xlSheet.Cells
(
1
, 1
) =
"je suis dans la ligne1 et colonne1"
' Manipuler une plage
xlSheet.Range
(
"A2:D6"
).Value
=
"Zones A2:D6"
' Remplir la colonne E de la ligne i avec le num de la ligne (i)
For
i =
2
To
6
xlSheet.Cells
(
i, 5
).Value
=
i
Next
' Trier une plage
xlSheet.Range
(
"A2:E6"
).Sort
xlSheet.Columns
(
"E"
), xlDescending
' Trouver une valeur dans une plage
vtemp =
xlSheet.Range
(
"A2:E6"
).Find
(
"2"
).Row
' Trouver une valeur dans une colonne
vtemp =
xlSheet.Columns
(
"E"
).Find
(
"2"
).Row
' Copier une plage vers une destination directement
'xlBook.Worksheets("Feuil1").Range("A1:E3").Copy Destination:=xlBook.Worksheets _
'("C:\Chemin\FeuilleDestination.xls").Range("A1:E3")
' Copier une plage
xlSheet.Range
(
"A"
&
vtemp &
":E"
&
vtemp).Copy
' Coller les valeurs
xlSheet.Paste
Destination:=
xlSheet.Range
(
"A8:E8"
)
' Supprimer une plage
' Si l'on supprime une ligne alors cela remonte les lignes
'xlSheet.Range("A" & vtemp & ":E" & vtemp).Delete
' Supprimer une ligne
xlSheet.Rows
(
vtemp).Delete
' Insertion d'une ligne
xlSheet.Range
(
"A"
&
i &
":H"
&
i).EntireRow.Insert
Shift:=
xlShiftDown
' Code de fermeture
xlBook.Save
xlApp.Quit
Set
xlSheet =
Nothing
Set
xlBook =
Nothing
Set
xlApp =
Nothing
MsgBox
"Fin de la procédure. :)"
End
Sub
Il est possible de faire une table qui a les mêmes noms de champs que dans Excel. Lors de l'import dans la table ainsi créée, Access n'importera que les champs de la table. Si les noms de champs ne sont pas spécifiés dans Excel, il ne sera pas possible de n'importer que quelques colonnes d'une plage, mais on peut délimiter la plage à importer comme ceci :
DoCmd.TransferSpreadsheet
acImport, 8
, "Employés"
,"C:\Fichier.xls"
, True
, "A1:G12"
Par contre, l'import d'un fichier texte permet de spécifier de nombreux attributs pour chaque colonne à importer (nom, type, sauter ou pas, ...). Il est même possible d'enregistrer les spécifications d'import en suivant la technique suivante : exécuter l'importation à l'aide de l'assistant et avant de cliquer sur "TERMINER", cliquer sur le petit bouton en bas à gauche "AVANCE ..." afin de définir et sauvegarder les spécifications d'import... Pour importer des colonnes non contiguës d'une plage d'un fichier Excel, vous pouvez donc passer par l'enregistrement du fichier Excel dans un des formats texte (csv, txt...).
Dans Excel, préfixez les valeurs numériques d'un '.
Cela convertira les données numériques en données texte.
On passe ici par une requête temporaire, mais on peut également exporter une requête existante bien évidemment.
Dim
qd As
QueryDef
Set
qd =
CurrentDb.CreateQueryDef
(
"Requete_Temporaire"
, "Select * From MATABLE"
)
DoCmd.TransferSpreadsheet
acExport, acSpreadsheetTypeExcel97,"Requete_Temporaire"
, "c:\fichier.xls"
DoCmd.DeleteObject
acQuery,"Requete_Temporaire"
Il faut que la bibliothèque Microsoft DAO soit cochée (dans un module faites Outils / Références).
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Déclaration :
Dim
appexcel as
Excel.Application
Dim
wbexcel as
Excel.Workbook
Ne pas oublier de cocher dans le menu Outil/Références, la bibliothèque Microsoft Excel X Object Library (avec x = 8 pour Excel 97, x = 9 pour Excel 2000, x = 10 pour Excel XP, x = 11 pour Excel 2003).
Appel du fichier Excel :
Set
appexcel =
CreateObject
(
"Excel.Application"
)
appexcel.Visible
=
True
Set
wbexcel =
appexcel.Workbooks.Open
(
"Chemin du fichier Excel"
)
Appel de la feuille correspondante :
appexcel.Sheets
(
"Feuil1"
).Select
Remplissage dans Excel (exemple à partir d'une requête), sur des cellules bien précises.
appexcel.cells
(
5
, 2
) =
rst![Nomduchamp]
appexcel.cells
(
5
, 4
) =
rst![Nomduchamp]
appexcel.cells
(
5
, 7
) =
rst![Nomduchamp]
Attention la cellule (5,2) correspond à la cellule B5 d'Excel.
La fonction rst correspond à un enregistrement Recordset.
Dim
XLApp As
Object
Set
XLApp =
GetObject
(
,"Excel.Application"
)
MsgBox
""
&
XLApp.ActiveWorkbook.Name
&
""
On
Error
Resume
Next
Set
xlApp =
GetObject
(
, "Excel.application"
)
If
Err
=
ERR_NOT_RUNNING Then
Err
.Clear
Set
xlApp =
CreateObject
(
"Excel.application"
)
End
If
Set
xlWkb =
xlApp.Workbooks.Add
(
"\\monDossier\MonFichier.xlt"
) ' Chemin du fichier
'
' Ici nous lançons les macros automatiques d'Excel mais vous pouvez mettre du code
'
xlWkb.RunAutoMacros
xlAutoOpen
xlApp.Visible
=
True
Set
xlWkb =
Nothing
Set
xlApp =
Nothing
Lien : Pourquoi une erreur 429 : « Un composant ActiveX ne peut créer d'objet » ?
Voici deux fonctions permettant d'arriver à vos fins.
En utilisant un appel automation :
Public
Function
TestExcel
(
) as
boolean
On
error
goto
err
Dim
oTmp as
Object
Set
oTmp=
CreateObject
(
"Excel.Application"
)
Set
oTmp=
Nothing
TestExcel=
True
err
:
End
Function
En vérifiant le registre :
Public
Function
TestExcel2
(
) As
Boolean
Dim
lngR As
Long
TestExcel2 =
RegOpenKey
(
HKEY_LOCAL_MACHINE, "Software\Microsoft\Office\Excel"
, lngR) =
0
End
Function
Ces deux fonctions renverront True si MS Excel est installé sur le poste.
Soit xlBook un classeur :
xlBook.Close
(
True
) ' On dit qu'on enregistre les modifications du fichier
xlBook.Close
(
False
) ' Pour ne pas enregistrer les modifications
Ce code permet de lister les onglets d'un fichier Excel sans l'ouvrir.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Sub
GetDAOExcelTabs
(
ByVal
strPath As
String
)
Dim
db As
DAO.Database
Dim
td As
DAO.TableDef
Set
db =
DAO.OpenDatabase
(
strPath, False
, True
, "Excel 8.0;"
)
DoEvents
For
Each
td In
db.TableDefs
Debug.Print
"onglet : "
&
td.Name
Next
td
db.Close
Set
td =
Nothing
Set
db =
Nothing
End
Sub
Lien : Comment modifier la valeur d'une cellule d'un classeur Excel fermé en DAO ?
Il faut ajouter la référence : Microsoft DAO 3.x Object Library.
Sub
DAOUpdateExcelFile
(
ByVal
strFullPath As
String
, _
ByVal
strTab As
String
, _
ByVal
RowIndex As
Long
, _
ByVal
ColumnIndex As
Long
, _
ByVal
setValue As
Variant
)
' Ajoutez la référence DAO
Dim
db As
DAO.Database
Dim
rec As
DAO.Recordset
' On ouvre le fichier Excel en tant que base de données DAO
Set
db =
OpenDatabase
(
strFullPath, False
, False
, "Excel 8.0;"
)
DoEvents
' On ouvre un Recordset sur un onglet comme on le ferait
' sur une table Access
' En DAO, les tables sont les onglets avec un $ final
Set
rec =
db.OpenRecordset
(
strTab &
"$"
, DAO.dbOpenDynaset
)
' On se déplace sur l'enregistrement souhaité
rec.Move
RowIndex -
1
' On édite l'enregistrement
rec.Edit
rec.Fields
(
ColumnIndex -
1
).Value
=
setValue
rec.Update
' On sauvegarde
' Fermez les objets
rec.Close
db.Close
' Libérez les objets !
Set
db =
Nothing
Set
rec =
Nothing
End
Sub
Un exemple qui permet de passer la valeur de la cellule E12 de l'onglet "Feuil1" à 999 :
DAOUpdateExcelFile "c:\temp\db.xls"
,"Feuil1"
,12
,5
,999
Lien : Comment lister les onglets d'un fichier Excel sans l'ouvrir ?