ACCESS vers EXCEL sans creer un nouveau classeur

Signaler
Messages postés
710
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
19 mai 2015
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
bonjour
j'envoi uen table ACCESS vers EXCEL,pas de probleme le transfert se fait bien.
Donc j'ai creer un classeur excel avec des formules pour faire un graphique.Mais quand j'evoie ma table ACCESS avec le code ci dessous,il me crer un nouveau classeur donc toute mes formules disparraissent.
Est ce possible d'envoyer ma table dans le classeur que j'ai creer tous en sachant que le nombre de colonnes sera toujours pareil,il n'y aura que les lignes qui augmenterons.
dans File2 je vais bien chercher le classeur EXCEL que j'ai creer.
Private Sub CreateFile()
    Dim filename As String
    Dim appExcel As Excel.Application
    
    ' Exécution d'Excel
    Set appExcel = CreateObject("Excel.Application")
    ' Attribut de visibilité d'Excel
    appExcel.Visible = False
    ' Pour éviter les questions!!!
    appExcel.AlertBeforeOverwriting = False
    appExcel.DisplayAlerts = False

    ' Déclaration du chemin du fichier Excel
    Dim cheminFichierExcel As String
    ' Déclaration du fichier Excel à ouvrir
    Dim fichierExcel As Excel.Workbook
    
    ' remplissage du fichier
    Dim bd As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim req As String
    Dim i As Integer
   
    bd.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & File1.Path & "" & File1.filename
    bd.Open
    If Check1.Value = 0 Then
        ' Ouverture du fichier Excel
        filename = Combo1.Text & ".xls"
        Set fichierExcel = appExcel.Workbooks.Add
        req = "SELECT * FROM `" & Combo1.Text & "`"
        rs.Open req, bd, adOpenForwardOnly, adLockReadOnly
        ' remplissage du fichier excel
        If Not (rs.EOF And rs.BOF) Then
            ' Ecriture des en-têtes de colonnes et des valeur
            generateExcel Combo1.Text, rs, appExcel
        End If
        rs.Close
        fichierExcel.Close True, File2.Path & "" & filename
        File2.Refresh
        MsgBox "Fichier généré avec succès", vbOKOnly, "Access--->Excel"
    End If
        bd.Close
    appExcel.Quit
   access_excel.Hide
End Sub


merci
petchy

10 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,

J'ai lu "en diagonale", mais il semble bien que c'est toi-même, qui demandes que ce soit fait dans un nouveau fichier :

Set fichierExcel = appExcel.Workbooks.Add

dont je vois d'ailleurs mal ce que tu en fais

je ne vois pas non plus le traitement qui est fait par
generateExcel Combo1.Text, rs, appExcel

Peux-tu nous l'exposer ?




Ne crois-tu pas, enfin, qu'il serait plus simple de copier ton classeur (avec ses forumules et tout) dans un nouveau classeur, de le vider de ses valeurs, puis d'y injecter ce que tu veux ?
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
710
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
19 mai 2015
3
bonjour
au départ ça ne me dérengais pas de créer un nouveau classeur,mais maintenant avec les formules,je ne sais pas comment faire.
Ne crois-tu pas, enfin, qu'il serait plus simple de copier ton classeur (avec ses forumules et tout) dans un nouveau classeur, de le vider de ses valeurs, puis d'y injecter ce que tu veux ?

d'accord,mais comment faire
voila le code de generateExcel :
Public Function generateExcel(table As String, rs As ADODB.Recordset, appExcel As Excel.Application)
    On Error Resume Next
    Dim col(300) As String
    Dim i As Integer
    Dim J As Integer
    Dim k As Integer
    
    ' Récupération du nombre de colonnes
    Dim nbColonnes As Integer
    Dim lettre As String
    nbColonnes = rs.Fields.Count
    
    For i = 0 To 25
        col(i) = Chr(65 + i)
    Next i
    k = 26
    For i = 0 To 7
        For J = 0 To 25
            col(k) = Chr(65 + i) & "" & Chr(65 + J)
            k = k + 1
            If k > nbColonnes Then
                Exit For
            End If
        Next J
        If k > nbColonnes Then
            Exit For
        End If
    Next i
    
   'préparation de la barre de progression
    Dim nbEnr As Integer
    Dim Step As Integer
    nbEnr = 1
    rs.MoveFirst
    While Not (rs.EOF)
        nbEnr = nbEnr + 1
        rs.MoveNext
    Wend
    frmProgression.ProgressBar1.Value = 0
    frmProgression.ProgressBar1.Max = nbEnr
    'frmProgression.Caption = "Exportation de la table '" & table & "'"
    Step = 1

    frmProgression.Show
    For i = 0 To (nbColonnes - 1)
        lettre = col(i)
        appExcel.Worksheets(1).Range(lettre & "1").Value = rs.Fields(i).Name
        
    Next i
    frmProgression.tick Step
    rs.MoveFirst
    i = 2
    Dim caseCible As String
    While Not (rs.EOF)
        For J = 0 To (nbColonnes - 1)
            If Not IsNull(rs.Fields(J).Value) Then
                caseCible = col(J) & "" & i
                appExcel.Worksheets(1).Range(caseCible).Value = rs.Fields(J).Value
            End If
        Next J
        i = i + 1
        
        frmProgression.tick Step
        ' Déplacement du curseur
        rs.MoveNext
    Wend
    frmProgression.Hide
End Function


petchy
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Pour générer un nouveau classeur à l'identique de celui qui contient tes formules ?
Plusieurs manières, la plus simple étant probablement d'utiliser tout simplement FileCopy

Pour le vider de ses valeurs sans toucher au reste ? Tu ne touches qu'à la propriété Value du Range (ici, ton range sera bien évidemment le UsedRange de la feuille)


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
710
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
19 mai 2015
3
est ce possible de faire un FileCopy
quand ça viens d'une table ACCESS.
car j'envoi directement la table ACCESS vers une feuille EXCEL
si tu aurais un exemple
petchy
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Et qui te parles de "venir" ou non d'une table ?
Un FileCopy est un FileCopy ! ===>> il copie un fichier à l'identique, où tu le souhaites et avec le nom que tu souhaites. Et c'est sur ce fichier (après l'avoir "vidé" de ses seules valeurs, que tu "envoies" tes données en provenances de la table, c'est tout !
Où est donc ton problème ?


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
710
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
19 mai 2015
3
ok,
le probleme,c'est que je ne sais pas commen faire
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ah...
Peut-être alors apprendre à ne jamais "mettre la charrue avant les boeufs" !
Commencer par le comencement. Apprendre ce qu'est chaque chose (à commencer par le FileCopy). Comprendre le code que l'on utilise (que tu as même utilisé !) plutôt que de fonctionner sur et à partir d'exemples (autrement : tu risqueras fort d'avoir des milliards d'"exemples" à répertorier et auxquels te référer pour faire face à toutes les situations possibles et imaginables ! ... et ce n'est pas là ma tasse de thé, ni celle, d'ailleurs, d'un développeur habituel...).
Désolé, ami, mais moi, je te laisse là en te souhaitant bonne étude et bonne chance. Un autre prendras le relais, peut-être....

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
710
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
19 mai 2015
3
ok
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Enfin quoi !
regarde donc ce que tu passe à ta "fonction" :

Public Function generateExcel(table As String, rs As ADODB.Recordset, appExcel As Excel.Application)

(et j'ai mis fonction entre guillemets car, de la manière dont tu l'utilises, ce n'en est pas une, mais une simple sub !)
qu'est donc appexcel ?
Regarde ce que c'est pour toi (compte tenu de ton code) :
Set appExcel = CreateObject("Excel.Application")

Et ce devrait tout bêtement être, selon ce que je t'ai exposé : un classeur obtenu par copie (FileCopy) du 1er et épuré de ses valeurs uniquement (comme je te l'ai exposé).
C'est tout !
Est-ce si difficile à comprendre ?
Que ne sais-tu faire ?
un FileCopy ? ===>> aide en ligne avec exemple à lire (étonamment clair)
vider de ses seules valeurs (en gardant tout le reste) le usedrange d'une feuille ?
Appeler ta "fonction" en lui passant CE xls préalablement épuré ?
Dis-nous !

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
En plus : en ce qui concerne la suppression des seules valeurs : tu peux même l'éviter puisque le nombre de colonnes est toujours le même.
Il te suffit d'effacer toutes les lignes au-delà du recordCount de ton jeu d'enregistrements !
toutes les autres lignes seront alors "écrasées" par les données en provenance de ta base ...
AZllez ... mets-toi à cela calmement.


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.