Désolé je ne sais pas si mon message est dans la bonne rubrique ou non.
voila mon soucis.
je suis sous XP avec excel.2003
je voudrais faire la manip suivante mais ça coince quelque part et je ne sais pas pourquoi.
PS j'ai déjà plus ou moins programmé en pseudo C++ sur les jeu Call of duty mais là j'y connais que dalle.
Bon je voudrais sur ma feuille excel faire la manip suivante.
1. avoir un bouton pour exécuter la macro (ça j'y suis arrivé)
2. En appuyant sur le bouton supprimer toute les colonnes vides sur une plage donnée.
exemple : ligne 1 (de B2 à K2)
sur cette ligne j'ai tous mes items de 1 à 10 pex (noté 1 ... 10)
mais si je ne veux pas du 3 et du 5 je les enlève (efface 3 et 5 des cases) puis en exécutant la macro je voudrais virer ces 2 colonnes.
en furetant sur les forum j'ai trouvé des codes que j'ai ensuite quelque peu remaniés.
celui que j'utilise est le suivant.
Sub testcolonne()
Dim Cel_vide As Range
Dim ad_cel As Byte
For Each Cel_vide In Range("B2:K2")
If Cel_vide.Value = "" Then
ad_cel = Cel_vide.Columns
Columns(ad_cel).Delete <= c'est ligne qui pose problème. End If
Next Cel_vide
End Sub
Si vous avez une réponse à m'apporter je suis preneur.
Troph
PS ceci est un test car sur la version finale il y aura bien plus que 10 items.
A voir également:
[VB.NET -> VBA]erreur d'execution 1004 erreur définie par l'application ou par l
Désolé je ne sais pas si mon message est dans la bonne rubrique ou non
tu ne l'étais en effet pas et un administrateur bienveillant a dû déplacer ta discussion dans la section Langages dérivés > VBA.
Prends-en bonne note. Ce sera la section dans laquelle tu devras dorénavant ouvrir toute discussion VBA.
Pour ce qui est de ton problème ; ouvre ton aide VBA sur le mot EntireColumn et lis.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Bizarre de chez bizarre !
remplacee ton code de testcolonne par ceci, pour voir :
On Error Resume Next '(pour le cas où aucune vide)
Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
On Error GoTo 0
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
les 2 scripts fonctionnent parfaitement sauf que...
Comme un con j'ai des appels de cellule d'une page à l'autre et si je supprime les colonnes, j'ai un soucis au niveau des REFERENCEMENTS, j'obtiens dans ma case "#REF!"
avec la liaison comme ceci : "=SI(Feuil1!#REF!="";"";Feuil1!#REF!)"
Une solution serait d'appliquer la macro de la dernière page vers la première, mais j'ai pas mal de pages interagissant ensemble, ce qui complique la chose.
Auriez vous une idée pour pouvoir garder les référencements d'une page à l'autre ???
***Le but de mon fichier est de faire un bulletin de base pour mon école.*** Avec plusieurs pages :
1 pour entrer les notes.
les autres pour calculer moyenne, absence, et transformer la note en ABCD) etc.
la dernière pour un récapitulatif de toute la classe.
et ceci pour plus de 200 items en maths, français etc...
Chacun ne traitant pas les mêmes items en même temps, il suffirait d'effacer le numéro de l'item puis appliquer la macro pour supprimer la colonne indésirable. (ça évite d'avoir des feuilles récapitulatives avec des vides)
Attention une autre chose à prendre en compte, mes collègues sauront effacer les numéro d'item, et appuyer sur un bouton, mais elles ne sauront rien faire de plus... Donc la solution doit être simple.
Si tu es obligé de supprimer des colonnes et que ça bousille tes formules, tu pourrais récrire ces formules dans ta macro une fois les colonnes supprimées.
Ça se fait très bien par code.
Regarde Formula dans ton aide et pense à transcrire tes formules en anglais.
Si tu ne connais pas la syntaxe anglaise, positionne-toi sur une cellule avec formule française et crée une macro avec seulement ceci
MsgBox Activecell.Formula
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
On Error Resume Next '(pour le cas où aucune vide)
Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
On Error GoTo 0
alors ma question : est-il possible d'appliquer cette formule sur toutes les pages de façon séquentielle avec des plage différentes à chaque fois pour ne cliquer qu'une seule fois sur le bouton, où faut-il copier le bouton sur chaque page et l'activer manuellement à chaque fois.
Désolé de mes questions connes, mais là je coince...
Troph
PS quand vous parlez d'aide c'est quoi exactement ?
Quand je clique sur le "?" d'excel et que je mets formula dans le champ, je n'ai aucun résultat. Est-ce de cette aide dont vous parlez?
Pour l'aide, tu as celle d'Excel n'importe où dans l'application en tapant F1, mais aussi une autre dédiée au VBA dans l'éditeur, toujours en tapant F1. Si tu sélectionnes un mot-clé avant F1, l'aide se positionnera sur l'aide particulière de ce mot.
Le bout de code que tu donnes peut servir avec certaines modifications si tu ce n'est pas la même feuille ou si ce ne sont pas les mêmes colonnes.
Par contre, l'important c'est de savoir si ces feuilles et ces colonnes seront toujours constantes ou si ça changera au gré du temps...
Dans
Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
la plage sera toujours B2:K2 et la feuille sera toujours celle active parce que son nom n'est pas spécifié comme dans
Sheets("Feuil1").Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
les colonnes sont délétées dans l'ordre adéquat... OUF!!!
test1 2 3 étant le nom de mes onglets.
Sub testcolonne()
Dim feuille(1 To 3) As String
feuille(1) = "test1"
feuille(2) = "test2"
feuille(3) = "test3"
On Error Resume Next '(pour le cas où aucune vide)
Sheets(feuille(1)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Sheets(feuille(2)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Sheets(feuille(3)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
On Error GoTo 0
End Sub
Connaissant le nom des feuilles, tu aurais aussi pu faire
Dim I as Integer, arrFeuilles as Variant
arrfeuilles = Array("test1", "test2", "test3")
For I = 0 to Ubound(arrFeuilles) Sheets(arrFeuilles(i)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Next
et probablement aussi
For I = 1 to 3
sheets("test" & i).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Next
Bonne continuation
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
. question 1 Dans une macro, les lignes de commandes s'exécutent-elles bien les unes après les autres, dans l'ordre des lignes ?
. question 2 Chaque commande attend-elle bien la fin de l’exécution de la commande précédente pour commencer ?
. question 3(si les questions 1 et 2 ont des réponses positives.) Ma feuille 3 est celle qui contient les valeurs numériques à calculer et les colonnes à virer si telle ou telle cases sont vides.
mes feuilles 1 et 2 vont chercher les valeurs sur la feuille 3 et font des calculs de base somme / moyenne. Elles vont aussi chercher les valeurs des cases à tester au cas où elles seraient vides
Pour limiter les dégats,
je fais déléter les colonnes vides à partir de la feuille 1 vers la 3, (pensant que comme c'est la feuille référente, si une colonne est supprimée il n'y aura pas d'erreur sur les autres feuilles.)
le code permettant de faire cette action est le suivant
Code activé par un bouton qui est sur la feuille 1
Or si tout se passe bien sur les feuilles 1 et 3 la feuille 2 ne délète pas de colonne, mais a "#REF!" dans les cases qui devraient normalement avoir disparu. (logique puisque les cases référentes ont elles disparu sur la feuille 3.)
Il semblerait donc que l'action se ferait d'abord sur la 1 puis 3 puis 2 engendrant une erreur de type REF.
Trouvez vous cela logique?
. Question 4
J'ai tenté d'utiliser la fonction iserror, mais sans succès je dois avoir raté un épisode sur l'aide xl.
Par contre j'ai écrit cette ligne en m'inspirant des lignes précédentes, mais je doute fort qu'elle soit correcte, car si elle n’engendre pas d'erreur lors de l'exécution de la macro, rien ne se passe sur cette P... de feuille 2
Pour les questions 1 et 2, oui
Chaque ligne est lue et "effectuée" complètement avant la suivante.
Pour la question 3, difficile à dire sans tout voir...
Si tu as des formules dans les feuilles 1 et 2 qui réfèrent à la feuille 3 et que tu supprimes des colonnes dans cette feuille 3, il y a de fortes chances que ces formules soient foutues... Ça dépend des formules...
Ma question... est-ce nécessaire de supprimer des colonnes ?
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
En effet je me doutais des réponses pour mes 2 premières questions.
Comme quoi le scripting sur call of Duty n'était pas inutile.
Pour les formules.
j'ai tester moyenne et somme, malgré les colonnes disparues ça fonctionne encore. (du moins sur la page 1 pas la 2. Grrrrr...)
Est-ce nécessaire de supprimer les colonnes ? Ta question n'est pas idiote du tout et j'y ai réfléchi toute la soirée et dormant devant ma télé.....
Si je voulais les supprimer, c'était par soucis de lisibilité pour avoir tous les résultats sur 2 feuilles maxi.
Mais il doit exister un système pour redimensionner les largeurs de colonnes pour ne plus les mettre que sur 1 pixel. Dans ce cas y aura plus de soucis d'appel de valeur d'une feuille à l'autre, car la colonne serait simplement cachée.
Si vous saviez me décoincer, j'en serais très heureux, car les bulletins finaux arrivent à grands pas...
Tu as différentes possibilités.
Masquer les colonnes sans les supprimer
Ajuster la largeur des colonnes à un minimum pour la lisibilité
Refaire les formules, une fois les colonnes supprimées
...
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
voila ma phrase et ça marche, sauf pour le feuillet 2 (encore une fois), mais j'ai du faire un truc spécial sur ce feuillet sans m'en rendre compte et du coup ça merde.
Sub testcolonne()
Dim feuille(1 To 3) As String
feuille(1) = "test1"
feuille(2) = "test2"
feuille(3) = "test3"
On Error Resume Next '(pour le cas où aucune vide)
Sheets(feuille(1)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True
Sheets(feuille(2)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True
Sheets(feuille(3)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True
On Error GoTo 0
End Sub
Je rappelle que ce fichier est pour le moment un fichier test pour me familiariser avec les VBA. le fichier final sera plus complexe et surtout plus volumineux...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.