Modifier une ligne d'un code VBA

1

I have this code :

Option Explicit

Public Function Entete(Compte$, Montants As Range, _

  Optional mois$, Optional année$) As String

  On Error GoTo ErrMA

  Dim DS As Date, M As Byte, A%, c$, cler$, chn$, d&

  c = "00799999" & Format(Right(Compte, 12), String$(12, "0"))

  cler = CStr(Format(WorksheetFunction.Sum(Montants) * 100, String$(13, "0")))

  DS = Now(): If mois = "" Then M = Month(DS) Else M = Val(mois)

  If année = "" Then A = Year(DS) Else A = Val(année)

  d = Cells(Rows.Count, "G").End(xlUp).Row - 1

  chn = Format(d, String$(7, "0")) & Format(M, "00") & Format(A, "0000")

  Entete = "*" & c & cler & chn & Space$(14) & "0"

  Exit Function

ErrMA: Entete = "Vérifiez ces 2 paramètres : mois, année."

End Function

I want to modify this line :

  c = "00799999" & Format(Compte, String$(12, "0"))

« compte » always begins with 00799999 and is ‘20’ numbers long.

So when I type 103, I get     00799999000000000103

So when I type 1103, I get     00799999000000001103

So when I type 11103, I get     00799999000000011103

So when I type 999000030003458, I get 00799999000030003458

All Works fine, until I type 9999000030003458 or 99999000030003458 or 799999000030003458 or 0799999000030003458 or 00799999000030003458, I don’t get the desired result.

For example when I type 799999000030003458 I want the result to be : 00799999000030003458

And when I type 07999990000030003458 I want the result to be : 00799999000030003458.

Any help ?

https://www.cjoint.com/c/MHvkLsthQC5

rhodo Je t'attends (merci d'avance)

Posté le 21 août 2023, 12:38
par yazidioubi
Répondre
0

Bonsoir yazidioubi,

aujourd'hui, j'ai dû m'absenter longtemps ; et c'est seulement maintenant
que je peux te répondre ; c'est pour ça que ma réponse a tardé.  ;)

ton fichier en retour : https://www.cjoint.com/c/MHvu3DoChm0

rhodo

rhodo Posté le 21 août 2023, 22:57
par rhodo
0

essayer de taper le numero 00799999000030003458 dans le combobox de la fonction "entete" et pas de l'avoir mis dans une cellule excel pour pouvoir me comprendre.

Merci 'rhodo'

Posté le 22 août 2023, 09:36
par yazidioubi
0

Bonjour yazidioubi,

tu as écrit : « dans le combobox de la fonction "Entete" »

attention : on peut mettre un combobox sur un UserForm (= un formulaire) ;
mais une fonction n'a pas de combobox !  ;)

tout ce qui est à droite du nom de la fonction (et qui est entre parenthèses)
s'appelle « l'en-tête de la fonction ».

ceci quelque soit le nom de la fonction, donc même si la fonction est
nommée autrement que Entete.

juste pour info : quand il s'agit d'une sub au lieu d'une fonction,
on parle « d'en-tête de la sub » ; et une sub non plus n'a pas
de combobox !  :D

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voici une bonne nouvelle : j'ai compris où est ton problème.  :)

si tu mets ceci : =Entete(00799999000030003000;H:H;4;2023)
ça devient :  =Entete(799999000030003000;H:H;4;2023)

(VBA a enlevé les 2 zéros du début du nombre car ce sont des
zéros non significatifs)

ça retourne : *0079999930000000000000000000000200000000000010042023              0
nombre de caractères : 68 (du 1er caractère « * » au « 0 » final).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

la solution est vraiment très simple !  :)

mets ceci : =Entete("00799999000030003458";H:H;4;2023)
le 1er paramètre doit être entre guillemets.  ;)

ça retourne : *0079999900003000345800000200000000000010042023              0
nombre de caractères : 62 (du 1er caractère « * » au « 0 » final).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

je pense que cette fois, ça sera ok pour ce sujet.  ;)

rhodo

rhodo Posté le 22 août 2023, 13:35
par rhodo
0

Merci beaucoup rhodo, merci infiniment

Posté le 22 août 2023, 14:12
par yazidioubi
0

Bonsoir yazidioubi,

nouvelle version du fichier : https://www.cjoint.com/c/MHBvzRzk7O0

j'ai optimisé la fonction Entete() ; avant : 2ème paramètre : H:H, qui allait dans la variable Montants ;
maint'nant : t'as plus besoin de transmettre H:H, car j'ai supprimé le 2ème paramètre Montants.  :)

tu pourras voir que la fonction retourne bien ce qu'il faut, que ce soit à partir des nombres saisis
en colonne i "Ta saisie" OU à partir des nombres que tu mets directement dans l'en-tête de la
fonction
 (en tant que 1er paramètre, qui va dans la variable Compte)
.

formule en J2 (étendue vers le bas jusqu'en J11) : =Entete(I2;4;2023)

rappel : si tu mets en J2 : =Entete(I2) : ça mettra dans le texte retourné le mois et l'année en cours,
donc actuellement : 08 pour le mois d'août, et 2023 pour l'année.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dans le code VBA, c'est pas nécessaire de mettre le mot-clé « Public » à gauche du mot-clé
« Function » : c'est implicite ; c'est pourquoi je l'ai enlevé.  ;)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

code VBA de Module2 (16 lignes) :

Option Explicit

Function Entete(Compte$, Optional mois$, Optional année$) As String
  On Error GoTo ErrMA
  Dim DS As Date, M As Byte, A%, c$, d&, cler$, chn$
  c = "00799999" & Format(Right$(Compte, 8), String$(12, "0"))
  d = Cells(Rows.Count, "G").End(xlUp).Row - 1
  cler = CStr(Format(WorksheetFunction.Sum([H2].Resize(d)) * 100, String$(13, "0")))
  DS = Now(): If mois = "" Then M = Month(DS) Else M = Val(mois)
  If année = "" Then A = Year(DS) Else A = Val(année)
  chn = Format(d, String$(7, "0")) & Format(M, "00") & Format(A, "0000")
  Entete = "*" & c & cler & chn & Space$(14) & "0"
  Exit Function
ErrMA: Entete = "Vérifiez ces 2 paramètres : mois, année."
End Function

rhodo

rhodo Posté le 27 août 2023, 23:42
par rhodo

Si vous n'êtes pas inscrit sur le site, vous pouvez poster librement (en tant qu'invité).
Pour cela, indiquez un pseudonyme (nom d'utilisateur) et une adresse email :