Se connecter avec
S'enregistrer | Connectez-vous

Cacher / afficher des colonnes sous excell 2007 par une macro

Dernière réponse : dans Programmation

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

  1. Sub HideEmpty()
  2. '
  3. ' HideEmpty Macro
  4. ' Hides Columns with no element
  5. '
  6.  
  7. Columns("G:H").Select
  8. If Range("G72").Value = 0 Then
  9. Selection.EntireColumn.Hidden = True
  10. MsgBox "G72 = 0 => hide columns"
  11. Else
  12. Selection.EntireColumn.Hidden = False
  13. MsgBox "G72 <> 0 => un-hide columns"
  14. End If
  15.  
  16. Columns("J:K").Select
  17. If Range("J72").Value = 0 Then
  18. Selection.EntireColumn.Hidden = True
  19. MsgBox "J72 = 0 => hide columns"
  20. Else
  21. Selection.EntireColumn.Hidden = False
  22. MsgBox "J72 <> 0 => un-hide columns"
  23. End If
  24.  
  25. ' test hide-un_hide
  26. If Columns("G").EntireColumn.Hidden Then
  27. MsgBox "G is hidden"
  28. Else
  29. MsgBox "G is seen"
  30. End If
  31.  
  32. If Columns("J").EntireColumn.Hidden Then
  33. MsgBox "J is hidden"
  34. Else
  35. MsgBox "J is seen"
  36. End If
  37.  
  38. If Columns("R").EntireColumn.Hidden Then
  39. MsgBox "R is hidden"
  40. Else
  41. MsgBox "R is seen"
  42. End If
  43.  
  44. If Range("J72").Value = 0 Then
  45. Columns("J:K").EntireColumn.Hidden = True
  46. MsgBox "J72 = 0 => hide columns"
  47. Else
  48. Columns("J:K").EntireColumn.Hidden = False
  49. MsgBox "J72 <> 0 => un-hide columns"
  50. End If
  51.  
  52. If Columns("J").EntireColumn.Hidden Then
  53. MsgBox "J is hidden"
  54. Else
  55. MsgBox "J is seen"
  56. End If
  57.  
  58. If Range("J72").Value = 0 Then
  59. Columns("J").EntireColumn.Hidden = True
  60. Columns("K").EntireColumn.Hidden = True
  61. MsgBox "J72 = 0 => hide columns"
  62. Else
  63. Columns("J").EntireColumn.Hidden = False
  64. Columns("K").EntireColumn.Hidden = False
  65. MsgBox "J72 <> 0 => un-hide columns"
  66. End If
  67.  
  68. If Columns("J").EntireColumn.Hidden Then
  69. MsgBox "J is hidden"
  70. Else
  71. MsgBox "J is seen"
  72. End If
  73.  
  74.  
  75.  
  76. ' If Range("G72").Value = 0 Then
  77. ' Columns("G:H").EntireColumn.Hidden = True
  78. ' MsgBox "G72 = 0 => hide columns"
  79. ' Else
  80. ' Columns("G:H").EntireColumn.Hidden = False
  81. ' MsgBox "G72 <> 0 => un-hide columns"
  82. ' End If
  83. ' If Range("J72").Value = 0 Then
  84. ' Columns("J:K").EntireColumn.Hidden = True
  85. ' MsgBox "J72 = 0 => hide columns"
  86. ' Else
  87. ' Columns("J:K").EntireColumn.Hidden = False
  88. ' MsgBox "J72 <> 0 => un-hide columns"
  89. ' End If
  90.  
  91. End Sub



code pour faire afficher (ne fonctionne pas non plus
  1. Sub UnHideEmpty()
  2. '
  3. ' Un-HideEmpty Macro
  4. ' Hides Columns with no element
  5. '
  6.  
  7. Columns("G:H").EntireColumn.Hidden = False
  8. Columns("J:K").EntireColumn.Hidden = False
  9. MsgBox "un-hide columns G:H, J:K, ..."
  10.  
  11. End Sub


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

  1. Sub Set_A60_1()
  2. Range("A60").Value = "'1"
  3. End Sub
  4. Sub Set_A60_2()
  5. Range("A60").Value = "'2"
  6. End Sub
  7. Sub Set_A60_Null()
  8. Range("A60").Value = ""
  9. End Sub

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

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 :
  1. For i = 0 To n - 1
  2. ... = Cells(72, i * 3 + 7).Value = 0
  3. Next


Et voilà !

Citation :
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).

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

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

Alors compliquons un peu les choses [:patch]

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

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

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


:whistle: 

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


:D 
Expert Programmation

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) :/ 

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 ?
Expert Programmation

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

à 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

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


Expert Programmation

>> 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
  1. !!!!
  2.  
  3. ---------------------------------
  4.  
  5. [code]Columns("G:H" ).EntireColumn.Hidden = False

Ce code et ridicule ! :o 
Columns renvoie déjà des colonnes entières :spamafote: 

  1. Columns("G:H" ).Select
  2. If Range("G72" ).Value = 0 Then
  3. Selection.EntireColumn.Hidden = True
  4. MsgBox "G72 = 0 => hide columns"
  5. Else
  6. Selection.EntireColumn.Hidden = False
  7. MsgBox "G72 <> 0 => un-hide columns"
  8. End If
Bon, ok. C'est parce que ce sont des tests.
Ecrivons ça plus proprement :
  1. 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 ?

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

  1. . If cells(72, 176).Value = 0 Then
  2. . Columns(" 176" ).EntireColumn.Hidden = True
  3. . Else
  4. . Columns(" 176" ).EntireColumn.Hidden = False
  5. . End If
  6. .
  7. . If cells(72, 177).Value = 0 Then
  8. . Columns(" 177" ).EntireColumn.Hidden = True
  9. . Else
  10. . Columns(" 177" ).EntireColumn.Hidden = False
  11. . End If
  12.  
  13. . If cells(72, 178).Value = 0 Then
  14. . Columns(" 178" ).EntireColumn.Hidden = True
  15. . Else
  16. . Columns(" 178" ).EntireColumn.Hidden = False
  17. . End If
  18.  
  19. . If cells(72, 179).Value = 0 Then
  20. . Columns(" 179" ).EntireColumn.Hidden = True
  21. . Else
  22. . Columns(" 179" ).EntireColumn.Hidden = False
  23. . End If
  24.  
  25. . ..... 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)

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

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, 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
Expert Programmation

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 :jap: 

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
Expert Programmation

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:  !!!
Lassé par la pub ? Créez un compte