Erreur execution 1004

Bonjour à tous,

Le code lié aux listes déroulantes semble correct.

Il se produit avec la listbox en A2, sur 2 cas précis, alors que le tri se fait correctement :

En passant de :

Projets à SAV.

Autres à SAV.

les autres changements de liste ne bugent pas, et je comprends pas sur quoi se produit l'erreur dans VBA project.

En même temps, je suis habitué aux macros sur les modules, et les macros fonctionnent, mais les boutons liés prennent plus de place.

merci.

Franck

erreur objet

bonjour,

je viens de tester, l'erreur ne produit pas toujours

je l'ai eu une fois, la valeur de p était égale à 0 donc cells(2,p) n'existe pas

ligne14:

For p = p To dercol_calend

' MsgBox p & "" & Cells(2, p)

If Cells(2, p) = "SP" Then

q = p + 1

Cells(2, p).EntireColumn.Hidden = False

GoTo ligne15

Else

Cells(2, p).EntireColumn.Hidden = True

End If

Next p

Bonjour à tous,

En écrivant Dim i, j, k, l, m, n, o, p, q, r, s, t, u, v As Long

Il n'y a que V qui est "long", les autres sont "variant" ... cela peut être la source de ton problème.

Suggestion :

Dim i As Long, j As Long, k As Long, l As Long, m As Long, n As Long, o As Long
Dim p As Long, q As Long, r As Long, s As Long, t As Long, u As Long, v As Long

Sur 2, 3 ou 4 lignes ... selon l'affichage à ton écran.

ric

Rebonjour,

Aussi, au début des macros qui ont un fonctionnement long, tu peux ajouter sous les "Dim ..."

Application.ScreenUpdating = False

L'affichage écran sera désactivé jusqu'à la fin de la macro.

Le déroulement sera passablement accéléré.

Application.ScreenUpdating = TRUE

Peut-être ajouter à la fin. Mais, si j'ai bien compris, c'est facultatif, car à la fin du traitement l'actualisation de l'écran reprendra automatiquement.

ric

@ric

[quote="à propos de « Application.ScreenUpdating = True », tu"]si j'ai bien compris, c'est facultatif, car à la fin du traitement l'actualisation de l'écran reprendra automatiquement.[/quote]

exact : Application.ScreenUpdating = True est exécuté de façon implicite juste avant le End Sub ➯ la mise à jour de l'écran est réalisée automatiquement à ce moment-là.

attention quand même à ceci : si tu veux afficher un message via MsgBox juste avant End Sub tu verras en arrière-plan de la MsgBox un écran non actualisé ; donc si ça gêne, c'est là ou il faut ajouter avant, explicitement :

Application.ScreenUpdating = True

dhany

Bonjour Ric dhany et gullaud et merci pour vos réponses, j'ai fait vos corrections.

Il manquait des choses, mais maintenant c'est pire, il ne masque plus.

exemple en passant de la sélection "tous" à "commerciaux", il devrait masquer la colonne "LA", mais il ne le fait pas.

Je vous laisse voir si vous pouvez m'aider.

merci

Franck

Bonjour,

Pour masque la colonne LA ("B") en sélectionnant "Commerciaux", il suffit d'inverser les True et False de ce module ... comme ceci :

        If Cells(2, 1) = "commerciaux" Then

          'réaffichage tous les salariés

            Columns("A:AL").Select
        Selection.EntireColumn.Hidden = False
        Cells(2, 1).Select
        For b = 2 To dercol_calend

        If Cells(2, b) = "LA" Then
        c = b + 1
        Cells(2, b).EntireColumn.Hidden = True
        GoTo ligne22
        Else
        Cells(2, b).EntireColumn.Hidden = False
        End If
        'MsgBox I
        Next b

ric

je me suis trompé, c'est JA qu'il doit masquer, donc le code est bon, enfin ..presque

Bonjour à tous,

J'ai passablement réduit ton code.

Chacun des "item" en tête de colonne que tu veux masquer, en choisissant une catégorie (en A2), est dans la section correspondante. Liste à vérifer ...

Spoiler

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim dercol_calend As Integer

Dim C As Long

' repère la dernière colonne de la ligne 2

dercol_calend = Cells(2, Columns.Count).End(xlToLeft).Column

' Tous les salariés

'******************************************************************************************************

If Cells(2, 1) = "TOUS" Then

Columns("A:AL").EntireColumn.Hidden = False

Cells(1, 1).Select

End If

' autres salariés

'******************************************************************************************************

If Cells(2, 1) = "autres" Then

'réaffichage tous les salariés

Columns("A:AL").EntireColumn.Hidden = False

Cells(1, 1).Select

For C = 2 To dercol_calend

If Cells(2, C) = "BH" Then Columns(C).Hidden = True

If Cells(2, C) = "FP" Then Columns(C).Hidden = True

If Cells(2, C) = "LP" Then Columns(C).Hidden = True

Next C

End If

' projets

'******************************************************************************************************

If Cells(2, 1) = "projets" Then

'réaffichage tous les salariés

Columns("A:AL").EntireColumn.Hidden = False

Cells(1, 1).Select

For C = 2 To dercol_calend

If Cells(2, C) = "BH" Then Columns(C).Hidden = True

If Cells(2, C) = "FP" Then Columns(C).Hidden = True

If Cells(2, C) = "LP" Then Columns(C).Hidden = True

If Cells(2, C) = "JA" Then Columns(C).Hidden = True

If Cells(2, C) = "BF" Then Columns(C).Hidden = True

If Cells(2, C) = "FKM" Then Columns(C).Hidden = True

If Cells(2, C) = "XO" Then Columns(C).Hidden = True

Next C

End If

' SAV

'******************************************************************************************************

If Cells(2, 1) = "SAV" Then

'réaffichage tous les salariés

Columns("A:AL").EntireColumn.Hidden = False

Cells(1, 1).Select

For C = 2 To dercol_calend

If Cells(2, C) = "BH" Then Columns(C).Hidden = True

If Cells(2, C) = "FP" Then Columns(C).Hidden = True

If Cells(2, C) = "LP" Then Columns(C).Hidden = True

If Cells(2, C) = "JA" Then Columns(C).Hidden = True

If Cells(2, C) = "BF" Then Columns(C).Hidden = True

If Cells(2, C) = "KM" Then Columns(C).Hidden = True

If Cells(2, C) = "XO" Then Columns(C).Hidden = True

If Cells(2, C) = "ED" Then Columns(C).Hidden = True

If Cells(2, C) = "PF" Then Columns(C).Hidden = True

If Cells(2, C) = "MG" Then Columns(C).Hidden = True

If Cells(2, C) = "AG" Then Columns(C).Hidden = True

If Cells(2, C) = "AL" Then Columns(C).Hidden = True

If Cells(2, C) = "IM" Then Columns(C).Hidden = True

If Cells(2, C) = "RO" Then Columns(C).Hidden = True

If Cells(2, C) = "SP" Then Columns(C).Hidden = True

If Cells(2, C) = "PP" Then Columns(C).Hidden = True

If Cells(2, C) = "SR" Then Columns(C).Hidden = True

If Cells(2, C) = "ER" Then Columns(C).Hidden = True

If Cells(2, C) = "GR" Then Columns(C).Hidden = True

If Cells(2, C) = "MW" Then Columns(C).Hidden = True

Next C

End If

' commerciaux

'******************************************************************************************************

If Cells(2, 1) = "commerciaux" Then

'réaffichage tous les salariés

Columns("A:AL").EntireColumn.Hidden = False

Cells(1, 1).Select

For C = 2 To dercol_calend

If Cells(2, C) = "BB" Then Columns(C).Hidden = True

If Cells(2, C) = "MD" Then Columns(C).Hidden = True

If Cells(2, C) = "JA" Then Columns(C).Hidden = True

If Cells(2, C) = "RD" Then Columns(C).Hidden = True

If Cells(2, C) = "GD" Then Columns(C).Hidden = True

If Cells(2, C) = "MK" Then Columns(C).Hidden = True

If Cells(2, C) = "PM" Then Columns(C).Hidden = True

If Cells(2, C) = "PO" Then Columns(C).Hidden = True

If Cells(2, C) = "TR" Then Columns(C).Hidden = True

Next C

End If

End Sub

ric

merci Ric,

Je n'avais plus que 2 bugs dans les changement de liste en vba project, alors qu'en macro avec des boutons pas de bugs,

ce qui m'aurait fait renoncé à la listbox.

Effectivement y'a beaucoup moins de code, et çà sera plus facile à gérer pour les changements de personnel.

Par contre je vais voir comment mettre option explicit, je l'ai pas.

Je regarde çà demain.

merci

Bonjour,

"Option Explicit" > il n'y a rien à installer, on l'ajoute tout au haut au dessus du code, tout simplement.

Il sert à obliger la déclaration de variables.

S'il y a "Option Explicit" en haut du code et que tu utilises une variable sans l'avoir déclarée (Définie) "Dim .... as .....",

une fenêtre survient ...30-0

C'est une bonne pratique à instaurer.

ric

c'est génial, je vais beaucoup moins galérer comme çà.

merci.

il est ou le bouton "résolu"

Bonjour fronck,

pour passer le sujet en résolu, il suffit de cliquer sur le bouton près de (regarde dans le coin haut droit du post) ; ça permet aussi de clôturer le fil de la discussion ; tu sauras que tu as réussi quand tu verras un petit rond vert avec une coche, comme ceci :

sujet

(toi seul peut le faire, car c'est toi qui a créé ce sujet)

dhany

@fronck

j'ai complété mon post précédent pour mieux t'indiquer où se trouve le bouton

rappel : un post est un message qui est posté sur le forum

dhany

Rechercher des sujets similaires à "erreur execution 1004"