Programme VBA

Résolu/Fermé
Alex - 12 juil. 2013 à 09:20
 Alex - 12 juil. 2013 à 17:07
Bonjour à tous,

Je débute tout juste dans le VBA pour le projet que je suis en train de faire, et sur lequel je galère depuis maintenant une semaine. Je vous expose donc mon problème :
J'ai un fichier excel qui contient un tableau dont les informations, situées en ligne, étant N° de demande, société, adresse, téléphone, N° d'affaire, etc.. Lorsque l'on remplit le tableau, chaque ligne correspondra donc à une nouvelle demande avec les informations sur cette demande.
L'objectif de mon programme est que, dès qu'un nouveau numéro de demande est tapée dans une ligne de la colonne N° de demande, un fichier référence(inclut en masqué dans le classeur) s'ouvre automatiquement avec le nom de ce numéro de demande : Fiche N°... (partie déjà réalisé avec une procédure Worksheet_change). Puis, au fur et à mesure que l'utilisateur complète les cellules suivantes de la ligne, ces informations sont automatiquement complétées dans le fichier référence ouvert dans les cellules appropriées.

J'espère mettre bien fait comprendre.
Pouvez vous donc me donner des pistes ou me dire de quelle manière procéder pour atteindre cet objectif?

Merci d'avance

16 réponses

melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 09:29
bonjour,

je ne suis pas sûre d'avoir tout compris.
Mais pour qu'une feuille soit égale à une valeur d'une autre feuille, le code est :

Sheets("Feuil1").cells(1,1) = sheets("Feuil2").cells(3,4)

'==> ce qui signifie que la cellule de la feuille 1 de la ligne 1 colonne 1 est égal à la cellule de la ligne 3 colonne 4 de la feuille 2.
'si ton nom de feuille pas de pb :
Sheets(a).cells(1,1) = sheets("Feuil2").cells(3,4)

'a est une variable et contient le nom de la feuille
0
Merci de ta réponse,
Oui mais je voudrais trouver un système pour que en gros à chaque fois qu'une cellule est modifiée dans ma première feuille, le fichier se mette à jour afin que l'information qui vient d'être inscrite dans cette cellule se remplisse dans la seconde feuille grâce à ce que tu viens de donner.
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 11:32
difficile de comprendre, mais utilise et adaptes ce code :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Sheets("Feuil1").Cells(Target.Row, Target.Column) = ActiveSheet.Cells(Target.Row, Target.Column)


End Sub

Voici ce que fait ce code :
disons que tu as mis ce code dans une feuille nommée ABC
disons que tu modifies la cellule B4

Alors la cellule B4 de la feuille 1 sera égal à la cellule B4 de la feuille2.

target : signifie la cellule que tu as modifié
target.row : permet de récupérer le numéro de ligne de la cellule que tu modifies
target.column : le numéro de colonne.
0
Est-il possible d'utiliser ce code avec par exemple des Offset etc...? Je ne peux donner dans mon programme de cellule exacte puisque celà dépend quelle cellule va utiliser l'utilisateur. En gros s'il utilise la cellule A5, il faudra retranscrire le contenu de A5 puis le contenu de toute la ligne correspondante (B5,C5,D5,etc..) dans une autre feuille.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 15:30
Re,

la transcription que tu indiques :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

if target.Row = 5 and Target.column = 1 then

Sheets("Feuille origine").Rows(target.row).Copy Sheets("Feuille destinataire").Rows(target.row)
end if
End Sub

==> la macro précédente indique que si la cellule modifiée est la ligne 5 (target.row=5) et colonne A (target.column =1)

alors tu copies la ligne 5 de la feuille origine (Sheets("Feuille origine").Rows(target.row).Copy ) pour la coller dans la ligne 5 de la feuille destinataire Sheets("Feuille destinataire").Rows(target.row)



Maintenant, si dès que tu modifies une cellule, faut recopier la ligne :


Private Sub Worksheet_SelectionChange(ByVal Target As Range)


Sheets("Feuille origine").Rows(target.row).Copy Sheets("Feuille destinataire").Rows(target.row)

End Sub

Dès que tu modifies une cellule, la ligne entière sera copiée.

Il faudrait que tu me dises exactement et précisément ce que tu veux faire parce que je ne suis plus sûre de savoir ce que tu veux et du coup, je te donnes du code mais qui ne te convient pas.
0
Je ne sais pas comment t'envoyer mon fichier excel, je suis parti sur un autre code au final, j'espère qu'il te fera comprendre ce que je fais :


'Lorsque un nombre est entré dans une cellule de la colonne des N° de demandes, une FIT s'ouvre automatiquement avec le N° de demande correspondant.
'Au fur et à mesure que les informations sont entrées manuellement dans le tableau, la FIT se remplie.


Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

Dim Contact As String
Dim Société As String
Dim Adresse As String
Dim Téléphone As String
Dim DemandéPar As String
Dim ChargéA As String
Dim Echéances As String
Dim Statut As String
Dim Affaire As String
Dim KeyCells2 As Range
Dim KeyCells3 As Range
Dim KeyCells4 As Range
Dim KeyCells5 As Range
Dim KeyCells6 As Range
Dim KeyCells7 As Range
Dim KeyCells8 As Range
Dim KeyCells9 As Range
Dim KeyCells10 As Range
Dim Valeur As String 'La variable Valeur va contenir le nombre que l'on tape dans la cellule utilisée de la colonne N°de demande.
Dim KeyCells As Range 'La variable KeyCells définie les cellules pour lesquelles l'ouverture d'une FIT référence se déclenchera.

Set KeyCells = Range("A3:A203")
Valeur = Target.Value
If Valeur = "" Then
End If
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Call Ouverture_FIT(Valeur)
'Si la valeur contenue dans l'une des KeyCells est modifiée, et différente du vide, on apelle la procédure Ouverture_FIT.
Else:
End If

Set KeyCells2 = KeyCells.Offset(0, 1)
Contact = Target.Value
If Contact = "" Then
End If
If Not Application.Intersect(KeyCells2, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells3 = KeyCells.Offset(0, 2)
Société = Target.Value
If Société = "" Then
End If
If Not Application.Intersect(KeyCells3, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells4 = KeyCells.Offset(0, 3)
Adresse = Target.Value
If Adresse = "" Then
End If
If Not Application.Intersect(KeyCells4, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells5 = KeyCells.Offset(0, 4)
Téléphone = Target.Value
If Téléphone = "" Then
End If
If Not Application.Intersect(KeyCells5, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells6 = KeyCells.Offset(0, 5)
DemandéPar = Target.Value
If DemandéPar = "" Then
End If
If Not Application.Intersect(KeyCells6, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells7 = KeyCells.Offset(0, 6)
ChargéA = Target.Value
If ChargéA = "" Then
End If
If Not Application.Intersect(KeyCells7, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells8 = KeyCells.Offset(0, 7)
Echéances = Target.Value
If Echéances = "" Then
End If
If Not Application.Intersect(KeyCells8, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If

Set KeyCells10 = KeyCells.Offset(0, 9)
Affaire = Target.Value
If Affaire = "" Then
End If
If Not Application.Intersect(KeyCells10, Range(Target.Address)) Is Nothing Then
Call Remplissage_FIT(Valeur, Contact, Société, Adresse, Téléphone, DemandéPar, Affaire, ChargéA, Echéances)
Else:
End If



End Sub


Sub Ouverture_FIT(ByVal Valeur As String)

Sheets("FIT").Visible = True
Sheets("FIT").Copy Before:=Sheets(1)
Sheets("FIT").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("FIT (2)").Name = "FIT N°demande " & Valeur
Sheets("FIT N°demande " & Valeur).Range("I17").Value = Valeur
'Ouvre une FIT à partir de la FIT référence cachée et y remplit le numéro de demande.

End Sub



Sub Remplissage_FIT(ByVal Valeur As String, ByVal Contact As String, ByVal Société As String, ByVal Adresse As String, ByVal Téléphone As String, ByVal DemandéPar As String, ByVal Affaire As String, ByVal ChargéA As String, ByVal Echéances As String)

Sheets("FIT N°demande " & Valeur).Range("D16").Value = Contact
Sheets("FIT N°demande " & Valeur).Range("D18").Value = Société
Sheets("FIT N°demande " & Valeur).Range("D20").Value = Adresse
Sheets("FIT N°demande " & Valeur).Range("D22").Value = Téléphone
Sheets("FIT N°demande " & Valeur).Range("I15").Value = DemandéPar
Sheets("FIT N°demande " & Valeur).Range("I21").Value = ChargéA
Sheets("FIT N°demande " & Valeur).Range("I23").Value = Echéances
Sheets("FIT N°demande " & Valeur).Range("I19").Value = Affaire

End Sub



J'ai avec ce code un nouveau problème puisque j'ai l'erreur d'éxecution 9 "l'indice n'appartient pas à la sélection à la ligne que j'ai mis en gras
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 16:01
Coucou,

Je comprends mieux.
Afin de pouvoir t'aider et je le peux, il faudrait que j'ai la structure de ton fichier.
Autrement dit, dans quelle colonne est ton N° demande, Contact, Société... de ta feuille que tu modifies.

Ainsi, je pourrais te simplifier ton code et faire en sorte qu'il fonctionne car je crois savoir pourquoi ca ne fonctionne pas.

Pour mettre ton fichier, faut passer par cijoint.com
0
Voici le lien : http://cjoint.com/?3GmqiGKUoVZ

On a donc la feuille "Demandes" qui correspond au tableau que l'utilisateur remplit, et en caché, la feuille FIT qui doit être générée et remplie par le programme au fur et à mesure que l'utilisateur remplie le tableau. On a donc une nouvelle feuille FIT pour chaque nouvelle ligne dans le tableau.

Voilà, en espérant que tu comprendras mieux le problème et que tu auras une solution :) merci d'avance !
0
Les feuille techniciens et clients ne sont pas à prendre en compte pour l'instant!
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 16:18
Coucou,

C'est bien ce que je pensais, j'ai simplifié ton code, vois si ca fait ce que tu veux et dis moi si tu as des pbs :

https://www.cjoint.com/c/CGmqrNeJZNM
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 16:20
tu regarderas mais il y a peut être une erreur sur N° affaire
remplaces la cellue : cells(target.row,9) par cells(target.row,10)
0
C'est génial !! Merci beaucoup ça marche ! Le code est beaucoup plus simple, tu peux m'expliquer en gros ce que tu as fait ?? :) Merci beaucoup en tout cas !
Juste deux petites choses :
-d'une part, lorsque je met un numéro de téléphone (ex: 0688776655) la cellule m'affiche 688776655, comment faire pour garder le zéro??
-d'autre part, lorsque je rentre un numéro de demande (ex: 13009073280) la cellule correpondante de la FIT m'affiche 1,3009E+10

Sais tu comment résoudre ces deux petites choses ?
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 16:36
Coucou,

je t'explique ton code et oui je sais résoudre tes2 petits pbs :
tu recopies dans vb et en vert, les commentaires

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

Dim valeur As String 'La variable Valeur va contenir le nombre que l'on tape dans la cellule utilisée de la colonne N°de demande.


valeur = Cells(Target.Row, 1) ' valeur = cellule de la ligne modifiée, colonne 1

If Target.Column = 1 Then ' si la cellule modifiée est dans la colonne 1, alors on crées ta feuille en appelant ta macro
Call Ouverture_FIT(valeur)
Else 'i l'on modifie une autre colonne
Sheets("FIT N°demande " & valeur).Range("D16").Value = Cells(Target.Row, 2) 'Contact D16 = ligne modifiée colonne 2
Sheets("FIT N°demande " & valeur).Range("D18").Value = Cells(Target.Row, 3) 'Société : D18 = ligne modifiée colonne 3
Sheets("FIT N°demande " & valeur).Range("D20").Value = Cells(Target.Row, 4) 'Adresse : D20 = ligne modifiée colonne 4

Sheets("FIT N°demande " & valeur).Range("D22").Value = Cells(Target.Row, 5) 'Téléphone: D22 = ligne modifiée colonne 5


Sheets("FIT N°demande " & valeur).Range("I15").Value = Cells(Target.Row, 6) 'DemandéPar: I15 = ligne modifiée colonne 6


Sheets("FIT N°demande " & valeur).Range("I21").Value = Cells(Target.Row, 7) 'ChargéA: I21 = ligne modifiée colonne 7


Sheets("FIT N°demande " & valeur).Range("I23").Value = Cells(Target.Row, 8) 'Echéances: I23 = ligne modifiée colonne 8


Sheets("FIT N°demande " & valeur).Range("I19").Value = Cells(Target.Row, 9) 'Affaire: I19 = ligne modifiée colonne 9


End If


End Sub


Sub Ouverture_FIT(ByVal valeur As String)

Sheets("FIT").Visible = True
Sheets("FIT").Copy Before:=Sheets(1)
Sheets("FIT").Select
ActiveWindow.SelectedSheets.Visible = False
Sheets("FIT (2)").Name = "FIT N°demande " & valeur
Sheets("FIT N°demande " & valeur).Range("I17").Value = valeur
'Ouvre une FIT à partir de la FIT référence cachée et y remplit le numéro de demande.

End Sub
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
12 juil. 2013 à 16:38
-d'une part, lorsque je met un numéro de téléphone (ex: 0688776655) la cellule m'affiche 688776655, comment faire pour garder le zéro??

sur la colonne N° de téléphone : tu fais cliques droit, tu choisis spécial et dans type : Numéro de téléphone

-d'autre part, lorsque je rentre un numéro de demande (ex: 13009073280) la cellule correpondante de la FIT m'affiche 1,3009E+10

Pour ca, agrandis ta colonne et tu verras que tu verras tous les chiffres.
0
Super ! Merci beaucoup pour ton aide !
0
J'en reviens pas d'avoir galérer avec des programmes super longs plusieurs procédures etc pour me retrouver avec un code si simple et court ahah ! :p
Encore merciiiiiiiiii !!
0
Encore une chose !!!! :p Du coup lorsque par exemple il y avait "5" dans la première colonne et que je le supprime, le programme repère une modification dan la cellule et crée donc une FIT alors que la cellule est vide, comment faire?
Egalement, au moment de la création de la FIT après avoir rempli une cellule de la colonne 1, je me retrouve sur la feuille des clients, comment ça se fait ??
0