IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Insérer ligne suivant combobox et comparaison numérique [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Insérer ligne suivant combobox et comparaison numérique
    Bonsoir,

    Mon formulaire simplifié comporte 3 comboboxs et 1 textbox. J'effectue une sélection en cascade et saisie dans la textbox une côte (numérique).
    Je voudrais transférer ces données sur la feuille en y insérant une ligne suivant les valeurs des contrôles.
    La combobox1 affiche les données de la colonne B, combobox2= colonne C, combobox3= colonne D et la valeur de la textbox en colonne E (numérique).
    Alors comment puis-je faire pour localiser la ligne où l'insertion doit s’effectuer, càd comparer ma valeur avec la ligne du dessus et du dessous. Là je nage et bois la tasse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Cmd_Valider_Click()
    Dim LastLig As Long, i As Long
    LastLig = F.Range("B" & Rows.Count).End(xlUp).Row
     
    With F
    For i = 2 To LastLig Step -1
    If Cells(2, i).Value = Me.ComboBox1.Value And Cells(3, i).Value = Me.ComboBox2.Value _
    And Cells(3, i).Value = Me.ComboBox3.Value Then
     
    Next i
    End With
     
    End Sub
    J'ai commencé ainsi mais j'ai besoin de votre aide. svp comment prévoir le non dépassement de côte, chaque type a une côte maximum.

    En vous remerciant par avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Salut Cathodique,

    voila ce que je te propose comme code pour ton bouton "valider":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Cmd_Valider_Click()
    Dim tab_LigneDebut(3) As Integer, tab_LigneFin(3) As Integer, tab_CbBx(2) As ComboBox
    Dim i As Integer, j As Integer, n_NbLigne As Integer, n_LigneInsert As Integer
    Dim ctr_x As Control
     
    n_NbLigne = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    tab_LigneDebut(0) = 1
    tab_LigneFin(0) = n_NbLigne
     
    'ici je creer une boucle pour definir la ligne ou se trouvent les criteres des combobox dans la Feuil1
    For i = 0 To 2
        For Each ctr_x In Me.Controls
            If ctr_x.Name = "ComboBox" & i + 1 Then
                Set tab_CbBx(i) = ctr_x
            Else
            End If
        Next ctr_x
        tab_LigneDebut(i + 1) = WorksheetFunction.Match(tab_CbBx(i).Value, Feuil1.Range(Feuil1.Cells(tab_LigneDebut(i), i + 2), Feuil1.Cells(tab_LigneFin(i), i + 2)), 0)
        tab_LigneDebut(i + 1) = tab_LigneDebut(i + 1) + tab_LigneDebut(i) - 1
        For j = tab_LigneDebut(i + 1) To n_NbLigne
            If Feuil1.Cells(j + 1, i + 2).Value <> Feuil1.Cells(j, i + 2).Value Then
                tab_LigneFin(i + 1) = j
            Else
            End If
        Next j
    Next i
     
    'ici je cherche, dans ma zone definie par les criteres des combobox, la valeur qui est superieur a celle de la textbox
    For i = tab_LigneDebut(3) To tab_LigneFin(3)
        If CSng(Me.TextBox1.Value) < Feuil1.Cells(i, 5) Then
            n_LigneInsert = i
            Exit For
        Else
        End If
    Next i
     
    Feuil1.Rows(n_LigneInsert).Insert (xlShiftDown)
     
    'ici je remplis la nouvelle ligne inseree avec les elements du UserForm
    For i = 0 To 2
        Feuil1.Cells(n_LigneInsert, i + 2) = tab_CbBx(i).Value
    Next i
    Feuil1.Cells(n_LigneInsert, 5) = Me.TextBox1.Value
     
    For i = n_LigneInsert To Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
        Feuil1.Cells(i, 1) = Feuil1.Cells(i, 1).Row - 1
    Next i
     
    Feuil1.Cells(n_LigneInsert, 1).Select
     
    Unload Me
     
    End Sub
    J'ai teste le code, et il marche de mon cote, dis moi ce qu'il en est pour toi

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Vanhoa,

    Je te remercie beaucoup pour ton aide. Je viens de tester et comme je m'en doutais si on saisit une côte supérieure à la côte maximum du type. Je pense qu'il faudrait ajouter de côte max pour le type, famille est sous-famille.

    J'ai juste compris que tu as utilisé des arrays (que je ne maitrise pas bien) et c'est tout.

    Sur l'image jointe tu verras le résultat de la selection Ol,N2,P6/O et 48, la ligne s'est insèrée au sein de la famille suivante.
    Je pense qu'il faudrait mettre des conditions sur le type, famille et sous-famille.
    Nom : insertion ligne.JPG
Affichages : 491
Taille : 35,8 Ko
    En te remerciant beaucoup, bonne journée.

  4. #4
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    En dans mon code, "j'encadre" la zone qui correspond aux criteres du UserForm. Donc ce qu'il faut utiliser, c'est ma variable tab_LigneFin(3).

    Je regarde ca de mon cote et je te redonne le code modifie.

    Pour les Array, oui, j'utilise les variable tableau car ca rend les calculs + rapides (quand il y a de nombreuses donnees) et ca permet aussi de faciliter le code en utilisant les dimensions des variables tableau avec des boucles, enfin, pour moi je trouve ca + facile

    Voila le code modifie.

    J'ai egalement corrige un oubli dans la definition de mes tab_LigneFin(i), il fallait rajouter "Exit For"
    Puis, comme je te disais, j'ai rajoute une condition a ma definition de n_LigneInsert qui traduit en gros, quand j'arrive a la fin de ma zone, la ligne a inserer est la suivante.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Private Sub Cmd_Valider_Click()
    Dim tab_LigneDebut(3) As Integer, tab_LigneFin(3) As Integer, tab_CbBx(2) As ComboBox
    Dim i As Integer, j As Integer, n_NbLigne As Integer, n_LigneInsert As Integer
    Dim ctr_x As Control
     
    n_NbLigne = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    tab_LigneDebut(0) = 1
    tab_LigneFin(0) = n_NbLigne
     
    'ici je creer une boucle pour definir la ligne ou se trouvent les criteres des combobox dans la Feuil1
    For i = 0 To 2
        For Each ctr_x In Me.Controls
            If ctr_x.Name = "ComboBox" & i + 1 Then
                Set tab_CbBx(i) = ctr_x
            Else
            End If
        Next ctr_x
        tab_LigneDebut(i + 1) = WorksheetFunction.Match(tab_CbBx(i).Value, Feuil1.Range(Feuil1.Cells(tab_LigneDebut(i), i + 2), Feuil1.Cells(tab_LigneFin(i), i + 2)), 0)
        tab_LigneDebut(i + 1) = tab_LigneDebut(i + 1) + tab_LigneDebut(i) - 1
        For j = tab_LigneDebut(i + 1) To n_NbLigne
            If Feuil1.Cells(j + 1, i + 2).Value <> Feuil1.Cells(j, i + 2).Value Then
                tab_LigneFin(i + 1) = j
                Exit For       '<=== MODIFICATION FAITE ICI
            Else
            End If
        Next j
    Next i
    Debug.Print tab_LigneFin(3)
    'ici je cherche, dans ma zone definie par les criteres des combobox, la valeur qui est superieur a celle de la textbox
    For i = tab_LigneDebut(3) To tab_LigneFin(3)
        If CSng(Me.TextBox1.Value) < Feuil1.Cells(i, 5) Then
            n_LigneInsert = i
            Exit For
        ElseIf CSng(Me.TextBox1.Value) > Feuil1.Cells(i, 5) And i = tab_LigneFin(3) Then    '<=== MODIFICATION FAITE ICI
            n_LigneInsert = i + 1
        Else
        End If
    Next i
     
    Feuil1.Rows(n_LigneInsert).Insert (xlShiftDown)
     
    'ici je remplis la nouvelle ligne inseree avec les elements du UserForm
    For i = 0 To 2
        Feuil1.Cells(n_LigneInsert, i + 2) = tab_CbBx(i).Value
    Next i
    Feuil1.Cells(n_LigneInsert, 5) = Me.TextBox1.Value
     
    For i = n_LigneInsert To Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
        Feuil1.Cells(i, 1) = Feuil1.Cells(i, 1).Row - 1
    Next i
     
    Feuil1.Cells(n_LigneInsert, 1).Select
     
    Unload Me
     
    End Sub
    Ca devrait marcher, j'ai teste, ca marche pour moi pour une valeur max selon des criteres definis

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re,

    je te dis bravo mais une dernière chose, je sais que tu ne t'es pas rendu compte, j'avais mis à la fin de mon post#1
    svp comment prévoir le non dépassement de côte
    Comment interdire le dépassement de côte? C'est à dire que chaque type à un min et un max, je voudrais afficher une message indiquant le dépassement et ne pas insérer de ligne.

    Je dois te dire que tu m'épates, j'ai eu beau faire des efforts pour comprendre les arrays, je n'arrive pas à les assimilés et
    ce malgré tous les tutos que j'ai pu trouver sur le forum et le net.

    Merci beaucoup, ton aide m'est vraiment très utile.

    Bonne journée.

  6. #6
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Ah oui je n'avais pas vu!
    Du coup, si j'ai bien compris, voila le code qui va te donner un message indiquant le depassement de la cote Max pour les criteres selectionnes et qui quitte la procedure (mais pas le UserForm) pour pouvoir modifier la valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Private Sub Cmd_Valider_Click()
    Dim tab_LigneDebut(3) As Integer, tab_LigneFin(3) As Integer, tab_CbBx(2) As ComboBox
    Dim i As Integer, j As Integer, n_NbLigne As Integer, n_LigneInsert As Integer
    Dim ctr_x As Control
     
    n_NbLigne = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    tab_LigneDebut(0) = 1
    tab_LigneFin(0) = n_NbLigne
     
    'ici je creer une boucle pour definir la ligne ou se trouvent les criteres des combobox dans la Feuil1
    For i = 0 To 2
        For Each ctr_x In Me.Controls
            If ctr_x.Name = "ComboBox" & i + 1 Then
                Set tab_CbBx(i) = ctr_x
            Else
            End If
        Next ctr_x
        tab_LigneDebut(i + 1) = WorksheetFunction.Match(tab_CbBx(i).Value, Feuil1.Range(Feuil1.Cells(tab_LigneDebut(i), i + 2), Feuil1.Cells(tab_LigneFin(i), i + 2)), 0)
        tab_LigneDebut(i + 1) = tab_LigneDebut(i + 1) + tab_LigneDebut(i) - 1
        For j = tab_LigneDebut(i + 1) To n_NbLigne
            If Feuil1.Cells(j + 1, i + 2).Value <> Feuil1.Cells(j, i + 2).Value Then
                tab_LigneFin(i + 1) = j
                Exit For       '<=== MODIFICATION FAITE ICI
            Else
            End If
        Next j
    Next i
    Debug.Print tab_LigneFin(3)
    'ici je cherche, dans ma zone definie par les criteres des combobox, la valeur qui est superieur a celle de la textbox
    For i = tab_LigneDebut(3) To tab_LigneFin(3)
        If CSng(Me.TextBox1.Value) < Feuil1.Cells(i, 5) Then
            n_LigneInsert = i
            Exit For
        ElseIf CSng(Me.TextBox1.Value) > Feuil1.Cells(i, 5) And i = tab_LigneFin(3) Then    '<=== MODIFICATION FAITE ICI
            MsgBox "Veuillez entrer une valeur inferieure a la cote Max"  '<=== MODIFICATION FAITE ICI POUR LE DEPASSEMENT DE COTE 
            Exit Sub
        Else
        End If
    Next i
     
    Feuil1.Rows(n_LigneInsert).Insert (xlShiftDown)
     
    'ici je remplis la nouvelle ligne inseree avec les elements du UserForm
    For i = 0 To 2
        Feuil1.Cells(n_LigneInsert, i + 2) = tab_CbBx(i).Value
    Next i
    Feuil1.Cells(n_LigneInsert, 5) = Me.TextBox1.Value
     
    For i = n_LigneInsert To Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
        Feuil1.Cells(i, 1) = Feuil1.Cells(i, 1).Row - 1
    Next i
     
    Feuil1.Cells(n_LigneInsert, 1).Select
     
    Unload Me
     
    End Sub
    Pour les Array, en fait peut etre qu'on te l'a mal explique ou que le tuto en question n'etait pas clair, mais c'est tres simple, pour imager, dis toi que c'est juste une plage de donnees "virtuelle".

    Exemple, j'ai dans ma Feuil1 un tableau avec 10,000 lignes et 10,000 colonnes. Si on realise un code qui realise des calculs sur cette immense plage de donnees, ca va etre long a s'executer. Donc ce qu'on peut faire, c'est de declarer un Array (ou une variable tableau) a 2 dimension, 1 pour les ligne et l'autre pour les colonnes et remplir se tableau avec le contenu dans l'immense plage de donnees. Une fois que l'on a rempli notre tableau "virtuel" a 2 dimension, on va l'utiliser pour realiser nos calculs (au lieu de le faire sur la plage de donnees dans la Feuil1).
    On peut mettre + de 2 dimensions (tu peux aller jusqu'a 60 je crois).

    Et ce qu'il y a de bien aussi, c'est qu'on peut y mettre autre chose que du texte ou des nombres. Dans le code que je t'ai propose, j'ai mis des controls de UserForm

    Pour les valeurs de cote Min tu peux t'inspirer du code pour Max pour faire pareil.
    Si tu n'y arrives pas, redis moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Copier ligne suivant la valeur d'un combobox
    Par Coxtox dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/05/2015, 11h35
  2. Cellule d'un tableau devant s’insérer sous la ligne suivante
    Par kohsaka dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/10/2012, 11h32
  3. [XL-2003] Insérer lignes en suivant valeur
    Par lafafmentvotre dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/10/2010, 20h01
  4. [ListView] tri particulier (comparaison numérique)
    Par Cybher dans le forum C++Builder
    Réponses: 16
    Dernier message: 28/07/2005, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo