Résolu Cacher / afficher des colonnes sous excell 2007 par une macro

  • Auteur de la discussion shaoul
  • Date de début

shaoul

Grand Maître
bonjour
ms office 2007 (fr) / spreadsheet au format 2003 (*.xlsM)
les macros sont autorisées

je n'arrive pas à cacher une colonne affichée ou faire afficher une colonne cachée
je passe bien par mon code (les text-box s'affichent)
je peux exécuter des macros (modifier la valeur d'une cellule)


les 'messages boxes' affichent bien ce qui correspond à la réalité
la colonne 'R' est cachée (fait à la main)
G72 (somme) a une valeur <>0 donc doit rester affichée
J72 (somme) a une valeur =0 donc devrait être cachée
je passe par les bonnes parties de code (je le vois grâce aux 'message boxes)
j'ai essayé plusieurs méthodes

le test sur la visibilité de la colonne 'R' affiche le bon résultat

donc il semble que je n'arrive pas à imposer une valeur à l'attribut 'hidden' (true ou false)

merci d'avance pour vos conseils

[cpp]
Sub HideEmpty()
'
' HideEmpty Macro
' Hides Columns with no element
'

Columns("G:H").Select
If Range("G72").Value = 0 Then
Selection.EntireColumn.Hidden = True
MsgBox "G72 = 0 => hide columns"
Else
Selection.EntireColumn.Hidden = False
MsgBox "G72 <> 0 => un-hide columns"
End If

Columns("J:K").Select
If Range("J72").Value = 0 Then
Selection.EntireColumn.Hidden = True
MsgBox "J72 = 0 => hide columns"
Else
Selection.EntireColumn.Hidden = False
MsgBox "J72 <> 0 => un-hide columns"
End If

' test hide-un_hide
If Columns("G").EntireColumn.Hidden Then
MsgBox "G is hidden"
Else
MsgBox "G is seen"
End If

If Columns("J").EntireColumn.Hidden Then
MsgBox "J is hidden"
Else
MsgBox "J is seen"
End If

If Columns("R").EntireColumn.Hidden Then
MsgBox "R is hidden"
Else
MsgBox "R is seen"
End If

If Range("J72").Value = 0 Then
Columns("J:K").EntireColumn.Hidden = True
MsgBox "J72 = 0 => hide columns"
Else
Columns("J:K").EntireColumn.Hidden = False
MsgBox "J72 <> 0 => un-hide columns"
End If

If Columns("J").EntireColumn.Hidden Then
MsgBox "J is hidden"
Else
MsgBox "J is seen"
End If

If Range("J72").Value = 0 Then
Columns("J").EntireColumn.Hidden = True
Columns("K").EntireColumn.Hidden = True
MsgBox "J72 = 0 => hide columns"
Else
Columns("J").EntireColumn.Hidden = False
Columns("K").EntireColumn.Hidden = False
MsgBox "J72 <> 0 => un-hide columns"
End If

If Columns("J").EntireColumn.Hidden Then
MsgBox "J is hidden"
Else
MsgBox "J is seen"
End If



' If Range("G72").Value = 0 Then
' Columns("G:H").EntireColumn.Hidden = True
' MsgBox "G72 = 0 => hide columns"
' Else
' Columns("G:H").EntireColumn.Hidden = False
' MsgBox "G72 <> 0 => un-hide columns"
' End If
' If Range("J72").Value = 0 Then
' Columns("J:K").EntireColumn.Hidden = True
' MsgBox "J72 = 0 => hide columns"
' Else
' Columns("J:K").EntireColumn.Hidden = False
' MsgBox "J72 <> 0 => un-hide columns"
' End If

End Sub
[/cpp]


code pour faire afficher (ne fonctionne pas non plus
[cpp]
Sub UnHideEmpty()
'
' Un-HideEmpty Macro
' Hides Columns with no element
'

Columns("G:H").EntireColumn.Hidden = False
Columns("J:K").EntireColumn.Hidden = False
MsgBox "un-hide columns G:H, J:K, ..."

End Sub
[/cpp]

code pour modifier la valeur d'une cellule
(fonctionne correctement)

[cpp]
Sub Set_A60_1()
Range("A60").Value = "'1"
End Sub
Sub Set_A60_2()
Range("A60").Value = "'2"
End Sub
Sub Set_A60_Null()
Range("A60").Value = ""
End Sub
[/cpp]
 

zeb

Modérateur
Salut,

Evite les Select/Selection (Lignes 7/9, 7/12, 16/18, 16/21). D'autant que tu le fait très bien ligne 45 et suivante. Par principe, je n'aime pas les Select. Mais sélectionner une cellule dont on va cacher la colonne, ça ne me semble vraiment pas pertinent !

Concernant plus particulièrement ton problème, je me l'explique très difficilement :/
Y-a-t'il un message d'erreur ?

Sans plus d'explication, je pense à un problème de protection de la feuille. Est-ce ton cas ? (mais dans ce cas, il y a un message d'erreur) :/
 

shaoul

Grand Maître
merci zeb

comme tu vois j'ai essayé pas mal de façons et je tourne en rond (tournicottons - enfin tu connais ...)

non, pas de message d'erreur

j'ai essayé les mêmes codes mais au lieu de hidden, j'ai essayé de jouer avec 'ColumnWidth' et ça ne passe pas non plus :(

ColumnWidth=0 (pour cacher)
ColumnWidth=5 ou =11 (pour montrer)

à la main, oui c'est bon, mais pas par une macro

> je pense à un problème de protection de la feuille
ça m'était aussi venu en tête
comment le vérifier (j'ai hérité de cette feuille et l'auteur initial n'est plus joignable :(
> (mais dans ce cas, il y a un message d'erreur)
c'est ce que je me disais aussi

j'ai droit à un tour de manège ?
 

zeb

Modérateur
>> j'ai droit à un tour de manège ?
[:rofl]

------------------------

Je ne connais pas du tout les spécificités d'O.2007, y-a-t'il là une subtilité ?

Fais-le à la main, l'enregistreur de macro démarré.
Compare ce code et le tien.
Recopie le code dans ta feuille xlsM et vois si le fonctionnement diffère.
 

shaoul

Grand Maître
à la main ça marche (cacher une colonne, changer la largeur)

puis je refais 'à la main' tout en enregistrant le code ... c'est bon

puis j'exécute le code enregistré .... Niet, Nada, No, Non, Nein, ...

et, oui, j'ai autorisé les macros, toutes les macros

bon, j'ai du quitter au bureau, n'ayant pas les clés et le dernier ayant les clés partant. je suis à la maison maintenant (j'aime le bureau, mais chez moi c'est bien aussi)

excel n'arrivait pas à se fermer (un coup de task_manager et c'est parti)
peut être demain après un démarrage à froid, ça ira mieux ?

demain est un autre jour

entretemps, je profite d'un tour de manège ... enchanté

merci zeb en tout cas
 

shaoul

Grand Maître
ce matin c'est tout bon ....
je suppose qu'un 'cold-boot' pour le pc et un warm-boot pour le 'user' (tasse de café) ça a eu du bon

zeb (ou tout autre, mais honneur à zeb),
je programme déjà pas mal en vb (surtout vb6, mais je commence en vb2008 express), c, c++ et j'ai même tâté de fortran et cobol (ça date le personnage)
eh, oui, j'ai commencé en assembleur sur cp/m et apple ][ (8 bits, 1MHz de CPU, 64K ram - floppies de 120K)
(bon on ne va pas le crier sur tout les toits, mais je suis une pièce de musée, un monument classé, une espèce protégée)

j'ai nettement moins d'expérience en vba

je dois refaire la même manipulation pour un nombre important de colonnes
alors je me dis qu'écrire une boucle sera plus simple, plus lisible et plus souple

tu pourrais m'aider un peu ? (ou je crée un nouveau topic ?) - merci

du style
mode implicit ' pour contrôler le bon usage des variables
dim col as integer
for col = 7 to 31 step 3
. if cell(72, col)==0 then
. hide colonnes(col: col+1)
. else
. show colonnes(col: col+1)
. endif
next col

en attendant ta réponse, je m'y mets et je reviens ici si c'est ok


 

zeb

Modérateur
>> cp/m
:love: Mes premières z'amours, sur z80

-----------------------------------------

Reste sur le même topic ;)
Dis donc, t'as pas de bol, en plus d'être un des rares à filer des coups de main en VB, je suis modo ici. Alors je remets ma casquette de méchant :
- Balise
Code:
 !!!!

---------------------------------

[code]Columns("G:H" ).EntireColumn.Hidden = False
Ce code et ridicule ! :o
Columns renvoie déjà des colonnes entières :spamafote:

Code:
Columns("G:H" ).Select
If Range("G72" ).Value = 0 Then
Selection.EntireColumn.Hidden = True
MsgBox "G72 = 0 => hide columns"
Else
Selection.EntireColumn.Hidden = False
MsgBox "G72 <> 0 => un-hide columns"
End If
Bon, ok. C'est parce que ce sont des tests.
Ecrivons ça plus proprement :
Code:
Columns("G:H" ).Hidden = Range("G72" ).Value = 0
:sol:

A la place de Range(), qui accepte une adresse sous forme de chaîne de caractères et qui désigne toute une plage, intéresse-toi à Cells() qui accepte des coordonnées numériques pour désigner une seule cellule. Alors ?
 

shaoul

Grand Maître
en attendant, j'ai écrit un code 'spaghetti'
(c'est l'horreur mais je devais le sortir aujourd'hui)

Code:
.    If cells(72, 176).Value = 0 Then
.      Columns(" 176" ).EntireColumn.Hidden = True
.    Else
.      Columns(" 176" ).EntireColumn.Hidden = False
.    End If
.
.    If cells(72, 177).Value = 0 Then
.      Columns(" 177" ).EntireColumn.Hidden = True
.    Else
.      Columns(" 177" ).EntireColumn.Hidden = False
.    End If

.    If cells(72, 178).Value = 0 Then
.      Columns(" 178" ).EntireColumn.Hidden = True
.    Else
.      Columns(" 178" ).EntireColumn.Hidden = False
.    End If

.    If cells(72, 179).Value = 0 Then
.      Columns(" 179" ).EntireColumn.Hidden = True
.    Else
.      Columns(" 179" ).EntireColumn.Hidden = False
.    End If

.    ..... pour les colonnes avec incrément de 1

et semblable monstre pour les colonnes avec incrément de 3

j'ai honte !

(enfin, j'ai écrit un petit vb qui m'a généré le code - moins de risques d'erreurs)
(l'honneur est presque sauf)
 

shaoul

Grand Maître
rrrhhha j'ai loupé ton post

> 1.Columns("G:H" ).Hidden = Range("G72" ).Value = 0

très joli !

mais : je fais comment pour convertir les colonnes en notation 'lettres du style 25-> y, 27 -> aa ?

(j'ai l'halène lourde du boss qui attend son code ....)
 

shaoul

Grand Maître
il fait beau

le boss décide de partir plus tôt
et comme j'ai pris 2 jours de congé
je continuerai vendredi

entretemps, c'est hyper laid mais ça marche !
bon, j'ai d'autres éléments à débugger ...

petit doute, c'est compatible avec office 2003 ? (le boss n'aime pas 2007 car trop différent - je suis d'accord avec lui sur ce point)
 

zeb

Modérateur
Meilleure réponse
Rhoooo !

Tu n'as besoin de connaître que la première colonne ! Alors tu comptes sur tes doigts : A-B-C-D-E-F-G. C'est le 7ème doigt. Tu remplaces donc Range("G72") par Cells(72, 7).

Maintenant, on traite tes n colonnes :
Code:
For i = 0 To n - 1
    ... = Cells(72, i * 3 + 7).Value = 0
Next

Et voilà !

Mais euuuuuh. Comment je fais pour mes colonnes ?
Ben tu lis l'aide sur Columns. Et tu apprends que cette fonction accepte aussi bien les adresses (chaîne de caractères) que les coordonnées (une seule pour une colonne).

Code:
For i = 0 To n - 1
    Columns(i * 3 + 7).Hidden = Cells(72, i * 3 + 7).Value = 0
Next
:sol:

Quoi encore ?
J'ai deux colonnes :o
Ah, oui :
Code:
For i = 0 To n - 1
    Columns(i * 3 + 7).Hidden = Cells(72, i * 3 + 7).Value = 0
    Columns(i * 3 + 8).Hidden = Cells(72, i * 3 + 7).Value = 0
Next
Strofacile

Alors compliquons un peu les choses [:patch]

Code:
For i = 0 To n - 1
    Cells(72, i * 3 + 7).EntireColumn.Hidden = Cells(72, i * 3 + 7).Value = 0
    Cells(72, i * 3 + 8).EntireColumn.Hidden = Cells(72, i * 3 + 7).Value = 0
Next
Et toc, du EntireColumn :D

Y'a trop de Cells(72, i * 3 + 7) !

Code:
Dim c As Range
For i = 0 To n - 1
    Set c = Cells(72, i * 3 + 7)
    c.EntireColumn.Hidden = c.Value = 0
    c.Offset(,1).EntireColumn.Hidden = c.Value = 0
Next

:whistle:

Code:
Dim c As Range
For i = 0 To n - 1
    Set c = Cells(72, i * 3 + 7)
    Range(c, c.Offset(,1)).EntireColumn.Hidden = c.Value = 0
Next

:D
 

shaoul

Grand Maître
zeb, un grand merci

je commence 2 jours de congé ... et attrape un rhube de cerbeau ! aaaaatchaaaa !
ça m'apprendra à ne pas mettre mon antivirus à jour !

j'avais essayé un code du genre (mais nettement moins beau)

là ma petite cellule grise s'est mise en grève, mode 'mal de tête carabiné'
je cours chercher du [ censuré ] 1gr.

à plus
 

zeb

Modérateur
Si tu prétends avoir si mal au crâne, c'est pour en fait avouer que tu as cherché à comprendre les exemples que je te donnais. Savoir que tu te donnes cette peine est ma plus belle récompense :merci:
 

shaoul

Grand Maître
désolé, zeb mais ton code me semblait assez clair donc ce n'est pas vraiment ça qui tambourinnait dans mon crâne
même les dernières boxes de code
(ou alors je sombrais dans mes délires suite à la fièvre)

merci encore pour ta gentillesse, la clarté de ton code, ta patience et ta promptitude

je peux déposer la brosse et le cirage maintenant ou je dois en remettre une couche ?
non, je pense vraiment ce que je dis
j'ai été fort actif (avant mon travail) sur une autre partie de ce forum et ce sais ce que ça représente


j'ai implémenté le tout ce jour, modifié encore pas mal de trucs à gauche et à droite et emballé le tout dans un mail pour le boss

c'est très nettement plus propre comme code

il faudra que je m'achète (ou me fasse acheter) un bon livre sur vb2008, vba 2008 et office (surtout excel & word)


je viens de récupérer un serveur 2003 que des gens mettaient dans leur cour, sous la pluie !
à mon avis tout fonctionne (pas encore essayé, j'attends qu'il sèche bien)

si c'est bon, c'est un win 2003 (serveur évidemment) sbs donc avec sql et exchange et plein d'autres trucs
un contrôleur à première vue raid 0/1/2 qui semble hot-swap en plus
3 disques durs
bon boîtier
bonne alim
 

zeb

Modérateur
S'il te faut écrire pas mal de code en VB, un bon bouquin est une très bonne chose.
Que cela ne te dispense pas de venir avec tes questions, elles n'en seront que plus intéressantes ;)

Mais c'est la cour des Miracles :ouch: !!!
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 156
Messages
6 718 486
Membres
1 586 439
Dernier membre
Thailounette
Partager cette page
Haut