Suivi des facturations sous Excel

Il faut que tu fasses ta concaténation au niveau VBA
En supposant que I soit au format date et J au format standard
Facnum = Format(Range(« I15 »), « yyyymmdd ») & Range(« J15 »)

Mais comme tu as un nom d’affecté à ta zone, le mieux est de l’utiliser :
Facnum = Format(Range(« numfact »).cells(1,1), « yyyymmdd ») & Range(« numfact »).cells(1,2)

Nickel, c’est exactement ça. Mis à part le fait que je dois rentrer le 01, etc… à la main, tout va bien. Si en plus il y avait moyen que le dernier chiffre soit incrémenté automatiquement…sinon, pas trop grave, on peut pas dire que ce soit la mort, mais ça doit être faisable aussi non ?
Edité le 19/09/2007 à 13:32

Pour ne pas avoir à le taper à la main, tu vas le rechercher dans ta feuille récap, comme je te l’ai expliqué en début de nos échanges.

  • tu nommes la colonnes dans laquelle tu as tes numéros de facture
  • tu fais un balayage montant depuis le bas de la feuille pour récupérer le nom de la dernière facture enregistrée
  • tu fais la séparation entre radical (date) et index (numero de facture)
  • tu compares la date ainsi obtenue avec celle de ta facture courante (I15).
  • si égalité, tu remplis J15 avec l’index précédent incrémenté de 1
  • sinon tu remplis J15 avec 1

NB1 : si tu veux 01 au lieu de 1, tu peux utiliser aussi format en vba : Format(J15, « 00 »)
NB2 : Ce qui est intéressant, c’est de pouvoir modifier quand même à la main si on n’est pas d’accord avec le numéro proposé.
Pour cela, il faut que l’affichage de la proposition se fasse avant que tu n’appuies sur le bouton enregistrer

  • soit tu crées un bouton « générer n° Facture »
  • soit tu associes ta fonction à l’évènement workbook.open() de ta feuille facture

Ca a l’air tellement facile quand tu l’écris…

Bon, comment faire ça en pratique ?

Il ne faut pas confondre le contenu d’une cellule avec ce que l’on voit affiché dedans !..
En I15 on voit quelque chose du genre YYYYMM mais en réalité c’est une date au format DD/MM/YYYY qui est dans la cellule I15.

Je pense que la cellule I15 n’a aucun intérêt à être au format date, ou alors j’ai loupé un truc. Et en plus cela bousille une partie de la procédure de remplissage de tableau… :frowning:
Je pense donc que tu devrais utiliser une formule pour la cellule I15 :
=TEXTE(Date;« aaaamm »)

Visuellement ça ne change rien, en revanche pratiquement tu te retrouves maintenant avec un texte au format AAAAMM et non plus une date au format DD/MM/AAAA.
Edité le 20/09/2007 à 01:38

Pourtant, la procédure de remplissage de tableau fonctionne bien maintenant ?

Tu as un bonne quinzaine de lignes de programmes en tout et pour tout (peut être 20 avec les commentaires)
Je veux bien te guider si tu bloques, mais il faut que tu me dises où.
C’est dans la partie génération du numéro de cellule ou dans la partie automatisation ?

Dans les deux mon capitaine malheureusement.

Bon commence par le premier
- tu nommes la colonnes dans laquelle tu as tes numéros de facture
simplement définir un nom dans une feuille, tu sais faire. (1)

- tu fais un balayage montant depuis le bas de la feuille pour récupérer le nom de la dernière facture enregistrée
Tu sais faire aussi
Voir dans ton propre programme Facturation_Part.xls, fonction Rempli()
La différence est que ColDeb n’est pas une constante, c’est la valeur de colonne de la zone nommée en (1)

- tu fais la séparation entre radical (date) et index (numero de facture)
Comme la partie gauche est un format imposé de date, elle a une longueur fixe.
il suffit donc de prendre les 8 caractères les plus à gauche de la chaine
Pour l’index, prendre le reste de la chaine à partir du 9e caractèe, ou les 2 caractères de droite, c’est au choix

- tu compares la date ainsi obtenue avec celle de ta facture courante (I15).
un simple if entre une variable et un range. Voir + haut comment isoler la valeur de I15 dans ton range qui fait 2 cellules
Attention à la concordance des types

* si égalité, tu remplis J15 avec l’index précédent incrémenté de 1
Tu transformes la valeur d’index trouvée plus haut en un entier, tu fais +1 dessus et tu retransformes en une chaine de caractères
Le tout peut se faire en une seule ligne.

* sinon tu remplis J15 avec 1
Edit : sous forme de chaine de caractères de deux chiffres (« 01 »)

voila dans un premier temps - Bon courage
Edité le 20/09/2007 à 09:20

Pour nommer le colonne, pas de souci, ça coince sur la suite.

Comment ca, tu coinces ?
tu l’as déjà fait !

Non, je ne sais pas faire. C’est jacky67 qui avait fait tout le code quasiment.

Qu’il te l’ait écrit, c’est déjà limite …
Mais que tu n’arrives pas à extrapoler, là il y a quelque chose qui m’échappe.
Parce que c’est parfaitement clair et en plus bien commenté

Commence par essayer de comprendre ce qui fonctionne déjà, et tu verras ensuite pour le développement de nouvelles fonctionnalités.
Parce que si tu ne sais pas comment fonctionne un programme que tu vas utiliser de façon « professionnelle », il va falloir que tu en sous-traites la maintenance pour assurer la continuité de service.
Et qui dit sous-traitance dit facture et gros sous … :-(:

Je ne vois pas en quoi j’aurais besoin d’une maintenance.
Ensuite, je n’ai jamais obligé Jacky67 a m’écrire ce programme. Il me l’a gentillement proposé, c’est tout.

Je ne lui reproche rien ! (à toi non plus d’ailleurs, ne te méprends pas sur mes propos)
Simplement que je pense qu’il est plus profitable de guider quelqu’un dans une action personnelle que de lui donner du « cle en main »
C’est d’ailleurs un petit peu ce qu’il a fait en mettant ses commentaires.
Après, il ne faut pas rêver : à l’utilisation, il y a toujours besoin de modifier des détails dans un programme pur qu’il fasse exactement ce qu’on veut. C’est ca que j’appelle la maintenance. Et là autant savoir comment ca marche ; au moins dans les grandes lignes.

Mais là, on est loin du sujet qui nous préoccupe.
Soit tu fais l’effort de te plonger dans le code, et on peut continuer, soit tu attends le passage d’une bonne âme pour réaliser ton projet de A à Z

Effectivement, les commentaires dans le code m’ont permis d’apporter déjà pas mal de modifs à ce qu’il avait fait à la base.
Mais après, extrapoler un autre code à partir de celui-là, c’est moins évident.

Puisqu’on parle de moi, me voilà. :wink:

J’ai commenté le code (c’est d’ailleurs la première fois que je commente un code) pour essayer d’expliquer au mieux chaque ligne de commande et nous avons également échangé des MP sur ce forum dans lesquels j’essayais d’expliquer la « phylosophie » du code, le but recherché; bref, j’expliquéais le code mais en français (en phrases).

J’ai même proposé à Hyperion qu’on se retrouve sur MSN ou sur un chat pour qu’on puisse d’une part définir le cahier des charges en quelque sorte (fonctionnement désiré vu de l’utilisateur et fonctions à ajouter) et d’autre part lui expliquer pas à pas les commandes utilisées dans le code.
Mais ça ne s’est pas fait.

Je vais regarder ce que je peux faire pour le calcul du numéro, mais il faudrait être très précis sur qu’il faut obtenir.
Veut-on un « numéro annuel unique » (c’est le cas le plus simple), donc incrémenté du premier au dernier jour de l’année comportant ou non la date (ex1 : 2007010500001, ex2 : 2007122703247, ex3 : 00001, ex4 : 03247), ou alors veut-on un « numéro mensuel unique », donc incrémenté à partir de 1 chaque jour et comportant la date (ex1 : 20070105001, ex2 : 20071227038).
Edité le 20/09/2007 à 18:20

Merci Jacky67 pour ton aide (merci quand même à gcc au passage).
POur ce qui est de la date, le format ddddmm suffira dans le numéro de facture, mais il faudrait qu’à chaque début de mois, l’incrémentation reparte de 1.
Ex : 20070100001; 20070100004, mais pour la première facture de février, 20070200001

hyperion66 →
Pour ton format date, ce doit être aaaamm et pas ddddmm
Tu n’as pas vu un peu grand avec ton nombre de zero (100000 factures par mois …)

Jacky67 →

Il faut que tu appliques ce que tu as suggéré plus haut, à savoir les cellules I5 et J5 au format texte, avec I5 = texte(Date, « aaaamm »).
A partir de là, à supposer que tu aies identifié la cellule de référence dans la feuille Recap (on va dire un range R de 1 cellule), le « calcul » du numéro se réduit à une ligne :

Range("J5") = Format(1 - Right(R, 2) * (Left(R, 6) = Range("I5")), "00000")