VBA insérer des données
Bonjour tout le monde
Je suis débutant en vba et mon probleme est le suivant:
Dans une feuille nommée "Formulaire de saisie" j'ai crée un Userform avec un certain nombre de textbox pour faciliter la saisie...jusqu'a la tout va bien.
La complexité apparaisse quand j'ai essayé d’utiliser un textbox dans le meme userform pour alimenter une autre feuille nommée "Sous produit".
En effet, dans la feuille "Sous produit", il ya deux variable "le mois" et le nom de "Famille produit"
l'idée c est qu'une fois appuyer sur le bouton "transférer"de l'Userform, le nom de sous produit (ex: Produit A) doit apparaître DEUX FOIS consécutifs dans la feuille "SOUS PRODUIT" sous le mois et le produit qui lui corresponds(Cellule D5 et H5 de la feuille Formulaire de saisie)..
Mon code bloque dans cette ligne :
Lgn = .Range(SecondAdress).End(xlDown).Row + 1
....ci joint le fichier en question
le CODE en question
Private Sub CommandButton1_Click()
Dim Sous_produit As Long
Sous_produit = Worksheets("Sous_produit").Select
x = Range("C1")
m = Range("B1")
With Worksheets("Sous_produit").Range("A:A")
Set c = .Find(m, LookIn:=xlValues, Lookat:=xlWhole)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Set c = .Find(x, after:=Range(firstaddress), LookIn:=xlValues, Lookat _
:=xlPart)
SecondAddress = c.Address
Lgn = .Range(SecondAdress).End(xlDown).Row + 1
.Cells(Lgn, 1) = Controls("Textbox1")
.Cells(Lgn + 1, 1) = Controls("Textbox1")
End With
Unload Me
End Sub
MERCI BEAUCOUP POUR L'AIDE
Bonjour,
Deux conseils :
1- en entête de chacun de tes modules, saisir : Option Explicit.
2- déclarer systématiquement toutes les variables.
Cela t'aurait permis de voir que SecondAddress n'est pas écrit de la même manière dans son affectation et dans son utilisation.
Tu as écris :
SecondAddress = c.Address
Lgn = .Range(SecondAdress).End(xlDown).Row + 1
Manque un d => plantage.
Donc suit déjà mes deux conseils, corrige cette erreur et reviens ici pour la suite.
Bonjour je pense que Ton problème c'est que tu écris dans une arborescence et du coup ta macro ne sait pas où elle doit rentrer ce que tu as inscrit .
A+
merci pour les reponses
pijaku suite a tes deux conseils voila mon nouveau code ...mais il me sort "erreur de compilation"
[code][/Option Explicit
Private Sub CommandButton1_Click()
Dim x, m, c, d As Long, firstaddress, SecondAddress, Sous_produit As Long
Sous_produit = Worksheets("Sous_produit").Select
x = Range("C1")
m = Range("B1")
With Worksheets("Sous_produit").Range("A:A")
Set c = .Find(m, LookIn:=xlValues, Lookat:=xlWhole)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Set c = .Find(x, after:=Range(firstaddress), LookIn:=xlValues, Lookat _
:=xlPart)
SecondAddress = c.Address
End With
d = Range(SecondAddress).End(xlDown).Row + 1
.Cells(d, 1) = Controls("Textbox1")
.Cells(d + 1, 1) = Controls("Textbox1")
End With
Unload Me
End Sub
code]
merci encore
Effectivement.
Et je sens qu'on n'est pas sorti du sable.
T'inquiète pas, si tu as du temps, on va y arriver.
Commençons donc par le début.
1- Que penses tu faire avec cette ligne :
Dim Sous_produit As Long
Sous_produit = Worksheets("Sous_produit").Select
Si c'est juste pour rendre la feuille "Sous-produit" active, oublie. Cela ne sert à rien.
Utilises plutôt un bloc With End With comme tu le fait après :
With Worksheets("Sous_produit")
x = .Range("C1")
m = .Range("B1")
End With
2- Pour se référer à un Range de la feuille citée dans le bloc With, il te faut mettre un point devant.
Essaie ce test dans un nouveau classeur :
Sub test()
Sheets("Feuil1").Range("A1") = 1
Sheets("Feuil2").Range("A1") = 2
Sheets("Feuil1").Select
With Sheets("Feuil2")
MsgBox .Range("A1") & " : ici c'est bien de la feuil2 qu'il s'agit"
MsgBox Range("A1") & " : ici c'est de la feuil1 (Active) qu'il s'agit"
End With
End Sub
T'as raison pijaku
modification de code
il me donne les deux lignes maintenant sans probleme mais au dessous de la ligne A `: voir le fichier
j ai besoin d une reponse assez rapide si c est possible pour mon travail
Option Explicit
Private Sub CommandButton1_Click()
Dim x, m, c, d As Long, firstaddress, SecondAddress, Sous_produit As Long
With Worksheets("Sous_produit")
x = .Range("C1")
m = .Range("B1")
End With
With Worksheets("Sous_produit").Range("A:A")
Set c = .Find(m, LookIn:=xlValues, Lookat:=xlWhole)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Set c = .Find(x, after:=Range(firstaddress), LookIn:=xlValues, Lookat _
:=xlPart)
SecondAddress = c.Address
d = .Range(SecondAddress).End(xlDown).Row + 1
.Cells(d, 1) = Controls("Textbox1")
.Cells(d + 1, 1) = Controls("Textbox1")
End With
Unload Me
End Sub
merci
Ta macro passe sans erreur dans le fichier fournit.
Donc, je ne sais pas ce que tu veux faire ,ni ce qui plante...
Merci pour tes reponses
en faite Dans la feuille Sous-produit, il ya le mois de janvier par exemple et au dessous on trouve les familles- produits (A,B,C,D,E,F,G)
Je veux qu’une fois je choisi dans la feuille saisie de données (Cellule C5 et D5) le mois de Janvier par exemple et la famille-produit , le sous produit que je saisie dans l’userform vient s’ajouter en double sous la famille-produit qui lui corresponds
C est a dire il ya deux variables : le mois et la famille-produit
Mon macro ne fait pas ca maintenant et je sais pas ou ca beug
Ci-joint le fichier
merci encore
Desolé je veux dire..
...Je veux qu’une fois je choisi dans la feuille saisie de données (Cellule D3 et H3)....
C'est ta conception du fichier qui ne convient pas.
Il te trouve bien, par exemple, le sous-produit C en Mars.
Par contre, pour l'insertion des données tu effectues un End(xlDown) qui te "propulse", si rien n'est saisi directement sous le "C", au niveau du "D", sous produit suivant.
Il convient donc d'insérer de nouvelles lignes directement sous le sous-produit trouvé et d'y placer tes valeurs.
Pour cela essaye ceci :
Option Explicit
Private Sub CommandButton1_Click()
Dim x, m, c, d As Long, firstaddress, SecondAddress, Sous_produit As Long
With Worksheets("Sous_produit")
x = .Range("C1")
m = .Range("B1")
End With
With Worksheets("Sous_produit").Range("A:A")
Set c = .Find(m, LookIn:=xlValues, Lookat:=xlWhole)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Set c = .Find(x, after:=Range(firstaddress), LookIn:=xlValues, Lookat _
:=xlPart)
d = c.Row + 1
Rows(d).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows(d).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
.Cells(d, 1) = Controls("Textbox1")
.Cells(d + 1, 1) = Controls("Textbox1")
End With
Unload Me
End Sub
ps : je ne comprends pas pourquoi tu vveux placer tes valeurs sur 2 lignes :
.Cells(d, 1) = Controls("Textbox1")
.Cells(d + 1, 1) = Controls("Textbox1")
merci pour tes reponses rapides
En faite je ne veux pas que les lignes soient créer, parceque j’aurai des formules excel dans les autres colonnes ..je veux simplement que le nom du sous produit trouve le mois et la famille du produit qui lui corresponds et qu’il se case sagement au dessous
Je donne un exemple
Pour le mois de janvier et la famille produit C
Une fois je saisie dans l’userform le nom de sous produit qui corresponds a janvier et au famille C, j’aurai :
Janvier
C
Sous produit 1
Sous produit 1
Une fois je saisie un autre sous produit qui corresponds encore a janvier et au famille C, J’AURAI
Janvier
C
Produit 1
Produit 1
Produit 2
Produit 2
Ainsi de suite
Voila et pour ta question, c est pour des raisons statistiques que je répète le sous produit 2 fois parceque il ya d autres formules dans les autres colonnes
merci
Ma procédure fait exactement ce que tu souhaites.
L'as tu essayée???
Oui Je l’ai essayé mais il écrase les données qui vient d’etre saisie et le remplace par la nouvelle saisie et insere deux lignes dans le formulaire de saisie que je sais pas pourquoi
Merci encore pour ton temps
ci-joint le fichier ou j’ai copper/coller ton code
Rebonjour, Avec ton code j'ai deux petits soucis:
1-il insere deux lignes au dessous de la famille-produit et introduit le sous-produit...donc a la fin de saisie je me retrouve avec le sous produit 1 en bas de la liste
2- je veux eviter qu'il insere des lignes..a cause des formules
en gros je veux une simple coper/coller en cascade dans la ligne A du feuille sous produit sans inserer des lignes
je continue a chercher
merci quand meme pour l'aide
Bonjour,
Voici donc le code à placer dans le module de ton UserForm :
Option Explicit
Private Sub CommandButton1_Click()
Dim x, m, c, d As Long, firstaddress, SecondAddress, Sous_produit As Long
With Worksheets("Sous_produit")
x = .Range("C1")
m = .Range("B1")
End With
With Worksheets("Sous_produit").Range("A:A")
Set c = .Find(m, LookIn:=xlValues, Lookat:=xlWhole)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Set c = .Find(x, after:=Range(firstaddress), LookIn:=xlValues, Lookat _
:=xlPart)
d = Calcul_Ligne(Worksheets("Sous_produit"), c.Row)
.Cells(d, 1) = Controls("Textbox1")
.Cells(d + 1, 1) = Controls("Textbox1")
End With
Unload Me
End Sub
Private Function Calcul_Ligne(Ws As Worksheet, LigDep As Long) As Long
With Ws
Do
LigDep = LigDep + 1
If .Cells(LigDep, 1) = "" Then Calcul_Ligne = LigDep: Exit Do
Loop
End With
End Function
Merci pijaku T une STAR
Ca marche impeccable
probleme resolu
Merci encore
De rien.
Si ton sujet est "résolu", je t'invite à l'indiquer comme tel :