Convertir Javascript en VBA

Fermé
ButteDuLac Messages postés 495 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 24 octobre 2020 - Modifié par ButteDuLac le 2/02/2017 à 20:51
ButteDuLac Messages postés 495 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 24 octobre 2020 - 3 févr. 2017 à 16:03
Bonjour,

Dans une BDD sous Access, j'ai besoin d'un code me permettant d'accélérer la saisie dans un contrôle de champ HEURE (détails : https://forums.commentcamarche.net/forum/affich-34326541-saisie-rapide-de-l-heure#p34330117).__J'ai trouvé, dans une autre BDD où je suis utilisatrice seulement, créée en Javascript, une partie de code qui semble servir à cette fonction (notez que je ne connais pas le Javascript, c'est une simple déduction).

Est-ce qu'il est possible de traduire ce code Java en langage VBA?

function _ARR(v,d){v*=Math.pow(10,d);v=Math.round(v);return v/Math.pow(10,d)}
function _VAL(v){var r=parseFloat(v);return isNaN(r)?0:r}
function _SAE(c,o){var d=0;c += "";var f=c.length-1;if(o&1)while(c.charAt(d)==" ")d++;if(o&2)while(c.charAt(f)==" ")f--;if (f < d) f= d;return c.substring(d,f+1)}
function _HVC(h,f){if(h=="")return"";var r=f;var nPos=r.indexOf("HH");if(nPos>-1)r=r.substring(0,nPos)+h.substring(0,2)+r.substring(nPos+2,r.length);nPos=r.indexOf("MM");if(nPos>-1)r=r.substring(0,nPos)+h.substring(2,4)+r.substring(nPos+2,r.length)
nPos=r.indexOf("SS");if(nPos>-1)r=r.substring(0,nPos)+h.substring(4,6)+r.substring(nPos+2,r.length);nPos=r.indexOf("CC");if(nPos>-1)r=r.substring(0,nPos)+h.substring(6,8)+r.substring(nPos+2,r.length);return r}
function _CVH(h,f){if(h=="")return"";var e=f.indexOf("HH");if(e==-1)return"";var m=f.indexOf("MM");if(m==-1)return"";var s=f.indexOf("SS");var t=s==-1?"00":h.substring(s,s+2);var c=f.indexOf("CC");var d=c==-1?"00":h.substring(c,c+2)
return h.substring(e,e+2)+h.substring(m,m+2)+t+d}
function _EVH(e){var h=""+Math.floor(e/(100*3600));if(h.length==1)h="0"+h;e=e%(100*3600);var m=""+Math.floor(e/(100*60));if(m.length==1)m="0"+m;e=e%(100*60);var s=""+Math.floor(e/(100));if(s.length==1)s="0"+s;e=e%(100);var c=""+Math.floor(e)
if(c.length==1)c="0"+c;return h+m+s+c}
function _HSY(){var d=new Date();var h=""+d.getHours();if(h.length==1)h="0"+h;var m=""+d.getMinutes();if(m.length==1)m="0"+m;var s=""+d.getSeconds();if(s.length==1)s="0"+s;var ms=""+d.getMilliseconds();if(ms.length==1)ms="0"+ms
if(ms.length>=2)ms=ms.substr(0,2);return h+m+s+ms}
function _HVE(h){return(h.substr(0,2)*360000)+(h.substr(2,2)*6000)+(h.substr(4,2)*100)+(h.substr(6,2)*1)}
function _JGP(d){return d.forms[0]}
function _JIFN(f,n){return (f!=null&&f.name.toUpperCase()==n.toUpperCase())}
function _JOW(w,n){var f=_JGP(w.document);if (_JIFN(f,n))return w;for(var i=0;i<w.frames.length;i++){try{var r=_JOW(w.frames[i],n);if(r)return r}catch(e){}}return null}
function _GET_LIBF_MESURE_1(){return _JCIR(_JGE("LIBF_MESURE",document))}
function _SET_LIBF_MESURE_1(){_JGE("LIBF_MESURE",document).innerHTML=clWDEncode.sEncodeInnerHTML((arguments[0])+"",true,false)}
function _FRM_FORMULAIRE_AH_223_LOD(event){{PROCEDURESGLOBALESDEINTRAGESRISKNAVIGATEUR_AFFICAHGE()}}


Pouvez-vous soit m'indiquer une ressource pour le faire, soit si vous en avez la capacité, me faire la traduction? Ce serait très, très gentil!

Merci!

1 réponse

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
2 févr. 2017 à 21:20
bonsoir, je penses qu'il est assez simple de faire une fonction VBA qui fait la même chose.
es-tu certaine, cependant, qu'une fonction te permettra de réaliser ce que tu cherches? plus précisément, la fonction serait appelée quand l'utilisateur a fini de remplir le champ, pas au fur et à mesure que l'utilisateur tape des caractères dans le champ : est-ce ce que tu attends?
0
ButteDuLac Messages postés 495 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 24 octobre 2020 40
2 févr. 2017 à 23:28
Merci! Oui, vous avez très bien compris ce que je souhaite!!!
Comme je le dis, je ne m'y connais pas en Javascript, je croyais que c'était cette partie de code (extraite du code source de la page web où se trouve la BDD que j'utilise) qui permettait l'opération souhaitée.
J'imagine certainement que ça se fait en VBA, seulement je ne sais pas comment.
Je continue de chercher... si c'est simple pour vous, ça ne l'est pas pour moi, malheureusement!!! ;)
J'ai vu que vous m'avez aussi répondu sur l'autre « Question ». J'espère que je vais trouver... sinon je réfléchirai à l'idée des deux champs, mais je ne crois pas que ce soit la meilleure option...
0
ButteDuLac Messages postés 495 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 24 octobre 2020 40
2 févr. 2017 à 23:41
Oh! Me voilà sur une piste...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim VCel As String, VHeure As String, VMinute As String
' Vérifie que la saisie est faite dans la colonne des heures
If Target.Column = 3 Then ' Colonne C
' Empècher les évènements pendant les modifications
Application.EnableEvents = False
' Pour la sélection, mettre au format HH:MM
VCel = Cells(Target.Row, Target.Column).Value
' Vérifie qu'il ne s'agit pas déjà d'une heure
' et que le nombre de caractère (4) correspond
If InStr(1, VCel, ":") = 0 And Len(VCel) = 4 Then
VHeure = Left(VCel, 2)
VMinute = Right(VCel, 2)
Target.Value = VHeure & ":" & VMinute
End If
If InStr(1, VCel, ":") = 0 And Len(VCel) = 3 Then
VHeure = Left(VCel, 1)
VMinute = Right(VCel, 2)
Target.Value = VHeure & ":" & VMinute
End If

' Activer de nouveau les évènements
Application.EnableEvents = True
End If
End Sub

(Crédit : https://www.excel-downloads.com/threads/saisie-des-heures-en-vba.79572/ sauf pour la partie en gras, qui est de moi...)

C'était pour Excel VBA.

Me reste à continuer à réfléchir pour les autres options (9:00, p. ex.) et transférer le tout sous Access!!!!

À suivre...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
3 févr. 2017 à 08:10
bonjour, je pense que ceci va fonctionner sous access (j'ai juste simplifié ce que tu as proposé):
function xxx (Vcel as string) as string
   dim VHeure As String, VMinute As String
  If InStr(1, VCel, ":") = 0 And Len(VCel) = 4 Then
    VHeure = Left(VCel, 2)
      VMinute = Right(VCel, 2)
      xxx = VHeure & ":" & VMinute
end if
 If InStr(1, VCel, ":") = 0 And Len(VCel) = 3 Then
      VHeure = Left(VCel, 1)
      VMinute = Right(VCel, 2)
      xxx = VHeure & ":" & VMinute
    End If
End function
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
Modifié par pijaku le 3/02/2017 à 08:27
Salut yg,

Ce qui se résume en une seule ligne :
Function xxx(S As String) As String
If InStr(S, ":") = 0 Then xxx = Left(S, Len(S) \ 2) & ":" & Right(S, 2)
End Function
0
ButteDuLac Messages postés 495 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 24 octobre 2020 40 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
3 févr. 2017 à 16:03
Woh, ho! C'est super efficace comme service!
Maintenant, je place ce code où? Je n'ai jamais utilisé les « Fonctions » encore dans Access.
J'ai essayé directement sur le form, pas fonctionné (valeur non conforme...).
J'ai enlevé mon masque de saisie sur le contrôle. Pas fonctionné.
J'ai essayé de faire un appel à la fonction sur réception focus du contrôle... marche pas non plus! Bogue dès que je saisis un chiffre!

Soupirs! Un jour... Un jour, je serai grande, pour l'instant, je suis très, très petite en développement VBA!!!

Merci!!!
0