IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Création Graphique Access puis exportation vers word [AC-2000]


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut Concaténation de chaine qui semble trop longue dans une requête crosstab en VBA
    Bonsoir à tous,

    Mon post de ce soir a plusieurs questions liées au fait que je ne vois pas trop comment m'y prendre (je bidouille un peu access sur base des tuto et autres infos du forum).

    Bon venons-en aux faits.

    J'ai réalisé une requête croisée (à partir de divers tables) pour générer un "tableau" qui reprends (pour l'ensemble des sites) en colonne : des noms d'animaux, en intitulé de ligne : des jours, et en valeur le nombre de fois ou ces animaux sont présents.
    En sachant que chacun des sites le nombre de jours d'observation est variable (de 1 à 20 par exemple) et le nombre d'animaux observés également (ca va de 0 à 12 espèces différentes, par ex).

    La requête fonctionne bien mais j'ai toutes les données pour tous les sites

    1) Si je désire créer une requête dynamique, où l'utilisateur choisira le site qu'il veut visualiser, Access me signale qu'il ne trouve pas le champs de données correspondant. Je ne comprends pas pourquoi...

    2) Quand, sur base de la requete globale, je désire créer un histogramme dans mon formulaire (grâce au superbe tuto), le wizard me limite à maximum 6 champs. Comment est-il possible d'augmenter le nombre de champs pour, par exemple, afficher les séries correspondants à toutes les espèces et pour une durée de plus de 4 jours?

    3) Le but final étant de transférer ce graphique dans un document Word pour une présentation finale. Est-ce possible via un signet et le tranfert d'image (comme expliqué aussi dans un autre tuto ici)? N'est ce pas plus simple de passer par excell (export du résultat du tableau croisé et gréation dans excell du graphique)? Si oui comment??? Avez-vous d'autres solutions/pistes?

    En espérant avoir été clair. Merci à tous et toutes!

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut
    Bonsoir,

    Toujours pas de réponse à mes précédentes questions "phylosophiques". Mais pour autant je ne reste pas sans rien faire. La réalisation d'un formulaire qui permet l'affichage d'un tableau croisé en fonction du choix de l'utilisateur avance.

    En reprenant le tuto de recherche multicritères et en utilisant, via le wizard, différents query (pour avoir un modèle du code dont j'ai besoin, j'arrive à obtenir manuellement un résultat adéquat. Je pense donc que je suis sur la bonne piste.

    Actuellement j'ai donc un formulaire qui contient une combobox (cmbNumDossier, qui permet de choisir le numéro de dossier que je souhaite) et un champs liste unbound (ListNbrTaxonByDate).

    Pour pouvoir compléter ma requete crosstab nommée SQL, j'utilise la requete nommée strSQL01 pour récupérer les différents noms (qui vont me servir d'en-tête de colonne). Puis j'utilise cette requête pour créer un recordset dont je veux parcourir le champ Taxon et y récupérer les différents noms présents. Les différents noms seront concaténés pour arriver à quelque chose comme ceci : SQLTaxa = "GraphEmergencePreselectQry_Crosstab1.[Calliphora vicina (R_-D_, 1830)], GraphEmergencePreselectQry_Crosstab1.[Calliphora vomitoria L_, 1758], "

    Problème: Il m'affiche un message d'erreur 91 (Object variable or With block variable not set) et le contenu du rs01 est nothing.

    Questions:
    1) Avez-vous une idée du pourquoi de ce message d'erreur et comment résoudre cela?
    2) A la fin de la concaténation, il va y avoir une virgule qui traine. Comment puis-je l'enlever de la chaîne SQLTaxa?

    Petite précision, la requête crosstab SQL fonctionne parfaitement quand je la teste avec un SQLTaxa composé manuellement.

    En espérant ne pas vous avoir fait fuir et avoir été assez clair, je vous dis à bientôt pour vos réponses

    Dermochelys



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub RefreshQuery()
     
    Dim SQL As String
    Dim SQLTaxa As String
    Dim stSQL01 As String 'string pour la chaine de requête
     
    Dim rs01 As Recordset 'recordset pour les enregistrements
    Dim db As Database
     
    SQL = "SELECT GraphEmergencePreselectQry_Crosstab1.NumCD, GraphEmergencePreselectQry_Crosstab1.DateEmergence, GraphEmergencePreselectQry_Crosstab1.[Total Of NbrSpecimenId], "
     
    'On initialise la SQL qui va servir dans le recordset
    stSQL01 = "SELECT DataCollect.NumCD, [DataIdentification].[IdGenre] & """ & " " & """ & [DataIdentification].[IdEspeceParrain] AS Taxons "
    stSQL01 = stSQL01 & "FROM (DataCollect INNER JOIN NbrEmergence ON DataCollect.NumMIC = NbrEmergence.NumMIC) INNER JOIN DataIdentification ON NbrEmergence.ID = DataIdentification.IDBteEmergence "
    stSQL01 = stSQL01 & "GROUP BY DataCollect.NumCD, [DataIdentification].[IdGenre] & """ & " " & """ & [DataIdentification].[IdEspeceParrain] "
    stSQL01 = stSQL01 & "HAVING (((DataCollect.NumCD)=" & Me.cmbNumDossier & "));"
     
    Set rs01 = db.OpenRecordset(stSQL01) 'définition du recordset
     
    While Not rs01.EOF 'Boucle pour récupérer les noms des taxons du cas choisi dans la cmbNumDossier et les affecter après concatennement à la requête SQL
    '
    'Mettre ici les concatenations adéquates mais ça coince ici
     
        SQLTaxa = "GraphEmergencePreselectQry_Crosstab1.[" & rs01.Fields("Taxons") & "], "
        rs01.MoveNext
    Wend
     
     
    SQL = SQL & SQLTaxa
    SQL = SQL & "FROM GraphEmergencePreselectQry_Crosstab1 WHERE (((GraphEmergencePreselectQry_Crosstab1.NumCD)=" & Me.cmbNumDossier & "));"
     
     
    Me.ListNbrTaxonByDate.RowSource = SQL
    Me.ListNbrTaxonByDate.Requery
     
    End Sub

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut Y a t'il une limite de longueur a une string dans le code VBA?
    Bonjour,

    J'ai continué mes tests sur le code ci-dessus et j'en arrive a la constation que le passage de la requête dans les strings est limité à un certains nombre de caractères.

    En exemple, le code ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    stSQL01 = "SELECT DataCollect.NumCD, [DataIdentification].[IdGenre] & """ & " " & """ & [DataIdentification].[IdEspeceParrain] AS Taxons "
    stSQL01 = stSQL01 & "FROM (DataCollect INNER JOIN NbrEmergence ON DataCollect.NumMIC = NbrEmergence.NumMIC) "
    stSQL02 = "INNER JOIN DataIdentification ON NbrEmergence.ID=DataIdentification.IDBteEmergence "
    stSQL02 = stSQL02 & "GROUP BY DataCollect.NumCD, [DataIdentification].[IdGenre] & """ & " " & """ & [DataIdentification].[IdEspeceParrain] "
    stSQL03 = stSQL01 & stSQL02
    J'ai décomposé la requête select pour avoir la crosstab que je souhaite.
    Quand j'observe dans le debugger, stSQL01 et stSQL02 contiennent bien les chaines prévues.
    Mais stSQL03 est tronquée après ON NbrEmergence.ID=
    D'ailleurs à la fin de stSQL03 tronquée, je retrouve aléatoirement un caractère (genre a, e ou n'importe quoi en fait)

    Comment puis-je faire pour concaténer toute la chaine adéquate (il me reste encore après un Having...)???

    Merci pour vos suggestions

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut
    Bonjour,

    Dans le genre monologue sur un thème...

    Enfin, après avoir encore fouillé le forum et réfléchi, j'ai trouvé une solution à mon problème de concaténation d'un string.
    Il s'agit de concaténer le contenu des champs (qui servira d'intitulé de colonnes) après avoir pris les 2 premiers caractères. J'ai aussi réécris l'ensemble du code que voici pour un éventuel usage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub RefreshQuery()
     
    Dim SQL As String
    Dim SQLTaxa As String 'chaine qui devrait récupérer les noms de taxons pour en faire des entête de colonne
    Dim rs01 As DAO.Recordset 'recordset pour les enregistrements
    Dim db As DAO.Database
    Set db = CurrentDb
     
    SQL = "SELECT Crstb1.NumCD, Crstb1.DateEmergence, Crstb1.[Total Of NbrSpecimenId] As Total, "
     
    Set rs01 = db.OpenRecordset("SELECT * FROM TaxEmergQry WHERE DataCollect.NumCD=" & Me.cmbNumDossier & ";", dbOpenDynaset)  'initialise le qdf avec un query adéquat
     
    If Not rs01.EOF Then
        rs01.MoveFirst
        While Not rs01.EOF 'Boucle pour récupérer les noms des taxons du cas choisi dans la cmbNumDossier et les affecter après concatennement à la requête SQL
            SQLTaxa = SQLTaxa & "Crstb1.[" & rs01.Fields("Taxons") & "]"
            rs01.MoveNext
            If Not rs01.EOF Then SQLTaxa = SQLTaxa & ", "
        Wend
    Else
        MsgBox "Le jeu d'enregistrements est vide"
    End If
     
     
    SQL = SQL & SQLTaxa
    SQL = SQL & " FROM Crstb1 WHERE (((Crstb1.NumCD)=" & Me.cmbNumDossier & "));"
     
     
    Me.ListNbrTaxonByDate.RowSource = SQL 'affecte le sql adéquat
    Me.ListNbrTaxonByDate.ColumnCount = rs01.RecordCount + 3 'récupère le nombre d'enregistrements parcourus + 3 (pourquoi???) pour créer le nombre de colonne adéquates
    Me.ListNbrTaxonByDate.ColumnWidths = "0cm;3cm;1,547cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm" ' défini la largeur des colonnes, il y en a plus que nécessaire pour parrer au cas où ce serait utile
    Me.ListNbrTaxonByDate.Requery
     
    rs01.Close
    Set rs01 = Nothing
    N'hésitez pas à me corriger si besoin (même si ça marche je ne suis pas certain que c'est optimal).

    Maintenant je vais m'attaquer à la création du graphique et l'export de celui-ci.

    A bientôt!

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut Suite et fin (temporaire)
    Hello à tous,

    Bon pas mal avancé dans mon formulaire. Au niveau graphique ça roule tout seul (grâce aux posts et tutos du forum )
    J'ai maintenant un formulaire avec un graphique qui s'affiche (ou la table croisée adéquate) en fonction d'un bouton bascule. Avec en plus la possibilité de récupérer automatiquement les valeurs limites de l'axe des x et l'affichage dans 3 listes indépendantes des infos adéquates.

    Merci à tous pour le forum.

    Ci-dessous le code définitif pour éventuel usage à quikenveux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Private Sub RefreshQuery()
     
    Dim SQL As String
    Dim SQLTaxa As String 'chaine qui devrait récupérer les noms de taxons pour en faire des entête de colonne
    Dim SQLGraph As String 'chaine qui contient la requete pour afficher le graphique adéquat
    Dim SQLResume As String 'chaine qui contiendra la requête pour le récapitulatif
     
    Dim Datemin As Date 'variable pour stocker la date minimale (la plus ancienne) du set de données crosstab
    Dim Datemax As Date 'variable pour stocker la date maximale (la plus récente) du set de données crosstab
     
    Dim AxeDesX As Object
     
    Dim rs01 As DAO.Recordset 'recordset pour les enregistrements
    Dim rs02 As DAO.Recordset 'recordset pour les enregistrements
     
    Dim db As DAO.Database
    Set db = CurrentDb
     
    SQL = "SELECT Crstb1.NumCD, Crstb1.DateEmergence, Crstb1.[Total Of NbrSpecimenId] As Total, "
     
    SQLGraph = "SELECT Crstb1.DateEmergence, "
     
    Set rs01 = db.OpenRecordset("SELECT * FROM TaxEmergQry WHERE DataCollect.NumCD=" & Me.cmbNumDossier & ";", dbOpenDynaset)  'initialise le qdf avec un query adéquat
     
    If Not rs01.EOF Then
        rs01.MoveFirst
        While Not rs01.EOF 'Boucle pour récupérer les noms des taxons du cas choisi dans la cmbNumDossier et les affecter après concatennement à la requête SQL
            SQLTaxa = SQLTaxa & "Crstb1.[" & rs01.Fields("Taxons") & "]"
            rs01.MoveNext
            If Not rs01.EOF Then SQLTaxa = SQLTaxa & ", "
        Wend
    Else
        MsgBox "Le jeu d'enregistrements est vide"
    End If
     
    'On fini de composer la chaine SQL
    SQL = SQL & SQLTaxa
    SQL = SQL & " FROM Crstb1 WHERE (((Crstb1.NumCD)=" & Me.cmbNumDossier & "));"
     
    'On met a jour la liste qui reprends le tableau croisé
    Me.ListNbrTaxonByDate.RowSource = SQL 'affecte le sql adéquat à la liste
    Me.ListNbrTaxonByDate.ColumnCount = rs01.RecordCount + 3 'récupère le nombre d'enregistrements parcourus + 3 (pourquoi???) pour créer le nombre de colonne adéquates
    Me.ListNbrTaxonByDate.ColumnWidths = "0cm;2,8cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm;1,2cm" ' défini la largeur des colonnes, il y en a plus que nécessaire pour parrer au cas où ce serait utile
    Me.ListNbrTaxonByDate.Requery ' met à jour la liste
     
    'Mets également a jour les légendes de la liste
    Me.LstShort.RowSource = "SELECT [TaxEmergQry].[NumCD], [TaxEmergQry].[Taxons] FROM TaxEmergQry WHERE DataCollect.NumCD=" & Me.cmbNumDossier & ";"
    Me.LstLegend.RowSource = "SELECT [TaxEmergQry].[NumCD], [TaxEmergQry].[Legende] FROM TaxEmergQry WHERE DataCollect.NumCD=" & Me.cmbNumDossier & ";"
     
    'Mets à jour la liste qui affiche les totaux et la dates de premières émergence
    'déclare la SQL adéquate
    SQLResume = "SELECT [FirstDateEmergenceBySp&CD].NumCD, [FirstDateEmergenceBySp&CD].IdGenre, [FirstDateEmergenceBySp&CD].IdEspeceParrain, First([FirstDateEmergenceBySp&CD].DateEmergence) AS [Première date émergence], Sum([FirstDateEmergenceBySp&CD].NbrSpecimenId) AS [Nbr total] "
    SQLResume = SQLResume & "FROM [FirstDateEmergenceBySp&CD] WHERE [FirstDateEmergenceBySp&CD].NumCD=" & Me.cmbNumDossier & " "
    SQLResume = SQLResume & "GROUP BY [FirstDateEmergenceBySp&CD].NumCD, [FirstDateEmergenceBySp&CD].IdGenre, [FirstDateEmergenceBySp&CD].IdEspeceParrain "
    SQLResume = SQLResume & "ORDER BY [FirstDateEmergenceBySp&CD].NumCD, [FirstDateEmergenceBySp&CD].IdGenre, [FirstDateEmergenceBySp&CD].IdEspeceParrain, First([FirstDateEmergenceBySp&CD].DateEmergence);"
     
    Me.LstResume.RowSource = SQLResume
    Me.LstResume.Requery
     
     
    'On s occupe du graphique
    'On fini de composer la chaine SQLGraph
    SQLGraph = SQLGraph & SQLTaxa
    SQLGraph = SQLGraph & "FROM Crstb1 GROUP BY Crstb1.DateEmergence, "
    SQLGraph = SQLGraph & SQLTaxa
    SQLGraph = SQLGraph & ", Crstb1.NumCD HAVING (((Crstb1.NumCD)=" & Me.cmbNumDossier & ")) ORDER BY Crstb1.DateEmergence;"
     
    Set rs02 = db.OpenRecordset("SELECT * FROM Crstb1 WHERE Crstb1.NumCD=" & Me.cmbNumDossier & " ORDER BY Crstb1.DateEmergence;", dbOpenDynaset)  'initialise le qdf avec un query adéquat
     
    If Not rs02.EOF Then
        rs02.MoveFirst
        Datemin = CDate(rs02.Fields("DateEmergence"))
        rs02.MoveLast
        Datemax = CDate(rs02.Fields("DateEmergence"))
    Else
        MsgBox "Le jeu d'enregistrements est vide"
    End If
     
     
    'On met à jour le contrôle graphique
    'Mise à jour de l'axe des x en fonction de la date maximale et minimale
    Set AxeDesX = Me.CrstbChart.Object.Application.Chart.Axes(1)
            AxeDesX.MinimumScale = Datemin     'nouvelle valeur mini de la date
            AxeDesX.MinimumScaleIsAuto = False
            AxeDesX.MaximumScale = Datemax     'nouvelle valeur maxi de la date
            AxeDesX.MaximumScaleIsAuto = False
    'affectation du SQL
    Me.CrstbChart.RowSource = SQLGraph
    Me.CrstbChart.Requery
     
    rs01.Close
    Set rs01 = Nothing
    rs02.Close
    Set rs02 = Nothing
     
    Set AxeDesX = Nothing
     
    End Sub

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 338
    Points : 229
    Points
    229
    Par défaut Fin de la fin
    Re bonjour,
    Un petit passage rapide ici pour poster le code qui me permet d'envoyer le graphique vers un signet d'un document word.
    En fait c'est un simple copier-coller ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Forms!ChartNbreTaxonByDate!CrstbChart.Action = acOLECopy 'le formulaire contenant le graphique doit être ouvert par ailleur
    wApp.ActiveDocument.Bookmarks("GraphEmergence").Range.Paste
    C'est fini pour ce post.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déssiner Graphes Access puis Exporter vers Excel
    Par mamid1706 dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2007, 15h06
  2. Réponses: 10
    Dernier message: 08/06/2006, 08h57
  3. Image exportée vers Word depuis un report access
    Par thierry0409 dans le forum Access
    Réponses: 3
    Dernier message: 21/11/2005, 10h47
  4. exporter ver word a partir de access
    Par saad_info dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 11h53
  5. [CR XI] export vers word d'un crystal de type tableau
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/07/2005, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo