Problème d'enchainement de conditions dans VBA

Guizmox

XLDnaute Nouveau
Bonjour,

Je tâtonne encore beaucoup en codage, et je n'arrive pas à trouver mon erreur dans le bout de macro suivant :
Sub RELEVEENCOURS()

Application.ScreenUpdating = False

'Pour masquer les colonnes après le premier relevé
If E4 = "" Then
Columns("K:GN").Select
Selection.EntireColumn.Hidden = True
Range("A7").Select

'Sinon, masquer les colonnes inutiles avant la selection
ElseIf Not IsEmpty(Range("E4")) Then

Colonne = Range("IV4").End(xlToLeft).Column + 4
For i = 4 To Colonne
Cells(1, i).Select
Selection.EntireColumn.Hidden = True
Next i

'masquer les colonnes inutiles après la selection
For i = Colonne + 8 To 200
Cells(1, i).Select
Selection.EntireColumn.Hidden = True
Next i

Range("A7").Select

Application.ScreenUpdating = True

End If

End Sub

Je sais que l'erreur se cache dans ce que j'ai surligné en rouge, étant donné que les deux conditions fonctionnent sans problème, prises séparément.

Là, c'est la partie avec le E4 = "" qui est lancée dans tous les cas, que E4 soit vide ou non (Pour info, E4 est une cellule fusionnée allant de E4 à J4, et destinée à contenir une date).
J'ai également tenté E4 <> "" à la place de Not IsEmpty(Range("E4")) mais rien n'y fait...

Merci à celui qui saura me sortir de mon ignorance ^^

Guizmox
 

Papou-net

XLDnaute Barbatruc
Re : Problème d'enchainement de conditions dans VBA

Bonjour Guizmox,

Peut-être comme ceci :

Code:
Sub RELEVEENCOURS()

Application.ScreenUpdating = False

'Pour masquer les colonnes après le premier relevé
If Range("E4") = "" Then
  Columns("K:GN").EntireColumn.Hidden = True
  Range("A7").Select
  'Sinon, masquer les colonnes inutiles avant la selection
  Else
  Colonne = Range("IV4").End(xlToLeft).Column + 4
  For i = 4 To Colonne
    Cells(1, i).EntireColumn.Hidden = True
  Next i
  'masquer les colonnes inutiles après la selection
  For i = Colonne + 8 To 200
    Cells(1, i).EntireColumn.Hidden = True
  Next i
  Range("A7").Select
End If
Application.ScreenUpdating = True

End Sub

Mais, le dira-t-on jamais assez : avec un fichier, c'est plus sûr.

Cordialement.
 

Efgé

XLDnaute Barbatruc
Re : Problème d'enchainement de conditions dans VBA

Bonjour Guizmox,
Je pense qu'en utilisant
Code:
If E4 = "" Then
VBA attend une variable E4. Comme elle n'éxiste pas, elle est égale à rien ("").
Donc remplace
Code:
If E4 = "" Then
par
Code:
If Range("E4") = "" Then
et remplace
Code:
ElseIf Not IsEmpty(Range("E4")) Then
par un simple
Code:
Else
.
Cordialement

EDIT Bonjour Papou-net
 

Guizmox

XLDnaute Nouveau
Re : Problème d'enchainement de conditions dans VBA

Merci bien à vous deux!

Et quelle réactivité!!!

En effet, comme le dirait un shadok : Plus c'est moins compliqué, moins il y aura plus d'erreurs! =)

Votre modification fonctionne très bien, et merci pour les explications!

Guizmox
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Problème d'enchainement de conditions dans VBA

Bonjour le fil, bonjour le forum,

Ta macro simplifiée en tenant compte des remarques de Papou-net et Efgé :
Code:
Sub RELEVEENCOURS()
Dim col As Integer 'déclare la variable col (COLonne)
Dim i As Integer 'déclarfe la variable i (incrément)
 
Application.ScreenUpdating = False
'Pour masquer les colonnes après le premier relevé
If Range("E4") = "" Then
    Columns("K:GN").Hidden = True
'Sinon, masquer les colonnes inutiles avant la selection
Else
    colonne = Range("IV4").End(xlToLeft).Column + 4
    For i = 4 To colonne
        Columns(i).Hidden = True
    Next i
    'masquer les colonnes inutiles après la selection
    For i = colonne + 8 To 200
        Columns(i).Hidden = True
    Next i
End If
Range("A7").Select
Application.ScreenUpdating = True
End Sub
Prend l'habitude de déclarer tes variables et évite les Select qui ralentissent considérablement le temps d'éxécution d'un code...
 

Papou-net

XLDnaute Barbatruc
Re : Problème d'enchainement de conditions dans VBA

Prend l'habitude de déclarer tes variables et évite les Select qui ralentissent considérablement le temps d'exécution d'un code...

Bonjour Robert,

Tiens, j'aurais juré que les Select Case étaient plus rapides que les If Then multiples ou imbriqués?

En tout cas, je les utilise dès que j'ai plus de deux conditions à tester, et je n'ai jamais remarqué de lenteur anormale dans le déroulement des programmes. Je dirais également que la structure du code est bien plus lisible et plus facile à modifier le cas échéant.

Mais peut-être me trompé-je ?

Cordialement.
 

Efgé

XLDnaute Barbatruc
Re : Problème d'enchainement de conditions dans VBA

Re au fil, Bonjour Robert :),
Je suis assez d'accord avec Robert sur les select.
Je pense qu'il fait allusion aux select qui concernent la feuille, les cellules, etc...
Le Select Case reste un faux Select qui n'affecte que le programme "en mémoire".

Pour continuer l'idée de simplification du code d'origine, on peux faire ça (avec en remarque une variante):
VB:
Sub RELEVEENCOURS_3()
Dim colonne As Long
Application.ScreenUpdating = False
If Range("E4") = "" Then
    Columns("K:GN").Hidden = True
Else
    colonne = Range("IV4").End(xlToLeft).Column + 4
    Range(Cells(4, 4), Cells(4, colonne)).EntireColumn.Hidden = True
    Range(Cells(4, colonne + 8), Cells(4, 200)).EntireColumn.Hidden = True
    'Application.Union(Range(Cells(4, 4), Cells(4, colonne)), _
    Range(Cells(4, colonne + 8), Cells(4, 200))).EntireColumn.Hidden = True
End If
Range("A7").Select 'inutile
Application.ScreenUpdating = True
End Sub

Cordialement
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972