FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→VBA→Interaction avec d'autres applications→Applications Office→Excel- 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:=TrueEt 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 FunctionExemple d'utilisation :
Sub test()
MsgBox TestExistenceFeuille("Feuil1", "D:\test.xls")
End SubNotez 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 FunctionQue 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 ifPour 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 SubIl 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.WorkbookNe 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").SelectRemplissage 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 = NothingLien : 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 FunctionEn 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 FunctionCes 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 SubLien : 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,999Lien : Comment lister les onglets d'un fichier Excel sans l'ouvrir ?



