VBA insertion ligne dans tableau

Résolu
linette44 Messages postés 23 Statut Membre -  
 nus -
Bonjour,
Je voudrais savoir s'il est possible de réaliser une macro pour :
Tableau de départ sous cette forme
colonne A
CHIEN
CHIEN
CHIEN
CHAT
CHAT
LAPIN

Le but est d'insérer une ligne vierge à chaque fois qu'il y a changement de la valeur de la colonne A
Tableau après macro
CHIEN
CHIEN
CHIEN
ligne vierge
CHAT
CHAT
ligne vierge
LAPIN

J'ai cherché mais je n'ai pas trouvé de solution.
Merci de votre aide
Linette44

10 réponses

  1. linette44 Messages postés 23 Statut Membre 3
     
    je viens de trouver la formule qui convient en ajoutant le fait qu'elle va chercher des lignes sur la feuille 2 et qu'elle les copie en colonne B à la place de la ligne vierge

    Sub insertA()
    Dim cellule As Variant

    'se positionne au bas de la colonne et remonte
    For i = Range("a65536").End(xlUp).Row To 2 Step -1

    'selectionne la ligne lors du changement de valeur et ajoute une ligne en dessous
    If cells(i, 1).Value <> cells(i + 1, 1).Value Then Rows(i + 1).EntireRow.insert Shift:=x1Down

    'va sur la feuille 2 pour copier et sur feuille 1 pour coller
    Sheets("Feuil2").Select
    Rows("6:9").Select
    Selection.Copy
    Sheets("Feuil1").Select

    Next

    SUITE 1 : Par contre, j'ai un problème la macro n'insère pas de ligne après ma dernière ligne (LAPIN), il n'y a donc pas de copier /coller des cellules de la feuille 2 après LAPIN. Y a-t-il une solution ?

    Voici le résultat :
    CHIEN
    CHIEN
    CHIEN
    GRIS
    CHAT
    CHAT
    JAUNE
    LAPIN

    SUITE 2 : Les informations de la feuille 2 (GRIS, ...) ont été collées en colonne B. Je voudrais que les informations de la ligne précédente soit copiées en colonne A
    résultat
    CHIEN
    CHIEN
    CHIEN
    CHIEN GRIS
    CHAT
    CHAT
    CHAT JAUNE
    etc.....
    En espérant trouver de l'aide
    Linette44
    0
  2. nus
     
    bonjour à tous

    je souhaiterais savoir si il existe une macro pour autoriser l'utilisation d'un classeur excel par plusieurs et une fois le fichier enregistrer insérer automatiquement les lignes qui ont étaient saisies par d'autre personne.

    merci
    0
    1. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
       
      Bonjour Nus,
      est-ce que les options de partage du classeur ne suffiraient pas ?
      outils/partager le classeur
      0
      1. nus > Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour Ivan-hoe

        non j'ai déjà essayé en ouvrant le fichier sur 2 postes différents!!

        sinon j'ai un autre problème au niveau du userform que j'ai crée, lorsque je lance la macro, il me sort le message suivant:
        erreur 424, objet requis ??
        le débogeur me sélectionne la ligne nouvelleActionForm.show dans la macro suivante:

        Private Sub Afficher_nouvelleActionForm()

        nouvelleActionForm.Show

        End Sub

        je ne comprend pas le problème

        merci d'avance
        0
      2. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310 > nus
         
        Vérifie que ton userform s'appelle bien "nouvelleActionForm" et qu'il se trouve dans le même fichier que ta macro.
        Si ce n'est pas ça, alors je ne sais pas ...
        0
  3. nus
     
    Bonjour,

    j'ai toujours un problème avec mon userform
    quand je clique sur le bouton affecté à la macro sur ma feuille de calcul, pas de problème le userform apparaît mais quand je le remplis et que je valide avec un bouton, rien ne s'inscrit dans ma feuille car je veux que les infos du userform s'inscrive dans une ligne. actuellement les données sont rentrées directement dans la feuille excel mais mon chef préfère une userform. comment je peux régler ce problème. j'aimerai vous poster le fichier mais c'est confidentiel!!

    merci
    0
  4. nus
     
    bonjour à tous

    j'ai crée un userform et lorsque je valide avec mon bouton OK, tous les données de mon userform n'apparaissent pas sur ma feuille. Je souhaiterai savoir si quelqu'un connait une macro pour que le texte que je rentre par exemple dans la textbox1 s'inscrive dans la case B7. Je cherche également à faire en sorte que si je rempli à nouveau mon userform, les données s'inscrivent à la suite de la dernière complétée dans la feuille

    merci d'avance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Salut Nus, il faut que les instructions nécessaires à la recopie des données de ton userform vers ta feuille excel apparaissent dans le code de ton bouton OK
    quelquechose du genre :

    Private Sub BoutonOK_Click()

    activesheet.range("b7").value = me.textbox1.value

    unload me
    End Sub

    Sans passer par un userform et des macros, est-ce que ton problème ne pourrait pas être résolu par Excel avec Données/Formulaire ? C'est un formulaire tout prêt qui te permet de remplir ta feuille de données de manière pratique.

    A suivre...
    0
    1. nus
       
      Merci Ivna-Hoe ça marche.

      Un autre petite question, toutes les données inscrites dans mes textbox et combobox sont insérées à la ligne 4 grâce à l'instruction suivante:

      Feuil1.Range("B4") = affaireComboBox2
      Feuil1.Range("C4") = dateEmissionTextBox
      Feuil1.Range("D4") = origineTextBox
      Feuil1.Range("E4") = emmetteurTextBox
      Feuil1.Range("F4") = libelleActionTextBox
      Feuil1.Range("G4") = respActionComboBox
      Feuil1.Range("H4") = delaiSouhaiteTextBox
      Feuil1.Range("I4") = criticiteTextBox
      Feuil1.Range("J4") = statutComboBox
      Feuil1.Range("L4") = commentaireTextBox
      Feuil1.Range("M4") = avancementTextBox

      Maintenant si je rempli à nouveau mon userform, les nouvelles données effacent les précédentes toujours sur la ligne 4.
      comment faire pour conserver les données de la ligne 4 et insérer les nouvelles données sur la ligne suivante.
      le problème étant que si par exemple j'ai déjà disons 22 lignes complétées, la 23° vienne à la suite de la 22ième et ainsi de suite.

      désolé mais je découvre visual et ma boite ne veux pas investir pour ma formation!!

      merci
      0
  7. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Alors,
    on est bien d'accord que c'est le 4 de "B4" qu'on aimerait faire varier ?
    on va donc l'appeler i, par exemple.
    Tes instructions deviennent donc :
    Feuil1.Range("B" & i) = affaireComboBox2
    Feuil1.Range("C" & i) = dateEmissionTextBox
    etc.

    au début de ta procédure, il faut aussi rajouter les instructions suivantes

    Dim i as long
    i = range("B4").end(xldown).row +1
    '(i prend la valeur du numéro de la dernière ligne de données + 1)

    Quand au problème de la formation en entreprise ... c'est un autre débat !!

    A suivre...
    0
    1. nus
       
      bon je viens de tester ton code mais il m'affiche un message d'erreur: "la méthode 'Range' de l'objet requis '_worksheet' a échoué" !! et il sélectionne en jaune la 1ère ligne :Feuil1.Range("B"&i)=affaireComboBox2 ??

      Dim i As Long
      i = Range("B4").End(xlDown).Row + 1
      'i prend la valeur du numéro de la dernière ligne de données +1

      Feuil1.Range("B" & i) = affaireComboBox2
      Feuil1.Range("C" & i) = dateEmissionTextBox
      Feuil1.Range("D" & i) = origineTextBox
      Feuil1.Range("E" & i) = emmetteurTextBox
      Feuil1.Range("F" & i) = libelleActionTextBox
      Feuil1.Range("G" & i) = respActionComboBox
      Feuil1.Range("H" & i) = delaiSouhaiteTextBox
      Feuil1.Range("I" & i) = criticiteTextBox
      Feuil1.Range("J" & i) = statutComboBox
      Feuil1.Range("L" & i) = commentaireTextBox
      Feuil1.Range("M" & i) = avancementTextBox

      on ne peut pas joindre de fichier sinon??

      merci
      0
  8. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    l'objet requis '_worksheet' , ça veut que la feuille n'est pas identifiée.
    Comment s'appelle la feuille dans laquelle tu veux écrire ?
    Transforme la ligne de code comme suit :
    Sheets("Nomdetafeuille").Range("B" & i) = affaireComboBox2.value
    est-ce que c'est mieux ?
    0
    1. nus
       
      bonjour Ivan-hoe

      j'ai encore une erreur qui apparait: erreur définie par l'application ou par l'objet. cette ligne est sélectionée en jaune:

      Sheets("en_cours").Range("B" & i) = affaireComboBox2

      que faire??

      merci
      0
  9. nus
     
    salut ivan

    je me suis inspiré d'un fichier existant et mis en place le code suivant:

    Dim i As Integer
    Dim konteur As Integer
    Dim NBaction As Integer

    'début de programme
    NBaction = 4

    'comptage des cellules dans l'onglet en_cours
    ActiveWorkbook.Worksheets("en_cours").Activate
    For konteur = 4 To 4000
    If Range(Cells(konteur, 1), Cells(konteur, 1)) <> "" Or Range(Cells(konteur, 2), Cells(konteur, 2)) <> "" Then
    NBaction = NBaction + 1
    End If
    Next konteur

    Feuil1.Range("B" & NBaction) = affaireComboBox2
    Feuil1.Range("C" & NBaction) = dateEmissionTextBox
    Feuil1.Range("D" & NBaction) = origineTextBox
    Feuil1.Range("E" & NBaction) = emmetteurTextBox
    Feuil1.Range("F" & NBaction) = libelleActionTextBox
    Feuil1.Range("G" & NBaction) = respActionComboBox
    Feuil1.Range("H" & NBaction) = delaiSouhaiteTextBox
    Feuil1.Range("I" & NBaction) = criticiteTextBox
    Feuil1.Range("J" & NBaction) = statutComboBox
    Feuil1.Range("L" & NBaction) = commentaireTextBox
    Feuil1.Range("M" & NBaction) = avancementTextBox

    cette fois-ci quand je remplis mon userform, les lignes s'insérent à la suite des autres mais à la fin de mon tableau.
    comment faire pour détecter la 1ère ligne vide du tableau (la 4 si je part d'un tableau vide ou alors la nième)!!

    merci

    et désolé je sais je suis un peu chiant, mais on se renseigne comme on peut
    0
  10. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Bonjour Nus,
    1 - tu n'est pas chiant, tu es persévérant. Nuance.
    2 - tu fais au moins l'effort de chercher par toi-même et de proposer tes propres solutions, c'est très louable
    3 - je ne comprends pas pourquoi ça t'écrit les données à la fin de ton tableau. Le code que tu proposes (même s'il est un peu lourd) écrit bien les données en ligne 4,puis 5 puis 6 , etc.
    Vérifie donc si tu n'as pas des cochonneries qui trainent à la fin de ton tableau (genre : des espaces, un point, une lettre, un n'importe quoi qui fait qu'une plage non vide est détectée en fin de tableau)
    A suivre !
    I.
    0
    1. nus
       
      Salut Ivan-hoe

      j'ai une nouvelle question sur mon UserForm
      tous fonctionne bien mais j'aurai besoin d'ajouter un contrôle.
      j'ai une instruction qui fonctionne et qui me permet de vérifier si les dates sont au format jj/mm/aaaa
      si la date est incorrect la MsgBox apparait bien lorsque je clique sur la touche OK de mon userform. Elle se ferme et inscrit quand même le mauvais format de date dans la case prévue à cette effet!!

      Comment faire pour que, si le format de date est incorrect et que l'on clique sur le bouton OK, la userform reste ouverte tant que la date n'a pas été modifier.

      merci
      0
  11. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Salut Nus,
    je suppose qu'il suffirait d'interrompre ta procédure (avec Exit Sub) après la boîte message qui indique l'erreur et avant l'instruction qui ferme ton userform.
    exemple :
    private sub BoutonOK_Click()
    if [test sur ton format de dates] then
    Msgbox "Erreur sur le format des dates"
    Exit Sub
    end if

    Me.Hide
    [suite de ta procédure]

    Unload Me
    end sub

    Pour une réponse plus précise, pourrais-tu envoyer le code que tu utilises ?
    I.
    0
    1. nus
       
      Salut Ivan-hoe,

      j'ai mis eu peu de temps à répondre mais merci pour ton aide

      j'ai encore une question !!

      dans le même fichier, le nom des agents méthodes se trouve dans la colonne G, puis un pourcentage dans la colonne M.

      Comment faire sous VBA pour que par exemple dans la colonne G si le nom de la personne est Mr X, la macro fasse la somme des % dans la colonne M (car chaque personne à plusieurs actions en cours) puis diviser cette somme par le nombre de valeurs de cette même personne. je ne sais pas si c'est très clair.

      je pensais commencer comme ça, mais je ne suis pas très doué:

      private sub .....
      If Range("G65536") = "Mr X" Then
      ...
      merci
      0
    2. nus
       
      Salut Ivan

      oublions la question précédente !!

      cette instruction me permet de copier les données d'une ligne dans un autre onglet lorsque le mot "Soldée" apparait dans une case de la colonne J.

      Sub solder_actions()
      Dim i As Integer
      Dim konteur As Integer
      Dim NBsold As Integer

      NBsold = 4

      'comptage des cellules dans l'onglet "soldées"

      ActiveWorkbook.Worksheets("soldées ").Activate
      For konteur = 4 To 4000

      If Range(Cells(konteur, 1), Cells(konteur, 1)) <> "" Or Range(Cells(konteur, 2), Cells(konteur, 2)) <> "" Then

      NBsold = NBsold + 1
      End If

      Next konteur

      ActiveWorkbook.Worksheets("en_cours").Activate

      For i = 4 To 1000

      If Range(Cells(i, 10), Cells(i, 10)) = "Soldée" Then
      Range(Cells(i, 1), Cells(i, 10)).Copy ActiveWorkbook.Worksheets("soldées ").Cells(NBsold, 1)

      'suppression de la ligne
      ActiveWorkbook.Worksheets("en_cours").Activate
      Range(Cells(i, 1), Cells(i, 15)).Select
      Selection.Delete Shift:=xlUp

      NBsold = NBsold + 1

      'on reste sur la même ligne
      i = i - 1
      Cells(i, 1).Activate
      Else
      End If

      Next i
      ActiveWorkbook.Worksheets("en_cours").Activate

      End Sub


      J'ai essayé plusieurs modification car en fait je souhaite copier les données de chaque ligne dans l'autre onglet sauf la donnée de la colonne K, car il s'agit d'un compte à rebours mais j'ai inscrit automatiquement la valeur 0 dans toute la colonne du second onglet (onglet où sont donc stocker des actions quand elles sont terminées : 100% inscrit dans la colonne M ou colonne 13 dans le code)

      Merci
      0