cs_cantonnier
Messages postés4Date d'inscriptionlundi 15 juillet 2013StatutMembreDernière intervention15 juillet 2013
-
15 juil. 2013 à 10:11
cs_cantonnier
Messages postés4Date d'inscriptionlundi 15 juillet 2013StatutMembreDernière intervention15 juillet 2013
-
15 juil. 2013 à 17:36
Bonjour à tous,
Depuis quelques mois j'ai la charge d'encadrer une équipe technique d'environ 60 agents dans une collectivité.
Les élus qui "dirigent" ma collectivité souhaitent mettre en place un suivi informatique des tâches réalisées par les équipes dans plusieurs buts :
* Pouvoir estimer la proportion et le cout de chaque activité
* Retrouver quel agent à fait quels travaux et quand.
* Pouvoir "facturer" les interventions dûes par exemple à des accidents de la circulation ou à du vandalisme.
Pour cela, plusieurs progiciels existants ont été testés (TRUST, GIMA etc ...) mais leur cout, la complexité de leur mise en place et de leur maintenance étant bien trop élevées j'ai été chargé de "concevoir" et de mettre en place ce nouvel "outil" .
Outre les objectifs cités ci-dessus la simplicité d'utilisation (saisie et exploitations des données) est primordiale.
En effet, les personnes (au nombre de 10 à 15) qui vont utiliser cette "application" n'ont que peu de connaissance en informatique, et doivent pouvoir l'utiliser à l’issu d'une simple petite formation qui en expliquera le fonctionnement.
Je précise que je n'ai que des connaissances de base en informatique, je suis un technicien de terrain, pas dans l'informatique.
Je connais bien Excel et Calc, mais je n'y connais rien en programmation (jusques quelques notions en Quick Basic qui date de 1998)
Pour commencer j'ai créé dans bases avec les noms des agents, les travaux effectués et le "surcout" qui leur est associé, les véhicules et leur cout d'utilisation ainsi que les matériaux et leur cout.
Tout ceci est rassemblé dans un fichier excel, chaque onglet correspondant à une catégorie (agents, véhicules, localisations, matériaux, tâches etc ...)
Pour faciliter les saisies, j'avais donc commencé à "créer" une petite application sous Excel 2007, ce qui m'a également permis d'acquérir mes premières notions en visual basic.
Petites explications de l'avancée actuelle de mon projet sous Excel :
Le code lit la base des agents, et affiche dans une frame les noms de ceux-ci dans des checkbox. Puis le code lit la base des tâches, affiche dans une autre frame les noms de celles-ci dans des optionbox, au passage de la souris sur les optionbox, une bulle affiche la désignation de la tâche (lue dans la base de donnée), et si l'optionbox est enclenchée, un textbox s'affiche à coté de cette optionbox (cette partie de code n'est pas encore bien opérationnelle).
Enfin, quand l'utilisateur clique sur un bouton, le code va inscrire une ligne pour chaque agent, avec sa tâche dans une feuille du tableau excel.
Cependant, je viens d'apprendre que sa collectivité n'est pas certaine de continuer a vouloir acheter des licences Excel, il m'est également demandé de rendre mon projet compatible avec openoffice voire même avec Linux (histoire de bien compliquer les choses)
D'après ce que j'ai lu dans divers articles sur le net, il est possible de compiler des projet VB6 pour qu'ils soient compatibles avec Linux.
Première question : est-ce vrai ?
Pour commencer la "migration" de mon projet vers VB6, j'ai "exporté" mes bases de données en fichiers texte, grâce à Excel.
Pour la base des agents, j'obtiens ainsi l'exemple suivant :
ANATOLE Pierre;01/01/2013;AT1;5
Ce qui correspont à :
NOM ; date d'embauche ; grade ; échelon
Ainsi, je pense pouvoir lire facilement cette base de donnée en faisant une lecture séquentielle du fichier.
Cependant, je pense que d'ici peu, je vais me heurter a une difficulté : je ne sais pas à l'avance combien de champs il va y avoir par ligne : les utilisateurs de mon programme doivent pouvoir enrichir les bases d'autant de renseignements qu'ils veulent.
Par exemple à terme la base des agents pourrait devenir:
NOM ; date d'embauche ; grade ; échelon ; affectation ; habilitation 1 oui/non ; habilitation 2 oui/non ; etc ...
Bref, pour l'instant mon problème est dans l'adaptation du code que j'ai déjà fait pour qu'il fonctionne sous VB6.
Afin d'afficher les agents dans une frame, sous excel j'utilisais ce code :
nb_agents = Application.WorksheetFunction.CountA(Feuil2.Range("$A:$A"))
For i = 1 To nb_agents
Set ajoutagent = Frame_agents.Controls.Add("forms.checkbox.1", Name:="ajoutagent" & i) ' partie la plus importante
Frame_agents.Controls("ajoutagent" & i).Top = 15 * i
Frame_agents.Controls("ajoutagent" & i).Caption = Feuil2.Range("a" & i)
Next i
If nb_agents > 8 Then
Frame_agents.Height = 135
Frame_agents.Width = 155
Frame_agents.ScrollBars = fmScrollBarsVertical
Frame_agents.ScrollHeight = (16 * nb_agents) + 20
Else
Frame_agents.Height = 135
Frame_agents.Width = 150
Frame_agents.ScrollBars = fmScrollBarsNone
End If
J'ai donc voulu l'adapter et j'ai obtenu le code suivant :
'ficher_agents = App.Path \ liste_agents.txt
Open "c:\liste_agents.txt" For Input As #1
i = 1
Do While Not EOF(1)
Input #1, nom, datee, grade, chellon
' préparation et affichage des agents
Set ajoutagent = Controls.Add("checkbox.1", "ajoutagent" & i) ' partie la plus importante
Controls("ajoutagent" & i).Top = 15 * i
Controls("ajoutagent" & i).Caption = nom
i = i + 1
Loop
Close #1
If nb_agents > 8 Then
Frame_agents.Height = 135
Frame_agents.Width = 155
'Frame_agents.ScrollBars = fmScrollBarsVertical
'Frame_agents.ScrollHeight = (16 * nb_agents) + 20
Else
Frame_agents.Height = 135
Frame_agents.Width = 150
'Frame_agents.ScrollBars = fmScrollBarsNone
End If
End Sub
Malheureusement ça ne fonctionne pas
1- je n'arrive pas à ouvrir un fichier en chemin relatif : comme vous pouvez le lire dans les 2 première ligne de code, temporairement j'ai dû indiquer un chemin absolu.
2- les chechbox ne se créent pas et j'obtiens une erreur 711 invalid class string
3- les scrollbars ne semblent pas vouloir se paramétrer, comme vous le voyez, j'ai du temporairement désactiver les lignes s'y référant.
Quelqu'un peut-il m'aider à adapter mon petit bout de code ?
Merci d'avance pour votre aide et vos réponses constructives
cs_cantonnier
Messages postés4Date d'inscriptionlundi 15 juillet 2013StatutMembreDernière intervention15 juillet 2013 15 juil. 2013 à 11:04
Bonjour Jordane, et merci de t’intéresser à mon problème.
Ton message m'a bien aidé, mais j'ai encore un petit souci :
Voila le code une fois modifié :
fichier_agents = App.Path & "\liste_agents.txt"
Open fichier_agents For Input As #1
i = 1
Do While Not EOF(1)
Input #1, nom, datee, grade, chellon
' préparation et affichage des agents
Set ajoutagent = Controls.Add("vb.checkbox", "ajoutagent" & i, Frame_agents) ' partie la plus importante
Controls("ajoutagent" & i).Top = 400 * i
Controls("ajoutagent" & i).Caption = nom
Controls("ajoutagent" & i).Height = 300
Controls("ajoutagent" & i).Width = 2300
i = i + 1
Loop
Close #1
If nb_agents > 8 Then
Frame_agents.Height = 4000
Frame_agents.Width = 3000
'Frame_agents.ScrollBars = fmScrollBarsVertical
'Frame_agents.ScrollHeight = (16 * nb_agents) + 20
Else
Frame_agents.Height = 4000
Frame_agents.Width = 3000
'Frame_agents.ScrollBars = fmScrollBarsNone
End If
End Sub
Ma frame se redimensionne comme je l'ai indiqué, cependant, aucun checkbox ne se créé.
J'ai essayé en neutralisant le do loop pour ne "seter" qu'une seule fois ajoutagent, en pensant que j'aurai 1 checkbox, mais je n'en ai aucune
autre remarque, je suis surpris de la différence des tailles height et width entre VB sous excel et VB6 : sous excel les mesures étaient quasiment divisées par 10 par rapport à VB6 !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 15 juil. 2013 à 11:24
VBA fonctionne en échelle de points
VB6 fonctionne par défaut en échelle de twips
Intéresse-toi au scalemode sous VB6
Intéresse-toi par ailleurs aux groupes de contrôles indexés sous VB6. Ils te faciliteront la vie .
Fais ce petit test sur un projet tout neuf :
sur un form form1 un bouton de commande command1 et une checkbox check1 dont la propriété index 0 et la propriété visible false
Private Sub Check1_Click(Index As Integer)
MsgBox "tu as cliqué sur la checkbox check1(" & Index & ")"
End Sub
Private Sub Command1_Click()
For i = 1 To 5
Load Check1(i)
With Check1(i)
.Left = i * Check1(0).Width
.Visible = True
.Caption = "check1(" & i & ")"
End With
Next
End Sub
Il ne s'agit là que d'un exemple très grossier, juste pour te faire comprendre.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 15 juil. 2013 à 11:49
Salut
ÿÞANATOLE pierre
C'est parce que ton fichier a été enregistré comme un fichier texte où les 2 premiers octets (FF FE) représentent le codage international utilisé, UTF-8 en général ou Unicode.
Cela permet aux logiciels qui ouvriront ce fichier de savoir interpréter les accents ou autres signes particuliers liés au langage (allemand, chinois, ...)
Comment as-tu généré ce fichier ?
Depuis Excel, tu l'as dit, mais avec quel format ?
Si tu enregistres chaque feuille au format CSV, tu ne devrais pas avoir ces caractères d'entête.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 15 juil. 2013 à 11:50
Ru devrais peut-être également "jeter un oeil" à ce petit source déposé il y a 7 ans par mon "frère jumeau" ===>>
Tapez le texte de l'url ici. Je pense que cela t'intéressera et te rendra service...
Il y traite de textboxes, parfaitement remplaçables par des checkboxes, hein ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Je suis pas assez masochiste pour tout lire. Ce que j'en dis, c'est qu'il n'est plus obligatoire d'avoir Excel pour écrire des fichiers Excel, ou même tout fichier Office, pour les versions Office 2007 et suivantes. Il suffit d'utiliser VB.net et la norme OpenXML. Il y a même un composant libre et gratuite (EPPPlus) qui peut mâcher le travail. Les versions Express de Visual Studio sont gratuites et conviennent parfaitement. Pour utiliser EPPPlus, il est préférable d'utiliser VS 2012 Express parce que le produit est compatible avec NuGet et que EPPPlus est disponible via NuGet.
Et puis, sauf horreur de ma part, on peut trouver des versions du Framework .net compatibles avec d'autres systèmes d'exploitation que Windows.
cs_cantonnier
Messages postés4Date d'inscriptionlundi 15 juillet 2013StatutMembreDernière intervention15 juillet 2013 15 juil. 2013 à 17:36
@ ucfoutu =>
Bonjour, et merci de t'interesser à mon problème.
j'ai commancé à étudier des scripts et liens. ca me permets d'enrichir mes connaissances. Merci !
@ Jack =>
Bonjourn, et merci également de te pencher sur mes questions.
Effectivement, j'avais expoté ma base en txt depuis Excel.
J'ai recommancé en l'exportant en CSV et ça va va beaucoup mieux.
Cependant, en l'exportant en CSV le séparateur des différents champs est le point virgule. Le hic c'est que si je tapele code suivant, j'ai une erreur.
input#1, nom ; datee ; garde ; chelon
D'autre part, comment faire quand je ne connais pas le nombre de champs qui compose chaque ligne (comme expliqué dans mon premier message). ?
Je pense qu'il me faudrait utiliser lineimput mais je ne sais pas comment m'y prendre ...
Autre question : je créé un textbox juste a côté d'un optionbutton toujours selon la même méthose, à savoir :
Set ajouttache = Controls.Add("vb.optionbutton", "ajouttache" & i, Frame_agents)
Set ajoutqtetache = Controls.Add("vb.textbox", "ajoutqtetache" & i, Frame_agents)
Comment faire pour que le textbox ne soit visible que si l'optionbutton qui lui est "associé" (I identique) est enclenché ?
J'ai bien pensé faire un truc dans ce genre :
for K=1 to 5
if controls("ajouttache"&k)=true
then
controls("ajoutqtetache"&k).visible =true
end if
mais où mettre ce bout de code ? quel évenement pour le déclencher ?