Supprimer code cellule en dur dans le code VBA

Bonjour à tous le monde,

Je suis actuellement entrain d'optimiser un projet sur le quel je travail depuis quelque mois. Tout marche mais j'aimerais faire mieux et je pense que vous pouvez peut être m'aidé.

Je vous explique le "problème" que j'aimerais résoudre :

Dans chacune de mes ligne de code VBA, j'utilise le nom des cellules (A1, AE2 ....) pour les remplir or, si l'utilisateur déplace une cellule (ex: il coupe la colonne E et la décale plus loin en G dans la même feuille) le VBA rentrera toujours la données en E alors que j'aimerais du coup qu'il la rentre en G.

Par chance, les données sont bien "formaté" dans le sens ou la première colonne (A1:A9999....) est défini par le type de marchandise (unique), et la première ligne (A1:ZZZZ...1) et relative à un type de données (unique).

[u]Du coup je pense savoir comment dépatouillé mon problème c'est juste que je ne sais pas comment le codé.

[/u]

Mon idée serais de faire une recherche en croisé du typé de marchandise et du type de donné et de rentrer la donnée voulu au croisement des deux.

Je vous transmet mon fichier pour que vous ayez une idée de comment j'ai codé mon fichier

Pour comprendre mon besoin vous pouvez cliquer sur le bouton "Données marchandises" présent sur la feuille "Utilisateur", rentrer dans l'userform des valeurs sur la première colonne de données, enregistrer et regardé dans la feuille "Input Data".

D'ailleurs la feuille "INPUT DATA" est la seul concerné par mon problème (J'ai mis des $ dans toutes mes formules )

Voila j'espère que vous pourrais éclairé ma lanterne

Merci par avance et à très vite

Cordialement,

Guillaume

49devis-pour-forum.xlsm (203.02 Ko)

Bonjour guillaume6381,

Tu as réalisé un super fichier Excel complet, pourquoi laisser la possibilité à l'utilisateur de pouvoir modifier la structure des feuilles?

Si un utilisateur ne doit pas le faire il faut lui retirer la possibilité.

De plus les données saisies le sont grâce à ton formulaire, ce qui te permet de contrôler tes données, et surtout en sécuriser la saisie.

Fait en sorte que TOUTES tes données soient saisies grâce à ton formulaire, bloque la structure de ta feuille et ton problème n'est plus un problème

Si tu codes en te disant: "oui mais si l'utilisateur effacer ma feuille ou ajoute une ligne au mauvais endroit" c'est pas bon!!

Bonjour D3D9X,

Je sais bien que en théorie mon fichier n'a pas besoin d'être modifié. Cependant, je ne serai pas le propriétaire de mon fichier vois-tu ! Je le fait dans le cadre d'un stage, donc je ne serais pas là pour la maintenance si les utilisateur font n'importe quoi. De plus mon programme sera soumis à des modifications à terme que je ne peut pas prévoir par avance.

Pour ce qui et de l'utilisation, j'ai mis des userform qui ne serons pas forcement utilisé. Ce logiciel sera utiliser de manière annexe à un autre logiciel d'entreprise. Du coup les données serons au terme rentrer de manière automatique à l'ouverture de mon fichier ce qui rendra les userforms obsolète.

Mais dans l'immédiat, j'aimerais bien pouvoir me débarrassé du code que j'utilise et passer à une méthode de recherche des lignes colonne comme je l'ai suggérer plus haut (si cela est possible) pour éviter que le logiciel plante dés la première modification de l'utilisateur.

Cordialement,

Guillaume

Je ne suis pas certain que tu ai joins le bon fichier, il n'y a aucune formule avec un "$" dans la feuille INPUT DATA (qui s'appelle d'ailleurs INPUT DATA 2). De plus il n'y a que des codes VBA pour lancer les formulaires...

Même si je trouve toujours que c'est une mauvaise idée, je te propose la chose suivante pour résoudre ton problème: une procédure d'initialisation qui aura pour but de faire la correspondante colonne/donnée:

Tout en haut de ton module, tu places X variables qui permettront d'associer à une donnée sa colonne

Private cDATA1 as Integer, cDATA2 as Integer, cDATA3 as Integer, cPrix as Integer, cNOM as Integer

Private Sub initialisation
Dim nunColonne as Integer : numColonne = 1
Dim uneColonne as Integer

While Sheets("INPUT DATA 2").Cells(1,numColonne).Value <> ""
If Instr(Sheets("INPUT DATA 2").Cells(1,numColonne).Value,"DATA1")>0 Then cDATA1 = numColonne
'etc autant de fois qu'il y a de colonnes à déterminer
'tu peux utiliser une structure if elseif elseif endif!
numColonne = numColonne + 1
Wend
End Sub

Après tu n'as plus qu'à remplacer Cells(1,1) par Cells(1,cDATA1) dans tes formules.

Bonjour d3d9x,

Si, c'est bien le bon fichier c'est juste que les $ sont sur les autres feuilles. "INPUT DATA 2" (effectivement) me sert juste de passerelle pour transférer les données dans mes autre feuilles.

Effectivement, je n'ai utilisé que du VBA (je ne sais pas faire grand chose en terme de codage et le VBA me semblais adéquate sous Excel).

Merci pour ton code, par contre je ne suis pas sur de bien le comprendre.

Les données de la première ligne que tu défini comme Integer ("Private cDATA1 as Integer, ....") corresponde à chacune des mes colonnes ?

Comment ces données savent a quel cellules elles appartiennent ?

Ce que je veux dire c'est par exemple pour le croisement entre "Marchandise standard" et "Volume (m^3)" en qui se trouve en L2, je ne voit pas où, ni comment tu fait la concordance dans ton code

Désolé je n'ai pas été assez clair.

Le fait que les variables soient en dehors de toute procédure/fonction va les rendre globales. Ainsi toutes tes procédures et fonctions de ton module pourront y accéder.

Pour faire la correspondance, c'est très simple: on part du principe que la première ligne contient les titres des colonnes, mais dans un ordre que l'on ignore. On doit donc effectuer un test sur le titre.

Par exemple pour Volume (m^3), j'y associe la variable cVOLUME (colonne volume).

Private cVOLUME as Integer
'--------------- code a placer à l'intérieur de la procédure et de la boucle, cf post precedent
If Instr(Sheets("INPUT DATA 2").Cells(1,numColonne).Value,"Volume (m^3)")>0 Then cVOLUME = numColonne
'si la cellule ligne 1 et colonne numColonne contient le texte "Volume (m^3)" alors la colonne qui contient les informations de volume est la colonne n°numColonne.

Maintenant si en plus tu es une colonne pour le prix, l'une pour le nom etc ...

Private cVOLUME as Integer, cPRIX as Integer, cNOM as Integer 'etc....
If Instr(Sheets("INPUT DATA 2").Cells(1,numColonne).Value,"Volume (m^3)")>0 Then cVOLUME = numColonne
If Instr(Sheets("INPUT DATA 2").Cells(1,numColonne).Value,"Prix €")>0 Then cPRIX = numColonne
If Instr(Sheets("INPUT DATA 2").Cells(1,numColonne).Value,"Nom toto")>0 Then cNOM = numColonne
Rechercher des sujets similaires à "supprimer code dur vba"