[VB.NET -> VBA]erreur d'execution 1004 erreur définie par l'application ou par l [Résolu]

Signaler
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour à tous.

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.

35 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
227
Bonjour,
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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Ton problème provient d'ici
ad_cel = Cel_vide.Columns

Il y a un "s" de trop

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
227
car mon aide VBA ne connait pas EntireColumn

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.
merci pour vos réponses et la requalification de mon post,

Pour la première réponse, j'ai pas tout suivi, car mon aide VBA ne connait pas EntireColumn

Pour la seconde, ça fonctionne et je vous en remercie.

Un grand merci à tous et à bientôt pour d'autres soucis.


Troph
Super merci

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 vous avez des idées, je suis preneur...

Merci d'avance

Troph
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
ARGHHHHHHHHHH !!!!

Là c'est moi qui coince.

Je pense que je vais repenser tout le fichier,

J'ai dans l'idée d'utiliser cette formule

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?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
merci

pour l'aide je vais voir demain.

les plages seront toujours les mêmes donc pas de soucis la dessus.

merci je vous dis quoi...

Merci

troph
Voila j'ai réussi...

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


J'ai essayé avec ceci aussi :

Sheets("test1").Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Sheets("test2").Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete
Sheets("test3").Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete


mais ne me demandez pas pourquoi, ça ne marche pas il commence par la feuille3

idem si j'utilise une boucle "for" niet popov ça marche pas.
pourtant c'est ce qu'il y a de plus simple à mon avis.

Sheets(feuille(i)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete


Bref ça fonctionne comme je l'ai mis plus haut, donc j'y touche plus.


Un grand merci à tous


Troph

PS pour l'aide, il est normal que ça ne marchait pas puisque je ne l'avais pas installée. Oups désolé...
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Salut à tous

Revoila le Boulet.

. 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

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


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

Sheets(feuille(2)).Range("B2:K2").SpecialCells(xlErrRef).EntireColumn.Delete


Si vous avez une idée, je suis preneur à 100 %

merci d'avance

Troph
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Bonsoir et merci pour vos éclaircissements.

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

merci d'avance

Trophinou
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
J'ai choisis de la cacher.

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.

Sheets(feuille(1)).Range("B2:K2").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True


Merci d'avoir eu cette idée.

merci pour votre aide.

Troph
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
>>> Sheets(feuille(1))

Est-ce que feuille est un Array que tu as créé ?

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Alors non j'ai pas créé d'array.
j'aurai pu remarque, mais là j'ai défini feuille(1) avant comme cela.

feuille(1) = "test1"
feuille(2) = "test2"
feuille(3) = "test3"

test1 2 et 3 étant les noms de mes feuillets.


mon code se résume donc à ceci pour le moment

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


++

Troph
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
227
Bonjour,
1)
Alors non j'ai pas créé d'array

et
2)
Dim feuille(1 To 3) As String

Alors :
3)

________________________
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.
Ah ?!!!

je pensais qu'il fallait définir le tableau avec le mot array...

bref...

Merci de la précision