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

19db-v1.xlsm (43.87 Ko)

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 ...ou est l erreur ?

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

7db-v1.xlsm (44.43 Ko)

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)....

9db-v1.xlsm (38.38 Ko)

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

26db-v1.xlsm (40.00 Ko)

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 :

Rechercher des sujets similaires à "vba inserer donnees"