Problème avec un code VBA

Bonjour,

J'ai un fichier de 30 onglets (dans le document suivant j'ai juste pris les deux onglets concernés). J'ai fait une macro permettant de prendre tous mes onglets et de déplacement une ligne à une autre position malheureusement pour la 9eme personne (ligne 61) ça bloque. Certains onglets ont beaucoup de texte c'est pour ça que ma liste de personnel commence ligne 52 afin d'avoir le même niveau sur tous les onglets.

Donc mon problème en prenant mon document pour exemple, si par exemple je souhaite déplace la ligne 1 avec la personne se nommant "a" entre la ligne 42 et 43 donc entre "eeeeeeeeee" et "mmm". Dans un premier temps ça va copier ma ligne 1 puis insérer la ligne 1 entre la ligne 42 et 43 et dans un second temps ça va supprimer ma ligne 1.

dans le sens inverse ça fonctionne bien le problème que j'ai, c'est avec la ligne 9 (la personne "i"), si je veux la déplacer entre la ligne 42 et 43, ça va bien copier puis insérer la ligne sauf que ça va supprimer la ligne 10 au lieu de la ligne 9.

Mais dans l’autre sens ça fonctionne, si je déplace ma ligne 9 entre la ligne 1 et 2, ça va bien copier ma ligne 9 entre 1 et 2 et ça va supprimer ma ligne 10 (la ligne initialement 9 "i" va se déplacer en ligne 10 "i" car une ligne est ajouté avant)

Si quelqu'un pouvait m'aider s'il vous plait, je comprend pas pourquoi ma ligne 9 ne veut pas. Si besoin d'information supplémentaire pour m'aider, je suis à disposition.

Private Sub CommandButton_valider_Click()

Application.ScreenUpdating = False

Dim s As Worksheet
Dim t As Worksheet
Dim val As String, copie As String, depl As String, var As String, ligne As String, placement As String

val = ComboBox_Nom.Value
ligne = WorksheetFunction.VLookup(val, Sheets("Base donnée").Range("B53:G140"), 6, 0)
copie = ligne + 52

var = ComboBox_Placement.Value
placement = WorksheetFunction.VLookup(var, Sheets("Base donnée").Range("B53:G140"), 6, 0)
depl = placement + 52

For Each s In Worksheets
Select Case s.Name
Case "Base donnée", "Effectifs Personnel"
s.Rows(copie).Copy
s.Rows(depl).Insert Shift:=xlDown
End Select
Next s

If ligne < placement Then
    For Each t In Worksheets
    Select Case t.Name
    Case "Base donnée", "Effectifs Personnel"
    t.Rows(copie).Delete Shift:=xlUp
    End Select
    Next t
Else
    For Each t In Worksheets
    Select Case t.Name
    Case "Base donnée", "Effectifs Personnel"
    t.Rows(copie + 1).Delete Shift:=xlUp
    End Select
    Next t
End If

Application.ScreenUpdating = True

Unload Me

End Sub

Voilà ma macro et mon document ci-dessous.

Cordialement, et merci d'avance.

Bonsoir,

pour moi il y a une erreur de format de variable et de test "mathématique" ici :

If ligne < placement Then

En effet les valeurs de ces variables sont issue d'un VlookUp qui je crois revoit une valeur "String" c'est à dire alphanumérique.

donc 9 en alphanumérique est il plus petit que 15 (par exemple) est bien non car par ordre alphabétique 15 est avant 9 à cause du 1

Donc la petite correction à faire serait :

If CInt(ligne) < CInt(placement) Then

qui demande à VBA de prendre les variables comme des valeurs Integer, donc des chiffres entiers allant (environ) de -32000 à +32000.

A vous de tester...

Ceci dit il faut peut-être revoir votre code en entier... en effet il serait plus judicieux de faire un couper / insérer les cellules coupés

qui fait en une fois ce que vous voulez obtenir. Pour voir le code il suffit de lancer l'enregistreur de macro et vous obtiendrez un truc de ce genre :

Sheets(Array("Effectifs Personnel", "Base donnée")).Select ' sélection de toutes les feuilles
Sheets("Effectifs Personnel").Activate ' ici lors de l'enregistrement c'est la ligne 54 qui était sélectionnée
Selection.Cut ' on copie coupe
Rows("95:95").Select ' on sélectionne la ligne 95 d'excel pour insérer avant celle ci
Selection.Insert Shift:=xlDown ' on insere en décalant vers le bas 

ci_dessous un code qui permet de sélectionner plusieurs feuilles même si elles ne sont pas contiguës. Par contre celles qui ne devront pas être sélectionnées devraient avoir une structure "identique" comme par exemple commencer par un underscor "_"

Dim Feuille As Worksheet
For Each Feuille In ActiveWorkbook.Sheets
    If Left(Feuille.Name,1) <> "_" Then Feuille.Select Replace:=False
Next Feuille

@ bientôt

LouReeD

Bonjour,

Merci de votre réponse LouReeD

Donc le problème c'était ça mon problème, merci beaucoup ta solution fonctionne.

Si j'avais défini mes variables en tant que integer et non string, j'aurais pas eu ce problème et j'aurais pas eu besoin de passer par ta modification?

Sinon pour la deuxième partie, le couper / insérer les données.

Ma question c'est si je passe pas couper puis insérer, ma ligne initiale sera supprimé ou pas?

Pour le code concernant la sélection des feuilles, faut le mettre à quel endroit? Je met mes macro dans un userform, la macro se mettrait dans un commandbutton Valider, non?

Cordialement

Bonsoir,

ci joint le fichier avec le code qui marche pas mal je dois dire

J'ai mis des commentaires pour la compréhension

@ bientôt

LouReeD

Bonjour,

Tout d'abord merci pour ton code je l'aime beaucoup, par contre j'ai quelque question dessus car je comprend pas certaine chose :

1. Dans la macro tu écris ceci

Private Sub CommandButton_valider_Click()
If ComboBox_Placement.Value = ComboBox_Nom.Value Then Exit Sub

Puis ceci

If Per_Sélectionnée <> Placer_Avant Then ' on vérifie qu'on a pas sélectionné les deux même personne avant de faire le déplacement

Je comprend pas pourquoi tu marques deux fois la même chose? Si j'ai bien compris, au début si les deux combobox sont identiques on quitte tout, et après tu marque que si les deux combobox sont différents alors on peut mettre en place la macro.

2.

Dim Per_Sélectionnée As Long
    Dim Placer_Avant

    ' récupération de la personne sélectionnée en combobox_nom pour son futur déplacement
    ' sachant que le premier choix à un listindex = à 0 on rajoute 53 pour tomber sur la première ligne personnel
    Per_Sélectionnée = ComboBox_Nom.ListIndex + 53

    ' récupération de la personne avant qui Per_Sélectionnée va être déplacer
    'sachant que le premier choix à un listindex = à 0 on rajoute 53 pour la même raison
    Placer_Avant = ComboBox_Placement.ListIndex + 53

Pour cette partie du code je comprend pas pourquoi tu décris la première variable comme as long et la deuxième tu la décris pas, elles sont pareil pourtant.

3.

Sheets(1).Select
    Sheets(1).Range("A1").Select

Je comprend pas à quoi correspond sheets(1), aucune feuille ne se nomme 1.

Merci encore pour ton aide

Cordialement

Bonsoir

1/ c'est vrai c'est la même chose... la fatigue vous dites ?!

2/ c'est vrai c'est le même type de variable... la fatigue vous dites ?! je dirais oui

3/ c'est vrai ? pourtant c'est simple :

Sheets("LRD").Select = va sélectionner la feuille qui porte le nom LRD

mais encore ?

Nom_feuille = "LRD"

Sheets(Nom_feuille).Select = va sélectionner la feuille qui porte le nom LRD car la variable Nom_feuille = LRD

mais encore ?

Sheets(1).Select = va sélectionner la première feuille du classeur, c'est à dire celle dont l'onglet est le plus à gauche...

mais encore ?

Pour sélectionner la feuille la pus à droite (la dernière) il faut sélectionner la feuille qui correspond au nombre de feuille du classeur,

donc Sheets(WorkSheets.count).Select où l'instruction WorkSheets.count permet de connaître le nombre de feuille du classeur, du coup si 10 feuilles alors on sélectionne la Sheets(10) !

Ci dessous le code corrigé :

Private Sub CommandButton_valider_Click()
    ' on vérifie qu'on a pas sélectionné les deux même personne avant de faire le déplacement sinon on quitte
    If ComboBox_Placement.Value = ComboBox_Nom.Value Then Exit Sub

    Application.ScreenUpdating = False
    Dim Per_Sélectionnée As Long
    Dim Placer_Avant As Long

    ' récupération de la personne sélectionnée en combobox_nom pour son futur déplacement
    ' sachant que le premier choix à un listindex = à 0 on rajoute 53 pour tomber sur la première ligne personnel
    Per_Sélectionnée = ComboBox_Nom.ListIndex + 53

    ' récupération de la personne avant qui Per_Sélectionnée va être déplacer
    'sachant que le premier choix à un listindex = à 0 on rajoute 53 pour la même raison
    Placer_Avant = ComboBox_Placement.ListIndex + 53

    ' sélection des feuilles personnels
    Dim Feuille As Worksheet
    For Each Feuille In ActiveWorkbook.Sheets
        If Left(Feuille.Name, 1) <> "_" Then Feuille.Select Replace:=False
    Next Feuille
    ' copie coupe de la première ligne
    Rows(Per_Sélectionnée & ":" & Per_Sélectionnée).Select
    Selection.Cut
    ' insère colle au dessus du deuxième choix
    Rows(Placer_Avant & ":" & Placer_Avant).Select
    Selection.Insert Shift:=xlDown

    Sheets(1).Select
    Sheets(1).Range("A1").Select
    Application.ScreenUpdating = True
    Unload Me
End Sub

heuresement que je ne suis pas susceptible

@ bientôt

LouReeD

Bonjour,

Ah d'accord j'ai tout compris maintenant,

je ne savais pas pour sheets(1), je viens d'apprendre une nouvelle chose

ton code fait une exécution plus rapide, je vais l'utiliser au lieu du mien, merci encore beaucoup

Cordialement

Bonsoir,

et merci pour votre merci encore beaucoup

@ bientôt sur le forum peut-être

LouReeD

Rechercher des sujets similaires à "probleme code vba"