Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

IMPORTER UNE FEUILLE EXCEL VERS UNE TABLE ACCESS EXISTANTE


Information sur la source

Catégorie :Base de Donnees Classé sous : import, excel, access, export, ado Niveau : Initié Date de création : 21/02/2007 Date de mise à jour : 16/03/2007 09:34:07 Vu : 25 172

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note


Description

Le code est suffisemment adaptable pour pouvoir repérer le début et la fin de la table dans une feuille, pour pouvoir retrouver l'ordre des champs même s'il n'est pas identique dans la feuille Excel ou même s'ils n'y sont pas tous.
Si la table Access est bien définie, les champs NOT NULL (null non autorisés) ont tous une valeur par défaut, donc s'il manque un une colonne dans Excel ça ne porte pas à conséquence. Dans le cas contraire ça peut faire planter le code donc veillez à bien définir vos tables Access ou alors fournir un fichier Excel à importer qui soit nikel.

Le code est séparé en plusieurs fonctions indépendantes:
La 1ere fonction (maitre) fait l'importation dans la table du fichier excel fourni en argument, et renvoie le nombre de lignes insérés. Il est facile de monter en 2nd argument le nom de la table source (ici "VEILLE" en dur dans cette fonction)

La 2eme fonction (GetFields) récupère la liste des champs d'une table dans un tableau

La 3eme fonction vérifie l'existence d'une clé dans une collection (!) (pas trouvé ça en natif dans le langage!)

La 4eme (look_in_array) recherche une valeur (Lookup) dans un tableau (in_array), renvoie la position (dans Position) si trouvé, et True (false sinon)

La 5eme fonction (GetExcelLine) lit une ligne complète du fichier Excel

La 6eme (GenererTableauInsertion) transforme cette ligne en un tableau à insérer dans la table

la 7eme (RetrouverChampsExcel) permet d'obtenir la correspondance champs Excel/champs table Access pour la génération du tableau précédent

La 8eme enfin (FN_INSERT) est un INSERT par méthode ADO qui permet d'avoir un msg d'erreur précis (si une colonne n'a pas le bon type, n'est pas renseigné...) et de récupérer l'id de la ligne insérée si besoin (pas besoin ici)




 

Source

  • ' IMPORTER un modèle excel dans la table VEILLE
  • Public Function ImportExcelVeille(ByVal Filename As String) As Boolean
  • ' objets OLE automation EXCEL
  • Dim appExcel As Excel.Application
  • Dim wbk As Excel.Workbook, wsht As Excel.Worksheet
  • ' Id_veille en cours (la clé primaire de la table), compte nb de lignes insérés, erreurs
  • Dim id_veille As Long, cptVeille As Long, cptErrors As Long
  • ' tableau des noms de champs de la table
  • Dim EnTeteVeille As Variant
  • ' collection des noms de champs/positions dans excel
  • Dim colPositionVeilles As New Collection
  • ' ligne en cours
  • Dim Ligne As Long
  • ' diverses variables temporaires
  • Dim Positions(50) As Long, LigneEncours As Variant, arrTemp As Variant
  • Dim blnTemp As Boolean, cptSuccessiveLignesVides As Long
  • Dim i As Long
  • On Error GoTo ImportExcelVeille_Error
  • DoCmd.Hourglass True
  • SysCmd acSysCmdSetStatus, "Importation..."
  • Set appExcel = New Excel.Application
  • ' liste des champs attendus dans la table
  • EnTeteVeille = GetFields("VEILLE")
  • appExcel.Visible = False
  • Set wbk = appExcel.Workbooks.Open(Filename, ReadOnly:=True)
  • Set wsht = wbk.Worksheets(1)
  • Do ' boucle sur l'ensemble des lignes
  • ' récupérer une ligne (non vide) dans le tableau temporaire :
  • Ligne = Ligne + 1
  • If GetExcelLine(wsht, Ligne, LigneEncours) Then
  • ' si pas encore fait, d'abord chercher les entêtes de colonne:
  • If colPositionVeilles.Count = 0 Then
  • ' si pas ou peu de correspondance, effacer la collection
  • If Not RetrouverChampsExcel(EnTeteVeille, LigneEncours, colPositionVeilles) _
  • Then Set colPositionVeilles = New Collection
  • 'sinon traitement d'une ligne normale
  • Else
  • ' récupérer les colonnes existantes à insérer sauf PK :
  • arrTemp = GenererTableauInsertion(EnTeteVeille, colPositionVeilles, _
  • LigneEncours, Array("Id_veille"))
  • ' insérer le texte dans la table TEXTES - "Id_veille", Id_veille,
  • If FN_INSERT("VEILLE", arrTemp, "Id_veille", id_veille) _
  • Then cptVeille = cptVeille + 1 _
  • Else cptErrors = cptErrors + 1
  • End If
  • cptSuccessiveLignesVides = 0
  • Else ' compter les lignes vides successives
  • cptSuccessiveLignesVides = cptSuccessiveLignesVides + 1
  • End If
  • Loop Until cptSuccessiveLignesVides > 10 ' on quitte après 10 lignes vides
  • ImportExcelVeille = (cptVeille > 0)
  • ImportExcelVeille_Exit:
  • Set wsht = Nothing
  • Set wbk = Nothing
  • appExcel.Quit
  • Set appExcel = Nothing
  • SysCmd acSysCmdClearStatus
  • DoCmd.Hourglass False
  • Exit Function
  • ImportExcelVeille_Error:
  • MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Function ImportExcelVeille of Module mdImportExcel", vbCritical
  • Resume ImportExcelVeille_Exit
  • End Function
  • ' récupérer la liste des champs d'une table dans un tableau
  • Public Function GetFields(ByVal Tablename As String) As Variant
  • Dim oRS As DAO.Recordset, fld As DAO.Fields
  • Dim arrTemp() As String, i As Long
  • On Error GoTo GetFields_Error
  • Set oRS = CurrentDb.OpenRecordset(Tablename, dbOpenDynaset, dbSeeChanges)
  • ReDim arrTemp(oRS.Fields.Count - 1)
  • For i = 0 To oRS.Fields.Count - 1
  • arrTemp(i) = oRS.Fields(i).Name
  • Next i
  • GetFields = arrTemp
  • Exit Function
  • GetFields_Error:
  • MsgBox "Error " & Err.Number & " (" & Err.Description & _
  • ") in Function GetFields of Module mdSql", vbCritical
  • End Function
  • Public Function ExistKey(ByVal key As String, ByVal col As Collection) As Boolean
  • Dim item As Variant
  • On Error GoTo KeyNotExists
  • item = col(key)
  • ExistKey = True
  • Exit Function
  • KeyNotExists:
  • ExistKey = False
  • End Function
  • ' recherche d'un élément dans un tableau
  • Public Function look_in_array(Lookup As Variant, in_array As Variant, Optional _
  • ByRef Position As Long, Optional OptionBinaryCompare As Boolean = False) As _
  • Boolean
  • Dim i As Long
  • If IsArray(in_array) Then
  • For i = LBound(in_array) To UBound(in_array)
  • If (OptionBinaryCompare And Lookup = in_array(i)) Or (Not _
  • OptionBinaryCompare And Lookup Like in_array(i)) Then
  • Position = i
  • look_in_array = True
  • Exit Function
  • End If
  • Next i
  • End If
  • End Function
  • ' récupérer une ligne du fichier Excel, compter les cases vides
  • ' ligne considérée vide si moins de 5 cellules non vides.
  • Private Function GetExcelLine(ByVal sh As Worksheet, ByVal Ligne As Long, ByRef arrLigne As Variant) As Boolean
  • Dim i As Long, arrTemp() As String, CptEmptyCells As Long, cptSuccessiveEmptyCells As Long
  • ReDim arrTemp(50)
  • Do
  • i = i + 1
  • arrTemp(i) = sh.Cells(Ligne, i).Value
  • If IsEmpty(sh.Cells(Ligne, i).Value) Then
  • CptEmptyCells = CptEmptyCells + 1
  • cptSuccessiveEmptyCells = cptSuccessiveEmptyCells + 1
  • Else
  • cptSuccessiveEmptyCells = 0
  • End If
  • Loop Until cptSuccessiveEmptyCells >= 10 Or i >= 50
  • ReDim Preserve arrTemp(i - cptSuccessiveEmptyCells)
  • arrLigne = arrTemp
  • GetExcelLine = (i - CptEmptyCells > 5)
  • End Function
  • ' générer le tableau des champs à insérer
  • Private Function GenererTableauInsertion(ByVal EnTetes, ByVal colPositions As Collection, _
  • ByVal LigneEncours, Optional ByVal Exceptions)
  • Dim arrTemp() As String, i As Long
  • ReDim arrTemp(0)
  • If IsMissing(Exceptions) Or Not IsArray(Exceptions) Then
  • For i = LBound(EnTetes) To UBound(EnTetes)
  • If ExistKey(EnTetes(i), colPositions) Then
  • ReDim Preserve arrTemp(UBound(arrTemp) + 2)
  • arrTemp(UBound(arrTemp) - 2) = EnTetes(i)
  • arrTemp(UBound(arrTemp) - 1) = LigneEncours(colPositions(EnTetes(i)))
  • End If
  • Next i
  • Else
  • For i = LBound(EnTetes) To UBound(EnTetes)
  • If Not look_in_array(EnTetes(i), Exceptions) And ExistKey(EnTetes(i), colPositions) Then
  • ReDim Preserve arrTemp(UBound(arrTemp) + 2)
  • arrTemp(UBound(arrTemp) - 2) = EnTetes(i)
  • arrTemp(UBound(arrTemp) - 1) = LigneEncours(colPositions(EnTetes(i)))
  • End If
  • Next i
  • End If
  • GenererTableauInsertion = arrTemp
  • End Function
  • ' obtenir la correspondance champs Excel/champs table
  • Private Function RetrouverChampsExcel(ByVal ListFields, ByVal LigneEncours, ByRef colPosition As Collection) As Boolean
  • Dim i As Long, lngPosition As Long
  • Dim lngFound As Long
  • Set colPosition = New Collection ' vider la collection
  • ' on récupère les positions des colonnes de la table textes
  • For i = LBound(LigneEncours) To UBound(LigneEncours)
  • If look_in_array(LigneEncours(i), ListFields, lngPosition) Then
  • colPosition.Add i, ListFields(lngPosition)
  • lngFound = lngFound + 1
  • End If
  • Next i
  • ' retourner TRUE si au moins 5 des champs de la table ont été retrouvés
  • RetrouverChampsExcel = lngFound >= 5
  • End Function
  • ' insertion via objet ADO: Tablename = table de destination
  • ' InsertValues = (champ1, valeur1, champ2, valeur2, etc)
  • Public Function FN_INSERT(ByVal Tablename As String, ByVal InsertValues As _
  • Variant, Optional ByVal InsertIdFilename As String = "", Optional ByRef _
  • InsertIdValue As Long) As Boolean
  • Dim oRS As DAO.Recordset, i As Long
  • On Error GoTo FN_INSERT_Error
  • Set oRS = CurrentDb.OpenRecordset(Tablename, dbOpenDynaset, dbSeeChanges)
  • With oRS
  • ' nécessaire pour ajouter à la fin, sinon écrase l'enregistrement en cours.
  • If Not .EOF Then .MoveLast
  • .AddNew
  • For i = LBound(InsertValues) To UBound(InsertValues) - 1 Step 2
  • If Not IsEmpty(InsertValues(i + 1)) Then
  • Select Case .Fields(InsertValues(i)).type
  • Case adDate, adDBDate, adDBTime, adDBTimeStamp
  • .Fields(InsertValues(i)).Value = CDate(Replace(InsertValues(i + _
  • 1), "'", ""))
  • Case Else
  • .Fields(InsertValues(i)).Value = InsertValues(i + 1)
  • End Select
  • End If
  • Next i
  • .Update
  • If InsertIdFilename <> "" Then .Move 0, .LastModified: InsertIdValue = _
  • .Fields(InsertIdFilename).Value
  • .close
  • End With
  • FN_INSERT = True
  • Exit Function
  • FN_INSERT_Error:
  • If Err.Number = 3421 Then
  • MsgBox "Donnée de type incorrect, colonne: " & InsertValues(i) & " = " & _
  • InsertValues(i + 1) & vbCrLf & "Error " & Err.Number & " (" & _
  • Err.Description & ") in Function FN_INSERT of Module mdSql", vbCritical
  • Else
  • MsgBox "Error " & Err.Number & " (" & Err.Description & _
  • ") in Function FN_INSERT of Module mdSql", vbCritical
  • End If
  • End Function
' IMPORTER un modèle excel dans la table VEILLE
Public Function ImportExcelVeille(ByVal Filename As String) As Boolean

' objets OLE automation EXCEL
Dim appExcel As Excel.Application
Dim wbk As Excel.Workbook, wsht As Excel.Worksheet

' Id_veille en cours (la clé primaire de la table), compte nb de lignes insérés, erreurs
Dim id_veille As Long, cptVeille As Long, cptErrors As Long

' tableau des noms de champs de la table
Dim EnTeteVeille As Variant
' collection des noms de champs/positions dans excel
Dim colPositionVeilles As New Collection

' ligne en cours
Dim Ligne As Long
' diverses variables temporaires
Dim Positions(50) As Long, LigneEncours As Variant, arrTemp As Variant
Dim blnTemp As Boolean, cptSuccessiveLignesVides As Long
Dim i As Long


On Error GoTo ImportExcelVeille_Error
DoCmd.Hourglass True
SysCmd acSysCmdSetStatus, "Importation..."

Set appExcel = New Excel.Application

' liste des champs attendus dans la table
EnTeteVeille = GetFields("VEILLE")

appExcel.Visible = False
Set wbk = appExcel.Workbooks.Open(Filename, ReadOnly:=True)
Set wsht = wbk.Worksheets(1)


Do ' boucle sur l'ensemble des lignes

    ' récupérer une ligne (non vide) dans le tableau temporaire :
    Ligne = Ligne + 1
    If GetExcelLine(wsht, Ligne, LigneEncours) Then
    
        ' si pas encore fait, d'abord chercher les entêtes de colonne:
        If colPositionVeilles.Count = 0 Then
            ' si pas ou peu de correspondance, effacer la collection
            If Not RetrouverChampsExcel(EnTeteVeille, LigneEncours, colPositionVeilles) _
            Then Set colPositionVeilles = New Collection
        
        'sinon traitement d'une ligne normale
        Else
            ' récupérer les colonnes existantes à insérer sauf PK :
            arrTemp = GenererTableauInsertion(EnTeteVeille, colPositionVeilles, _
                LigneEncours, Array("Id_veille"))
            ' insérer le texte dans la table TEXTES - "Id_veille", Id_veille,
            If FN_INSERT("VEILLE", arrTemp, "Id_veille", id_veille) _
                Then cptVeille = cptVeille + 1 _
                Else cptErrors = cptErrors + 1

        End If

        cptSuccessiveLignesVides = 0
    Else ' compter les lignes vides successives
        cptSuccessiveLignesVides = cptSuccessiveLignesVides + 1
    End If

Loop Until cptSuccessiveLignesVides > 10 ' on quitte après 10 lignes vides

ImportExcelVeille = (cptVeille > 0)

ImportExcelVeille_Exit:
Set wsht = Nothing
Set wbk = Nothing
appExcel.Quit
Set appExcel = Nothing

SysCmd acSysCmdClearStatus
DoCmd.Hourglass False
Exit Function

ImportExcelVeille_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Function ImportExcelVeille of Module mdImportExcel", vbCritical
    Resume ImportExcelVeille_Exit
End Function



' récupérer la liste des champs d'une table dans un tableau
Public Function GetFields(ByVal Tablename As String) As Variant
Dim oRS As DAO.Recordset, fld As DAO.Fields
Dim arrTemp() As String, i As Long

On Error GoTo GetFields_Error

Set oRS = CurrentDb.OpenRecordset(Tablename, dbOpenDynaset, dbSeeChanges)
ReDim arrTemp(oRS.Fields.Count - 1)
For i = 0 To oRS.Fields.Count - 1
    arrTemp(i) = oRS.Fields(i).Name
Next i
GetFields = arrTemp

Exit Function
GetFields_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & _
    ") in Function GetFields of Module mdSql", vbCritical

End Function


Public Function ExistKey(ByVal key As String, ByVal col As Collection) As Boolean
Dim item As Variant
On Error GoTo KeyNotExists
    item = col(key)
    ExistKey = True
Exit Function
KeyNotExists:
    ExistKey = False
End Function


' recherche d'un élément dans un tableau
Public Function look_in_array(Lookup As Variant, in_array As Variant, Optional _
    ByRef Position As Long, Optional OptionBinaryCompare As Boolean = False) As _
    Boolean
Dim i As Long

If IsArray(in_array) Then
    For i = LBound(in_array) To UBound(in_array)
        If (OptionBinaryCompare And Lookup = in_array(i)) Or (Not _
            OptionBinaryCompare And Lookup Like in_array(i)) Then
            
            Position = i
            look_in_array = True
            Exit Function
        End If
    Next i
End If

End Function



' récupérer une ligne du fichier Excel, compter les cases vides
' ligne considérée vide si moins de 5 cellules non vides.
Private Function GetExcelLine(ByVal sh As Worksheet, ByVal Ligne As Long, ByRef arrLigne As Variant) As Boolean
Dim i As Long, arrTemp() As String, CptEmptyCells As Long, cptSuccessiveEmptyCells As Long
ReDim arrTemp(50)

Do
    i = i + 1
    arrTemp(i) = sh.Cells(Ligne, i).Value
    If IsEmpty(sh.Cells(Ligne, i).Value) Then
        CptEmptyCells = CptEmptyCells + 1
        cptSuccessiveEmptyCells = cptSuccessiveEmptyCells + 1
    Else
        cptSuccessiveEmptyCells = 0
    End If
Loop Until cptSuccessiveEmptyCells >= 10 Or i >= 50
ReDim Preserve arrTemp(i - cptSuccessiveEmptyCells)
arrLigne = arrTemp
GetExcelLine = (i - CptEmptyCells > 5)
End Function


' générer le tableau des champs à insérer
Private Function GenererTableauInsertion(ByVal EnTetes, ByVal colPositions As Collection, _
    ByVal LigneEncours, Optional ByVal Exceptions)
Dim arrTemp() As String, i As Long

ReDim arrTemp(0)
If IsMissing(Exceptions) Or Not IsArray(Exceptions) Then
    For i = LBound(EnTetes) To UBound(EnTetes)
        If ExistKey(EnTetes(i), colPositions) Then
            ReDim Preserve arrTemp(UBound(arrTemp) + 2)
            arrTemp(UBound(arrTemp) - 2) = EnTetes(i)
            arrTemp(UBound(arrTemp) - 1) = LigneEncours(colPositions(EnTetes(i)))
        End If
    Next i
Else
    For i = LBound(EnTetes) To UBound(EnTetes)
        If Not look_in_array(EnTetes(i), Exceptions) And ExistKey(EnTetes(i), colPositions) Then
            ReDim Preserve arrTemp(UBound(arrTemp) + 2)
            arrTemp(UBound(arrTemp) - 2) = EnTetes(i)
            arrTemp(UBound(arrTemp) - 1) = LigneEncours(colPositions(EnTetes(i)))
        End If
    Next i
End If
GenererTableauInsertion = arrTemp
End Function



' obtenir la correspondance champs Excel/champs table
Private Function RetrouverChampsExcel(ByVal ListFields, ByVal LigneEncours, ByRef colPosition As Collection) As Boolean
Dim i As Long, lngPosition As Long
Dim lngFound As Long

Set colPosition = New Collection ' vider la collection
' on récupère les positions des colonnes de la table textes
For i = LBound(LigneEncours) To UBound(LigneEncours)
    If look_in_array(LigneEncours(i), ListFields, lngPosition) Then
        colPosition.Add i, ListFields(lngPosition)
        lngFound = lngFound + 1
    End If
Next i

' retourner TRUE si au moins 5 des champs de la table ont été retrouvés
RetrouverChampsExcel = lngFound >= 5

End Function



' insertion via objet ADO: Tablename = table de destination
' InsertValues = (champ1, valeur1, champ2, valeur2, etc)
Public Function FN_INSERT(ByVal Tablename As String, ByVal InsertValues As _
    Variant, Optional ByVal InsertIdFilename As String = "", Optional ByRef _
    InsertIdValue As Long) As Boolean
Dim oRS As DAO.Recordset, i As Long

On Error GoTo FN_INSERT_Error

Set oRS = CurrentDb.OpenRecordset(Tablename, dbOpenDynaset, dbSeeChanges)
With oRS
    ' nécessaire pour ajouter à la fin, sinon écrase l'enregistrement en cours.
    If Not .EOF Then .MoveLast
    .AddNew
    For i = LBound(InsertValues) To UBound(InsertValues) - 1 Step 2
        If Not IsEmpty(InsertValues(i + 1)) Then
            Select Case .Fields(InsertValues(i)).type
            Case adDate, adDBDate, adDBTime, adDBTimeStamp
                .Fields(InsertValues(i)).Value = CDate(Replace(InsertValues(i + _
                    1), "'", ""))
            Case Else
                .Fields(InsertValues(i)).Value = InsertValues(i + 1)
            End Select
        End If
    Next i
    .Update
    If InsertIdFilename <> "" Then .Move 0, .LastModified: InsertIdValue = _
        .Fields(InsertIdFilename).Value
    .close
End With
FN_INSERT = True

Exit Function
FN_INSERT_Error:
If Err.Number = 3421 Then
    MsgBox "Donnée de type incorrect, colonne: " & InsertValues(i) & " = " & _
        InsertValues(i + 1) & vbCrLf & "Error " & Err.Number & " (" & _
        Err.Description & ") in Function FN_INSERT of Module mdSql", vbCritical
Else
    MsgBox "Error " & Err.Number & " (" & Err.Description & _
        ") in Function FN_INSERT of Module mdSql", vbCritical
End If
End Function

Conclusion

La fonction est assez souple pour s'adapter à pas mal de cas de figure mais pas encore assez à mon gout: à prévoir encore:
- le nom de la table (inscrit dans la fonction)
- la feuille du fichier excel à importer (la 1ere ici, inscrit dans la fonction)
sinon je me base sur le principe que si on trouve X cellules vides on considère qu'on a atteind la fin de la ligne/ de la feuille. pas forcément le meilleur choix mais j'ai pas encore trouvé mieux.

PS: en fait mon code manipule les objets Excel, il faut donc ajouter cette référence: dans l'éditeur VBA:
menu outil / référence: rechercher "Microsoft Excel xx Object Library", cocher valider et c bon ça devrait marcher.
 

Historique

22 février 2007 12:26:51 :
Correction d'un bug dans la dernière fonction pour obtenir le last ID inséré... .Move 0, .LastModified (sans ça j'avais le ID-1)
16 mars 2007 09:34:08 :
information sur la référence aux objets Excel à ajouter. Sinon évidemment ça marche beaucoup moins bien ^^

Commentaires et avis

signaler à un administrateur
Commentaire de endero7 le 14/03/2007 09:47:40

Nice code,
Thanks

signaler à un administrateur
Commentaire de Selune6666 le 30/04/2007 11:34:41

J'ai une légère question étant debutante en programmation ^^

J'ai une feuile excel dans laquelle je dois récupéré des données et donc inclure cela dans une table access.

J'ai fait un petit code me permettant d'ouvrir une boite de dialogue windows dans laquelle je sélectionne un fichier excel.Une fois que je valide le chemin,il l'affiche dans la textbox de mon formulaire.

Ce code prendra t'il compte qu'il doit enregistrer les champs de l'url situé dans la textbox?

signaler à un administrateur
Commentaire de pifou25 le 30/04/2007 11:56:02

oui en principe ça devrait marcher. enfin pas l'url (URL? c'est pour internet ça) mais le chemin C:\mes documents\excelfile.xls ça oui!

signaler à un administrateur
Commentaire de Selune6666 le 30/04/2007 15:01:47

oui oui le chemin l'url c pareil >_<'(réponse d'inculte je sais) merci je go test et modifier tous ça ^^

signaler à un administrateur
Commentaire de outofbusiness le 10/05/2007 11:25:54

question de débutant : tu tapes ce code dans access ou excel ??
d'après ce que j'ai compris, c'est dans excel, mais j'ai une erreur à cause du docmd :-~
comment tu utilises ta fonction importexcelveille dans une procédure ??

merci "beaucoup" d'avance pour ta réponse, car j'avance pas :-(

signaler à un administrateur
Commentaire de pifou25 le 13/05/2007 12:02:41

"raté" ;) c'est bien dans un module access qu'il faut tout mettre ce code. il faut aussi ajouter une référence à la librairie Excel (pour les objets worksheet etc) et avoir fait une table access (je l'ai appelée "veille" dans ce code). DoCmd est une commande Access
Si tu es débutant, désolé je crois que ce code manque un peu de commentaires "évidents" et pourtant y'en a pas mal des commentaires.

signaler à un administrateur
Commentaire de LEXANE le 14/06/2007 09:38:10

salut,
pour les besoins d'un projet de stage j'ai besoin d'enregister dans ma base access des données qui sont saisies dans des feuilles excel, mais étant donné que je ne connais visual basic que depuis 2 semaines je ne voit pas bien comment donc si une âme charitable a le temps de m'expliquer je lui serait très reconnaissant
merci

signaler à un administrateur
Commentaire de carlos le 14/06/2007 15:31:50

Bonjour ma petite LEXANE

Je pense que tu peux le faire manuellement en important dans Fichier/Données externes/ tu choisies le format xls et ensuite je crois qu'il faut lier les tables que tu veux mettre à jour ... Moi aussi je dois faire ça j'ai commencé aujourd'ui je ne connais ni ACCESS ni VB enfin que de nom beinsur dès que j'ai la solution je t'en dirait plus.....*

peace (-_-)

signaler à un administrateur
Commentaire de myssia le 18/06/2007 09:51:56

salut, comment dire je suis extrément null en vb..prog etc.
j'aimerais qu'on m'expik ttes les étapes...pour que le code fonctionne...cad implémentation du main..changement des paramètres...pour que ça fonctionne ! je vous fais un schéma sur mes compétences : ctrl C/ ctrl V :( . sinon j'y pige rien !

signaler à un administrateur
Commentaire de pifou25 le 18/06/2007 22:11:58

c'est pas une source pour débutant que j'ai fait la non plus... si tu n'en a pas besoin contente toi de ctrl C/ctrl V ça marche aussi :p et si tu a besoin d'aide commence par des trucs de ton niveau.

signaler à un administrateur
Commentaire de myssia le 19/06/2007 10:56:08

ben fallait le dire ! si ton code est réservé rien qu'au geek !
j'ai ( j'avais) besoin de ce genre de code ! qq1 de moins ***** que toi a bien voulu m'a aidé! fo dire que chez toi coder c'est qq choz d'inné ! non?!

signaler à un administrateur
Commentaire de Renfield le 19/06/2007 11:04:21 administrateur CS

y'a Internet dans la cour de récré ?

merci de bien vouloir baisser d'un ton, et de soigner ta rédaction.
poses des questions portant sur des points précis du code, si tu veux que l'on puisse facilement te répondre...
si tu n'entends reelement rien a ce code - qui du reste est pas mal structuré, et gère les Case Else, etc. - regarde une autre source, plus adaptée à ton niveau, qui ne pourra alors que progresser.

J'ignore si tu cherches simplement a mettre en oeuvre ce code dans ton projet, ou si tu cherches a comprendre le code, juste pour "la forme"...

Renfield - Admin CS

signaler à un administrateur
Commentaire de myssia le 19/06/2007 11:09:02

je voulais juste qu'on m'explique l'importation et non le code ( que j'ai compris ! et oui ça surprend lol.) et pas qu'on me dise d'allez voir ailleurs ""ici c'est le monde des gds""   :o
mais bon le réseau des codeurs est assez vaste et diversifiés donc maintenant ça va ! pour continuez cette conversation inutile envoyer un autre message

signaler à un administrateur
Commentaire de pifou25 le 20/06/2007 11:31:23

Désolé, Myssia, que tu ai mal pris mon message, (qui n'était pas aimable je le sais). Ce n'est pas inné chez moi, je ne suis pas geek, mais développeur de métier. Je veux bien répondre à des questions si tu comprend pas 1 point, mais pas "j'y comprend rien expliquez moi tout!" En même temps je suis pas professeur j'en serais pas capable.

Alors je suis bien content que tu ai compris quand même :) et que ma source te soit peut être utile :) et que finalement, tu es toi aussi entré dans "le monde des grands"! bon courage.

signaler à un administrateur
Commentaire de myssia le 20/06/2007 11:36:57


Tkt, je me suis laissée emporter on va dire. Certes je débute, mais j'apprends relativement vite donc ça va. Ton code m'a aidé et j'ai pu l'implémenter dans mon projet dc c cool. Bonne continuation

signaler à un administrateur
Commentaire de saberhec le 22/06/2007 10:53:49

Salut tout le monde. Je te remercie monsieur Pifou pour ce code bien structuré. Néanmoins, j'ai suivi les étapes suivantes, il n' y avait pas de message d'erreur, mais la table "VEILLE" est restée vide après avoir terminé:
1 - J'ai créé une table "VEILLE"
2 - J'ai placé ce code dans un module "Module1"
3 - J'ai activé la référence Excel 11 Obj...
4 - J'ai créé une "Sub" qui fait référence à la première fonction ainsi:
Sub EssaiImport()
     ImportExcelVeille ("C:\AAA.xls")
End Sub
5 - Lors de l'exécution, il n' y avait pas de message d'erreur mais la table est restée vide bien que j'ai bien placé des données sur le fichier "AAA.xls"
Je crois que j'ai une erreur quelque part et je compte sur votre maîtrise pour m'aider.
Merci encore une fois pour ce code bien utile.

signaler à un administrateur
Commentaire de pifou25 le 23/06/2007 17:41:57

aucun message d'erreur ?? difficile de faire un diagnostic dans ce cas :|  ... y'a-t-il bien les entête de colonnes dans le fichier excel? sinon je ne vois pas.

signaler à un administrateur
Commentaire de saberhec le 25/06/2007 09:46:27

Salut, J'ai veillé à exporter les données existantes de la même table (qui est ancienne renommé comme voulu) dans le fichier Excel spécifié. Ensuite, j'ai vidé la table. Enfin, j'ai lancé le module d'import.
Ceci étant, je veux dire que le fichier Excel contient des données compatibles avec les formats exigés par la table et que l'en-tête des colonnes existent à la première ligne du fichier Excel.
Merci pour l'intérêt que vous accordez à mon interrogation et j'espère qu'ainsi je suis arrivé à vous éclaircir un peu sur la situation. (Rq: j'utilise MS Office 2003).

signaler à un administrateur
Commentaire de comiv le 24/09/2007 14:34:56

Bonjour,
Tout d'abord bravo pour votre code qui est très bien commenté.
J'ai testé tout ça, et zut de flute, rien ne se passe.
Pas de message d'erreur, mais la table ne se rempli pas.
J'ai vu que la fonction GetExcelLine() retourne toujours FALSE, même que ma ligne n'est pas vide !!
Merci de m'avoir lue
A+
comiv

signaler à un administrateur
Commentaire de pifou25 le 24/09/2007 16:15:35

... il y a peut être des colonne masquées au début qui font que la fonction ne voit pas la suite(?) Je vois pas d'autres solutions :s Sinon essaye de mettre un point d'arrêt sur la fonction et voir ce qui se passe précisément.

signaler à un administrateur
Commentaire de comiv le 25/09/2007 08:27:42

Bonjour,
D'avance merci pour votre réponse.

En fait j'ai changé le test dans GetExcelLine. A la place de
GetExcelLine = (i - CptEmptyCells > 5)
J'ai codé :
GetExcelLine = (i - CptEmptyCells > 0)
Et de c'est bon.
Ensuite, j'ai des problèmes dans RetrouverChampsExcel(), mais je continue d'investiger.

Bonne journée et bon codage.
Salutations
comiv

signaler à un administrateur
Commentaire de kaltek le 30/05/2008 10:42:08

Bonjour

Ce topic date un peut mais je tente ma chance.
Tout d'abord je souhaite remercier Pifou25 pour son programme car c'est exactement ce dont j'ai besoin. Maintenant il faut le faire fonctionner.

J'ai donc ajouté la bibliothèque d'Excel dans Access 9.
J'ai créer la table Veille.
J'ai copier le programme dans Module1.
J'ai créer un SUB

Sub ImportExcel()
    ImportExcelVeille ("C:Bureau\essai.xls")
End Sub

Je n'ai pas toucher au programme d'origine.
J'exécute le programme et voici l'erreur :
ERROR 457 (cette clé est déjà associée à un élément de cette collection) IN FUNCTION ImportExcelVeille of Module mdImportExcel


Merci de me donner un coup de main.

signaler à un administrateur
Commentaire de pifou25 le 02/06/2008 10:35:59

bonjour,
il y a peut être dans le fichier Excel plusieurs colonnes qui ont le même nom...
ou bien dans la table veille de Access, même cause même effet...

signaler à un administrateur
Commentaire de kaltek le 03/06/2008 08:22:34

Salut, merci de m'apporter ton aide.

En effet mon tableau Excel contenait deux fois le même champs.
Je n'ai plus ce message d'erreur mais celui-ci :
ERROR 3265 (Element non trouver dans cette collection) IN Function
FN_INSERT of module mysql.
Le programme a copier 14 lignes sur les 17.

signaler à un administrateur
Commentaire de pifou25 le 04/06/2008 16:36:12

... (mySQL ??)

chai pas, du coup, si ça a marché pour 14  lignes il doit y avoir un caractère incompatible sur la 15e ligne qui le fait planter... :/ apostrophe, antislash, crochets...

signaler à un administrateur
Commentaire de peanut38 le 25/08/2008 15:02:41

Bonjour

et merci pour ce code!

Je ne suis pas non plus experte en vb et je ne parviens pas à mettre en application cette source.
Voici mon erreur :
"Error 9 (L'indice n'appartient pas à la sélection.) in Function ImportExcelREFHD of Module mdImportExcel"

Ma table Access s'appelle REFHD (sql). Mon fichier se trouve sur un lecteur réseau.
Je fais appel à la fonction en cliquant sur un bouton :

Private Sub Commande100_Click()
ImportExcelREFHD ("O:\importexcelREFHD.xls")
End Sub

Le premier champ de mon tableau est une clé primaire.

Quelqu'un a-t-il une idée ?

Merci d'avance !

signaler à un administrateur
Commentaire de pifou25 le 27/08/2008 11:10:53

bonjour,
cette fonction (ImportExcelRefhd) c'est toi qui l'a créée, on n'a pas le code on aura du mal à t'aider... demande plutot sur le forum ;)

signaler à un administrateur
Commentaire de bercof le 07/02/2009 15:34:21

salut tout le monde
j ai besoin d un code qui mé le contrair un code qui exporte un requette acces vers un fichier excel
si c possible j aim bien recevoir ce code sur ma boite palermo01@hotmail.fr
et merci d avance

signaler à un administrateur
Commentaire de pifou25 le 07/02/2009 16:56:09

Salut Bercof, j'ai exactement ce qu'il te faut c'est une autre de mes (nombreuses!) sources, ici
http://www.vbfrance.com/codes/ACCESS-VBA-EXPORTER-SQL-VERS-FICHIER-PLAT-CSV_41481.aspx
le principe est simple, une fonction qui exporte ta requête access en fichier csv (donc que tu pourra ouvrir avec Excel)
Function ExportCsv(SQL As String, File_name As String,
  Optional ByVal sep As String = ";", Optional ByVal Quote As String = "", Optional ByVal WithFields As Boolean = False) As Boolean

ça dit tout: ExportCsv('ta_requete', 'c:/documents/tonfichier.csv')
le tour est joué ;)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Import export excel access [ par voix_off ] Bonjour &#224; tous !J'&#233;cris ici car j'ai un gros souci ! Je suis d&#233;butant en VB, j'ai r&#233;alis&#233; quelques petites macros, et l&#224; ADO: créer une liaison entre access et excel. [ par daveneo ] Intitul&#233;: J'utilise access comme base de donn&#233;es de d&#233;part et excel pour faire des calculs complexes. Je veux cr&#233;er Export Access vers Excel en VBA [ par PtitGrumo ] Bonjour tousJ'exporte des donn&#233;es Access vers un fichier Excel. Jusque l&#224; rien d'estraordinaire.J'affiche ligne par ligne tous mes r&#233;su import données excel dans access [ par ghisl1 ] salut la jeunesseje voudrai ins&#233;rer des donn&#233;es provenant d exceldans une base de donn&#233;es accessje voudrai parcourir le fichier excel e import et export de cellule excel [ par feroce88 ] je voudrais savoir les instrutions qui permette l'import et l'export de cellule excel merci d'avanceFEROCE Access - Export de donnée d'un enregsitrement dans une fueille Excel préformatée [ par duracuire ] Bonjour,Je suis un nouvel utilisateur d'access et j'ai une petite question qui me tourmente depuis un bon bout de temps.Je vous explique la situtaion Export table ACCESS vers Excel [ par evilmajestik ] Salut all !J'ai une table ACCESS que je voudrais exporter sous Excel &#224; partir d'une cellule sp&#233;cifique (la cellule A3 car j'ai une mise en p Import d'Excell vers Access [ par chmouette ] salut tout le monde,Je suis toujours en train de d&#233;velopper mon appli access&nbsp;pour le boulot, et je rencontre (encore!) un probl&#232;me...Je Export Access vers Excel (pb de version) [ par c_chiant_ca ] Slt &#224; tous, Je vous explique mon probl&#232;me. J'ai repris une ancienne petite application faites sous Access 97, maitenant je suis sous Access export excel d'un état sous access [ par viviii ] Bonjour, Je cherche à exporter un état qui contient des statistiques depuis access vers excel, j'ai utilisé : DoCmd.OutputTo acOutputReport, "rp...."


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.