Adaptation code VB Excel 2007 pour VB6

cs_cantonnier Messages postés 4 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2013 - 15 juil. 2013 à 10:11
cs_cantonnier Messages postés 4 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 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

8 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
15 juil. 2013 à 10:40
Bonjour,
Je n'ai pas le temps de tout regarder, mais déjà :
Pour ce qui est du chemin "relatif", il faut utiliser la concaténation..

'ficher_agents = App.Path \ liste_agents.txt
' devient :
ficher_agents = App.Path &"\liste_agents.txt"


Ensuite pour l'ajout des controls, il me semble que tu as deux erreurs :
La première, la syntaxe de ta commande...
Je pense que ça devrait être :
Controls.Add("VB.checkBox", "Son_Nom","sa_frame")
*VB.CHECKBOX étant le type de control à ajouter

Et l'autre point concerne l'ajout des controls.. tu "SET" toujours la même variable... ça ne va pas.
En gros, il faudrait que tu fasse :
Set ajoutagent = ...
Set ajoutagent2 = ...
Set ajoutagent3 = ..

A mon avis, passe par un tableau de controls.

Voilou, déjà avec ça tu devrais pouvoir avancer



Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
cs_cantonnier Messages postés 4 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 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 !
0
cs_cantonnier Messages postés 4 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2013
15 juil. 2013 à 11:12
Ca y est, il me suffisait d'ajouter cette petite ligne :
Controls("ajoutagent" & i).Visible = True


Par contre, je ne comprends pas, le premier nom, au lieu de s’appeler ANATOLE pierre, j'ai 2 caractères bizares juste avant :
ÿÞANATOLE pierre

Ca vient de quoi ?
Ca ne le fait qu'au premier nom, les autres sont correctement écrit.

Pour info j'arrive à "seter" sans problème ajoutagent : ma boucle do loop fonctionne correctement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
0
Utilisateur anonyme
15 juil. 2013 à 17:34
Bonjour,

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.
0
cs_cantonnier Messages postés 4 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 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 ?

Merci d'avance pour vos précieux conseils :)
0
Rejoignez-nous