Boucle conditionnelle pour les balèzes

  • Initiateur de la discussion CC_TiGeR
  • Date de début
C

CC_TiGeR

Guest
Bonjour à tous et à toutes !!!!

Je m'en viens vous poser une question qui me parait très compliquée mais qui est peut être en fait toute simple :eek:)

Voilà le pb :

J'ai un classeur avec plusieurs pages, l'une d'elle est un formulaire qui me permet de générer une ligne sur une autre des feuilles de mon classeur appelée GLOBAL. En fait je génère une ligne qui contient plusieurs informations dont une essentielle le numéro d'offre.

Maintenant à chaque fois que je rempli mon formulaire il m'insert une nouvelle ligne dans la page GLOBAL mais le problème que j'ai sait admettons que le numéro d'offre existe déjà dans cette page à ce moment là je veux remplacer la ligne existante dans GLOBAL par la nouvelle ligne issue de mon formulaire.....

Je ne sais pas si mon explication est assez claire mais c'est la question que je pose ...

L'algorithme doit être du genre :

FOR (I=0,I<lignenonvide,I++)
{
if (numerooffreligne== numerooffreformulaire)
{
remplacer ligne par ligne issue de formulaire
}
else
{
insérer ligne issue de formulaire
}
}

J'espère que kkun pourra m'aider :eek:)

D'avance merci:eek:)

Je ne connais pas grand chose aux tests type if, else if etc ... sur vba mais si kkun peut me conseillé un endroit ou apprendre ça en plus de l'aide présente je suis partant :eek:)

Merci bcp à tous et toutes :eek:)

XXXXX


CC
 
M

Michel_M

Guest
salut,

Si j'ai compris ta question, tu n'as pas besoin de boucle pour traiter ton pb:

le numéro de la colonne et la cellule de départ sont dans la colonne où tu as inscrit ton numero

si par exemple c'est la colonne A, find renvoie une erreur si il n'a pas rencontré l'occurence recherchée (numerologne)

lig doit être déclaré en integer ou en long si ton tableau est grand

On Error Resume Next
lig = Columns(1).Find(numerodoffre, [A1], , , xlByRows).Row
If Error <> 0 Then
' si erreur =>le numéro n'existe pas... instruction
Else
' sinon... le numero existe déjà...instruction
end if

on error goto 0

suite des instructions
End Sub

Michel, pas + balèze qu'un autre parce qu'il a trouvé pour une fois une solution
 
C

CC_TiGeR

Guest
Bonjours à toutes et tous :eek:)


Merci pour cette réponse michel mais ma question ne s'arrête pas là malheureusement je ne sais pas quelles sont les instruction que je dois mettre quand le numéro existe pour que ma ligne soit remplacée par la nouvelle :eek:(((

Est ce que tu vois ce que je veux dire ?

Merci d'avance :eek:)

XXX
CC
 
@

@+Thierry

Guest
Bonjour Tiger, Michel, le Forum

La réponse de Michel est très interressante bien que je n'aime pas les crochets si ce n'est pour se substituer en function evaluate.

Pour te répondre plus clairement il faudrait au moins savoir dans quoi tu saisis ton Numero_d_Offre ? tu parles de formulaire ? un UserForm ? C'est pour ceci que Michel n'a pu rester que général dans son exemple.

Si admettons c'est un UserForm, alors c'est aussi simple que le code qui te sert à incrémenter les ligne saisies dans ta plage "Global" mis à part que l'Integer (ou Long) qui te sert à trouver la derniere ligne vide va être momentanément remplacé par le "Lig" de Michel... C'est en fait le numéro de la Ligne où se trouve le numéro d'ordre existant...

Et sinon, et bien c'est ton code initial qui prend la mains après ce test...

Sans aucun idéée de ta structure mais juste pour l'idée de la construction en imaginant 4 textbox dans un UserForm et un CommandButton

Private Sub CommandButton1_Click()
Dim L As Long, Lig As Long
Dim Numero_d_Offre As String

Numero_d_Offre = TextBox1

L = Sheets("Global").Range("A65536").End(xlUp).Row + 1

On Error Resume Next
Lig = Columns(1).Find(Numero_d_Offre, After:=Range("A1"), SearchOrder:=xlByRows).Row

If Error <> 0 Then
L = Lig
End If
On Error GoTo 0

With Sheets("Global")
.Range("A" & L) = TextBox1
.Range("B" & L) = TextBox2
.Range("C" & L) = TextBox3
.Range("D" & L) = TextBox3
End With
End Sub

La Variable L peut être modifiée en cours de traitement si le test de Michel retourne une erreur...

Bonne Soirée
@+Thierry
 
M

Michel_M

Guest
Bonsoir Thierry, Tiger et le forum

Eh ben merci Thierry: c'est vrai qu'on pouvait éviter le Else avec l'astuce L=lig

la formule avec les crochets a été trouvé sur le site d'Eric Renaud: c'est vrai que evaluate est luxueux: à l'époque, je ne connaissais pas evaluate; alors j'ai pris l'habitude...

Bonne soirée à tous les 2

Michel
 
C

CC_TiGeR

Guest
Bonjour Thierry, Bonjour Michel, Bonjour à toutes et à tous :eek:)

Merci de vos réponses.

Je ne suis pas très doué en Vba et je pense que pour comprendre vraiment ce dont j'ai besoin il faudrait voir mon fichier et à la limite en discuter par mail le pb c'est que mon fichier est trop gros pour le forum :eek:(

Sinon mon formulaire en fait c'est des cellules que je rempli avec du texte et un bouton type submit qui déclenche une macro :eek:(

Je sais c pas top mais je débute alors dsl :eek:(

Merci de me dire si vous accepter de m'aider à ce mmt là je vous envoie mon fichier par bal :eek:)

Merci de tout coeur à tous les deux et aux autres membres du forums :eek:)

Cordialement.

Cédric LARCHER as CC_TiGeR
 
@

@+Thierry

Guest
Salut Cédric, Michel, le Forum

C'est déjà un très bon point pour toi de demander si tu peux nous contacter par Email, car c'est trop rare [hélas] <==== Bad Evaluate !!!, mon Outlook "mange" à son petit déjeuner un tas de mails non-solicités avec des fichiers joints...

Je ne sais franchement pas ni quand je pourrai avoir le temps d'y jetter un oeil mais envoie en utilisant la même Email.Address que tu utilises ici en prenant soin de bien indiquer dans le sujet : "Forum Excel-Downloads Fichier de Cedric".

Sinon pour te faire avancer plus vite que mon temps dispo, si ce sont des cellules qui incrémentent voici un exemple...

Bon App

@+Thierry
 

Pièces jointes

  • XLD-Report-Check-Existing.zip
    11.5 KB · Affichages: 215
C

CC_TiGeR

Guest
Re - bonjour Thierry, re - bonjour le forum :eek:)

THierry je viens de regarder le fichier exemple, c'est le principe de ce que j'ai réalisé en revanche je ne comprends pas pkoi quand j'ai un numéro identique à un numéro existant cela incrémente quand même est ce que c'est parce que j'utilise XL 1997 ?

Merci de ta réponse par avance ;o)

De toute façon je t'ai envoyé le fichier dans lequel tu comprendras surement mon besoin :eek:)

XXXXXX

Merci

A+

CC
 
@

@+Thierry

Guest
Re Cédric, le Forum

Pour le mail je ne pourrais pas me connecter avant d'être at home sweet home...

Pour ce qui est des numéros, s'agit-il de numéros "numériques" (arf la question !! lol) je m'entends, as-tu un format spécifique ? Quel est le type de numéros (Exemple 00001 ou 1 ?)

Car dans la démo si dessus je n'ai aucun problème si je tape 1 en cellule rouge, j'ai bien la ligne 35 qui est incrémentée, si je re-click sur le bouton en laissant 1 j'ai la ligne 35 qui est "écrasée"... Ensuite si je tape 2, je me retrouve en ligne 36, si je retape 1, je re-écrase la ligne 35...

Donc j'en conclus que c'est encore un coup à la Nonante Sept !! Mais étant donné que je n'ai aucun moyen d'avoir accès à cette version...

Essaie deux choses :

1) Supprime pûrement et simplement la ligne :
On Error GoTo 0
Qui est un résidu de mes tests.
Puis re-essaie le bouton

2) Avec l'enregistreur de macro qui tourne en enregistrement, tu vas dans Menu / Edition / Recherche et tu cherches quelque chose (n'importe quoi) puis tu copies/colles le code ici, pour voir comment est la syntax du "Find" sous Excel 97 (tu fais des essaies avec differents paramètres de la ListBox d'option et des CheckBox "Recherche Par Ligne" et " Cellule Entière" etc, si bien sûr çà existe sous 97 !!)

Sinon je ne vois pas plus pour l'instant...

Bon Aprèm
@+Thierry
 
N

nicolas

Guest
Yo les gens du fil,
g mis un sujet sur le forum : que pensez vous de ca??(re: liens entre classeurs)
Je crois que mon pb et celui de CC_Tiger se rejoignent.
Je suppose donc que sa solution s'adapte parfaitement à la mienne non??
a plus
koko
 
@

@+Thierry

Guest
Salut Nicolas, Re Cédric, Le Forum

Cédric, si la l'erreur sur méthode Find pose problème, on peut toujours bien sûr recourir à une boucle classique, mais ce sera forcément plus long.

Voici la même macro en boucle classique "For Each" :

Sub Reporting()
Dim WSSource As Worksheet, WSCible As Worksheet
Dim L As Long
Dim Numero_d_Offre As String
Dim Plage As Range, Cell As Range

Set WSSource = Sheets("Form")
Set WSCible = Sheets("Global")

Numero_d_Offre = WSSource.Range("B10")

L = WSCible.Range("A65536").End(xlUp).Row + 1

Set Plage = WSCible.Range("A1:A" & WSCible.Range("A65536").End(xlUp).Row)

For Each Cell In Plage
If Cell = Numero_d_Offre Then
L = Cell.Row
End If
Next

With WSCible
.Range("A" & L) = WSSource.Range("B10")
.Range("B" & L) = WSSource.Range("D12")
.Range("C" & L) = WSSource.Range("A4")
.Range("D" & L) = WSSource.Range("C13")
End With
End Sub


Pour Nicolas, il est exacte que ta question dans ce fil Lien supprimé est pratiquement identique mis à part la gestion d'un classeur distant au lieu d'une autre feuille dans le même classeur.

Vu que tu ne précises pas tes connaissances en VBA, je ne sais pas si tu es en mesure d'ouvrir et de fermer ce second classeur, mais disons que ce genre de manips sont très bien "récupérées" par l'enregistreur de macro.

Ce qu'il te faut c'est gérer ta Variable String (ici "Numero_d_Offre") probablement en Public si tu dois l'utiliser dans des Procédures Distinctes... (Une qui initialiserait ta recherche, Une qui ouvrirait le classeur ferait la mise à jour de l'enregistrement et la sauvegarde.)

Voilà Nicolas pour une consultation rapide, car çà fait un peu incruste dans le fil de Cédric.

Bon Aprèm à vous deux et au autres lecteurs / Lectrices, j'ai du taff maintenant.
@+Thierry
 
@

@+Thierry

Guest
Bonsoir Cédric, Nicolas, Michel, le Forum

J'ai bien reçu ton fichier, Cédric. En fait je ne peux pas trop y toucher sans tout refaire.

J'explique, Cédric avec ses "petits" moyens s'est très bien débrouillé.

Des Zone de Listes de la barre d'Outils "Formulaire", sur sa Feuille "Formulaire de remplissage". Ces zone de liste sont facile à "programmer"...... Sans programmation !!

Mais c'est l'enfer pour un développeur car ces listes nécessitent une feuille temporaire "Cellules Liées" qui retourne les index en référence à une feuille "Base de données"... Le tout étant récupéré par Formules "=INDEX('Base de données'!B3:B1098;'Cellules Liées'!D11)" sur une autre feuille "Cellules Temporaires" qui enfin retourne les valeurs séléctionnées de maniére linéaire.

Voilà pour le Topo !! Je tiens à confirmer à Cédric qu'il est bien parti. Son travail est correct et "relativement" fiable, bien qu'il nécéssitera une "certaine" maintenance permanente dans le temps (je pense surtout aux formules à ré-adapter au plages au fur et à mesure de l'augmentation d'enregistrement dans sa database, peut-être que nommer les plages serait un choix judicieux).

Ceci dit je n'ai pas tout refait en UserForm (qui serait le plus efficace et surtout sans maintenance dans un cas comme ceci ), car le mieux pour Cédric et de savoir déjà maîtriser ce qu'il n'a déjà créé (pas mal du tout d'ailleurs)

J'ai simplement ré-intégré un Module qui va agir sur son Bouton "ENREGISTRER", je viens de tester et çà roule. Comme il y a ce soucis "Excel 97" pour lequel je n'ai pas eu confirmation (?), je suis resté en simple boucle "For Each".

Voici le code :
Sub Reporting()
Dim WSSource As Worksheet, WSCible As Worksheet, WSForm As Worksheet
Dim L As Long
Dim Numero_d_Offre As String
Dim Plage As Range, Cell As Range

Set WSForm = Sheets("Formulaire de remplissage")
Set WSSource = Sheets("Cellules Temporaires")
Set WSCible = Sheets("GLOBAL")

Numero_d_Offre = WSForm.Range("D8")

L = WSCible.Range("B65536").End(xlUp).Row + 1

Set Plage = WSCible.Range("B8:B" & WSCible.Range("B65536").End(xlUp).Row)

For Each Cell In Plage
If Cell = Numero_d_Offre Then
L = Cell.Row
End If
Next

'(PETITE ASTUCE ENTRE AMIS !! lol)
'Maintenant on reporte les données dans la feuille "Global".
'La tendance serait de faire :
'With WSCible
'.Range("B" & L) = WSSource.Range("B8")
'.Range("C" & L) = WSSource.Range("C8")
'.Range("D" & L) = WSSource.Range("D8")
'.Range("E" & L) = WSSource.Range("E8")
'.Range("F" & L) = WSSource.Range("F8")
'.Range("G" & L) = WSSource.Range("H8")
'.Range("H" & L) = WSSource.Range("H8")
''etc etc etc
'MAIS NON !! vous n'avez pas lu, on reprend une base linéaire de 35 cellules alors ...
'ceci est bien plus simple et fait la même chose !! :

With WSCible
For C = 2 To 36 'Soit de la colonne "B" à la Colonne "AJ"
.Cells(L, C) = WSSource.Cells(8, C)
Next
'En plus Cédric gère un Hyper lien aussi, donc je l'inclu dans cette boucle :
.Hyperlinks.Add Anchor:=.Range("B" & L), Address:="http://99.999.99.99/SocieteX/Cedric/Offres_de_prix/2004/" & .Range("B" & L).Text & ".doc"
End With
End Sub

Voilà grosso modo, le travail. J'envoie le fichier à Cédric.

Bonnne Soirée
@+Thierry
 

Discussions similaires

Réponses
21
Affichages
291
Réponses
9
Affichages
139
Réponses
7
Affichages
350
Réponses
4
Affichages
213

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel