Rechercher : dans
Par :

VBA insertion ligne dans tableau

Dernière réponse le 26 mar 2008 à 16:19:13 linette44, le 9 fév 2008 à 16:40:45 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « VBA insertion ligne dans tableau » dans :
Figer une ligne dans un tableau Excel VoirPour figer la ligne 1 (par exemple) dans une feuille excel : Sélectionnez la ligne 2, Puis allez dans le menu "Fenêtres" et option "Figer les volets".
Sed - Numérotation de lignes VoirNumérotation * Numéroter les lignes (équivalent à "cat -n fichier.txt") sed = fichier.txt L'inconvénient c'est que l'affichage se fait sur 2 lignes. Donc pour palier à ce petit "défaut" sed = fichier.txt | sed 'N;s/\n/\t/' Numéroter les...
[VBA:VB6] Se servir d'excel à partir d'une autre application VoirCette petite routine permet d'appeler excel à partir de VB6 ou d'une autre application Office. A coller dans un module général (Module1 par exemple) En VBA >> Insertion >> Module, et dans cette fenêtre coller... En VB6 >> Projet >> Ajouter un...

1

linette44, le 9 fév 2008 à 19:42:12

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

Répondre à linette44

2

nus, le 11 mar 2008 à 10:58:02

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

Répondre à nus

3

Ivan-hoe, le 11 mar 2008 à 11:13:44

Bonjour Nus,
est-ce que les options de partage du classeur ne suffiraient pas ?
outils/partager le classeur

Répondre à Ivan-hoe

4

nus, le 11 mar 2008 à 14:40:02

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

Répondre à nus

5

Ivan-hoe, le 11 mar 2008 à 14:57:02

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

Répondre à Ivan-hoe

6

nus, le 12 mar 2008 à 15:45:40

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

Répondre à nus

7

nus, le 13 mar 2008 à 08:42:32

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

Répondre à nus

8

Ivan-hoe, le 13 mar 2008 à 13:36:20

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

Répondre à Ivan-hoe

9

nus, le 13 mar 2008 à 15:20:59

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

Répondre à nus

10

Ivan-hoe, le 13 mar 2008 à 16:01:25

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

Répondre à Ivan-hoe

11

nus, le 13 mar 2008 à 16:55:25

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

Répondre à nus

12

Ivan-hoe, le 13 mar 2008 à 17:19:43

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 ?

Répondre à Ivan-hoe

13

nus, le 14 mar 2008 à 08:40:18

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

Répondre à nus

14

nus, le 14 mar 2008 à 09:46:55

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

Répondre à nus

15

Ivan-hoe, le 14 mar 2008 à 12:47:34

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.

Répondre à Ivan-hoe

16

nus, le 18 mar 2008 à 15:40:38

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

Répondre à nus

17

Ivan-hoe, le 19 mar 2008 à 16:30:07

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.

Répondre à Ivan-hoe

18

nus, le 26 mar 2008 à 09:14:38

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

Répondre à nus

19

 nus, le 26 mar 2008 à 16:19:13

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

Répondre à nus