base de données en vba

jopont

XLDnaute Impliqué
Bonsoir,
Dans le fichier joint, j'ai une base de données avec des noms...
J'ai recherché pas mal dans les forums mais je ne sais pas comment débuter pour faire des extractions et des calcul en vba.

Cette base est alimenter régulièrement et peut atteindre plusieurs milliers de ligne.

En feuille 1, je voudrais par exemple calculer le nombre d'heure pour chaque nom si l'engin est VSRM1 et la fonction CA. Il s'agit de l'équivalent de sommeprod, mais en vba je ne sais pas.

merci de votre aide, si vous avez des idées pour commencer...
 

Pièces jointes

  • Stat.xlsm
    102.5 KB · Affichages: 41
  • Stat.xlsm
    102.5 KB · Affichages: 52
  • Stat.xlsm
    102.5 KB · Affichages: 52
Dernière édition:

Gardien de phare

XLDnaute Accro
Re : base de données en vba

Bonsoir,

Sans Vba, avec un TCD et une colonne contenant le nombre d'heures...

J'aurais bien mis des segments mais je ne sais pas si 2007 supporte.
 

Pièces jointes

  • Stat.xlsx
    116.2 KB · Affichages: 37
  • Stat.xlsx
    116.2 KB · Affichages: 47
  • Stat.xlsx
    116.2 KB · Affichages: 45

Dranreb

XLDnaute Barbatruc
Re : base de données en vba

Bonsoir.

Pour une solution en VBA avec Userform pour sélectionner à l'aide de ComboBox l'ensemble qui vous intéresse, dessinez l'Userform en question, mettez un exemple de rapport dans l'ordre souhaité, je vous ferai ça en très peu de temps à l'aide de la quasi totalité, pour le coup, des modules de service de OutIdx…
Enfin non, la moitié seulement : 3 modules ordinaires (MClassement, MDictionnArbo, Utilit) et 4 de classe (ComboBoxLiés, ComboBoxMembre, SsGroup, TableIndex).
 
Dernière édition:

jopont

XLDnaute Impliqué
Re : base de données en vba

Bonjour à tous,
Tout d'abord merci pour vos contributions.
Je teste le SQL, mais j'ai une erreur du type "trop peu de paramètre"
Je vous joins le code de ma macro :
Code:
Sub Req_SQL()
Dim requete As String
Dim fct As String, Engin As String
    fct = Range("D8").Text
    Engin = Range("E8").Text ' &
    requete = "SELECT NOM, SUM(DUREE) AS Total FROM [" & "Data" & "$]  " & _
                " WHERE FONCTION='" & fct & "'AND ENGIN='" & Engin & "'" & _
                " GROUP BY NOM "  '
    Call Requete_SQL(requete)
End Sub


Sub Requete_SQL(requete As String)
' Activer la référence : Microsoft ActiveX Data Objects 2.8 Library.
Dim Cnx As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim NDF_Data As String
Dim derligne As Integer, i As Integer
    
    NDF_Data = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name

    Set Cnx = New ADODB.Connection
    With Cnx
        .Provider = "MSDASQL"
        .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & _
            NDF_Data & "; ReadOnly=False;"
        .Open
    End With
    Set Rst = New ADODB.Recordset
    Set Rst = Cnx.Execute(requete)
    
    With Sheets(1)
        derligne = .Range("B" & Rows.Count).End(xlUp).Row
        If derligne > 9 Then .Range("B10:G" & derligne).ClearContents
        For i = 0 To Rst.Fields.Count - 1
            .Cells(3, i + 1) = Rst.Fields(i).Name
        Next i
        .Range("B10").CopyFromRecordset Rst
    End With
    
    Cnx.Close
    Set Cnx = Nothing
End Sub
 

jopont

XLDnaute Impliqué
Re : base de données en vba

Finalement, j'ai réussi avec la macro ci-dessous (méthode ADO).
J'aimerais classer par ordre croissant au niveau du nombre.
Aussi comment calculer le cumul du nombre d'heure par NOM et en fonction des 2 critères fonction et engin.
Mer pour votre aide
Code:
Sub sbADO1()
Dim sSQLQry As String
Dim ReturnArray

Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset

Dim DBPath As String, sconnect As String
Dim fct As String, Engin As String
fct = Range("D8").Text
Engin = Range("E8").Text

efface
DBPath = ThisWorkbook.FullName


sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"

Conn.Open sconnect
   sSQLSting = "SELECT GRADE,NOM,PRENOM,count(*) as nbre From [Data$] WHERE FONCTION = '" & fct & "' AND ENGIN = '" & Engin & "' GROUP BY GRADE,NOM,PRENOM  ORDER BY GRADE,NOM,PRENOM "
    
    mrs.Open sSQLSting, Conn

        ActiveSheet.Range("B10").CopyFromRecordset mrs

    mrs.Close


Conn.Close

End Sub
 

jopont

XLDnaute Impliqué
Re : base de données en vba

Pour le classement en effet avec la méthode sort c'est nickel. J'ai encore appris quelquechose.
Code:
Sub classement()
Dim derligne As Integer

derligne = Range("B" & Rows.Count).End(xlUp).Row
Range("B10:R" & derligne).Sort key1:=Range("E" & derligne), _
order1:=xlDescending, Header:=xlNo

End Sub

Pour mon problème de date, si mes dates sont bien au format dd/mm/aaa hh:mm:ss, comment je pourrais faire directement dans la requête ?

merci
 

jopont

XLDnaute Impliqué
Re : base de données en vba

Merci c'est cool.
Par contre j'obtiens un nombre décimal.
Lorsque je met le format en hh:mm, c'est ok.
Comment lui dire de mettre la colonne en hh:mm dans la macro.

Aussi, dans la requête SQL, j'ai déclarer la variable Engin en tableau
Engin = Array("CCR1","CCR2")

Dans la requête SQL ça ne fonctionne pas.

Merci
 

jopont

XLDnaute Impliqué
Re : base de données en vba

Pour le SQL, j'ai fait avec :
Code:
Engin in ('CCR1', 'CCR2')
Je voulais essayé avec un tableau pour la variable Engin. Pas grave.

Pour la durée, cela fonctionne dans la feuille Data. J'ai également changé le format dans le regroupement de la requête SQL.

Encore une petite question, est-il possible de sortir le max d'heure dans un regroupement de nom et l'afficher sur une autre cellule par exemple ?

merci
 

jopont

XLDnaute Impliqué
Re : base de données en vba

J'ai essayé avec ça mais ça ne fonctionne pas :
Code:
 sSQLSting = "SELECT MAX(la_Somme) From(SELECT GRADE,NOM,PRENOM,SUM(DATE_FIN-DATE_DEBUT) AS Total_H From [Data$] WHERE FONCTION = '" & fct & "' AND ENGIN in ('FPTGP1') GROUP BY GRADE,NOM,PRENOM  ORDER BY GRADE,NOM,PRENOM) la_somme "
 

jopont

XLDnaute Impliqué
Re : base de données en vba

ça ne fonctionne pas, je voudrais que le select me ressorte la ligne du nom pour laquelle le volume d'heure est le plus grand.
Je fais mon total d'heure en fonction des critères, et je regroupe sur le nom.
J'obtiens alors un recordset avec plusieurs nom.

Ensuite je voudrais rechercher la valeur unique la plus grande dans ce recordset.

merci
 

jopont

XLDnaute Impliqué
Re : base de données en vba

En ce qui concerne le nombre de fois, count(*) as nbdate me compte toutes les fois ou il trouve le nom.
Si le nom à plusieurs lignes pour une même date, je souhaiterais qu'il me compte une fois.

Merci pour votre aide
 

jopont

XLDnaute Impliqué
Re : base de données en vba

Bonjour,
Je n'ai pas trouvé la solution à mon problème.
Je vais tenter de m'expliquer plus clairement.

Dans la requête je regroupe par nom et j'effectue la somme du nombre d'heure en fonction de deux critères.
Je souhaiterais avoir une colonne après Total_H qui me compte le nombre d'heure où l'on trouve une seul fois le nom sur une date sans critères.

Merci pour votre aide
 

Statistiques des forums

Discussions
312 300
Messages
2 087 018
Membres
103 433
dernier inscrit
nicolaseuropa