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

Résolu
Trophinou - 18 avril 2013 à 18:23
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 2 juin 2013 à 14:31
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

Hola todos.

Vous pensiez vous être débarrassé de moi, et bien non...

Voila mon nouveau soucis.

j'utilise les formules que vous m'avez données et elles fonctionnent à merveille lorsque je renseigne moi même les cases influentes.

comme ceci par exemple :
Sheets(feuille(1)).Range("D4:CF4").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True

ici les colonnes dont les cases sont vides entre D4 et CF4 se cachent automatiquement.
Ce qui est mon but !!!


Mais, le soucis est le suivant :

je ne renseigne pas toujours mes cases manuellement, mais aussi par des appels entre feuillets comme ceci.

=feuille3!D4

ou comme cela
=SI(ESTNUM(feuille3!D4;feuille3!D4;"")

directement dans les cases.

Ceci me permet de ne pas retranscrire à la main des centaines de cases.

Le soucis est que : j'ai l'impression que le fait qu'il y ait une formule sur la case, (même si rien ne s'affiche) la macro considère que la case n'est pas vide.

Auriez vous un avis la dessus ?

merci

tropheus
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 mai 2013 à 03:16
Bonjour,

En passant, XML n'est pas ton langage, je pense...
Donc, quand tu sélectionnes ton bout de code, choisis VBA...

Si tu écris
=feuille3!D4

dans une cellule, rien n'empêche une valeur nulle ou autre

Maintenant, si tu ne veux pas qu'une macro ou une formule considère une cellule qui contient une formule (donc pas vraiment vide), il faut lui dire explicitement...

Utilise .Text ou .Value dans le cas d'un code VBA

Aussi, il faudrait savoir exactement ce que tu cherches à faire
Une ligne masquée contient toujours son contenu....

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Ce que je veux faire

J'ai un tableau avec pls colonnes dont certaines ne servent pas au même moment.
ces colonnes je voudrais les cacher pour que le tableau soit plus pratique à remplir. (peut importe ce qu'elles contiendront.

J'ai une ligne D4:CF4 sur laquelle certaines cases ont des numéros et d'autres non.
le but est de cacher les colonnes où les cases sont vides.

Si je remplis à la main ya pas de soucis, mais si je fais un appel d'un feuillet à l'autre là ça coince. les colonnes ne se cachent plus. (comme les chaussettes)

si tu veux jeter un oeil voici la bête

http://tropheus.tropheus.free.fr/fichiers/bulletinCE2.xls

sur ce test

mon but est que chaucn supprime manuellement dans la ligne jaune ligne4
le numéro des items qui ne l’intéressent pas. et ce pour les feuillet math francais decouv

sur le "récapitulatif", je voudrais que les lignes vides (entre 29 et 35) ainsi que toutes les colonnes vides se cachent.
idem pour le feuillet classement

merci d'avance

tropheus
ensuite chaucn
0
Utilisateur anonyme
28 mai 2013 à 02:41
Bonjour,

ces colonnes je voudrais les cacher pour que le tableau soit plus pratique à remplir. (peut importe ce qu'elles contiendront.

J'ai une ligne D4:CF4 sur laquelle certaines cases ont des numéros et d'autres non.
le but est de cacher les colonnes où les cases sont vides.

sur le "récapitulatif", je voudrais que les lignes vides (entre 29 et 35) ainsi que toutes les colonnes vides se cachent.
idem pour le feuillet classement


Tu peux faire tout cela avec les filtres. Et l'enregistreur de macros peut te mâcher le travail.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
même si ce n'est pas les mêmes cellules a vider au cours des utilisations ?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
28 mai 2013 à 22:45
L'enregistreur va te donner un bout de code qu'il te restera à modifier au besoin...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
pas si facile que ça...

voila comment j'ai procédé.

j'ai lancé l'enregistrement puis j'ai sélectionner les colonnes dans laquelle ma case test était vide.
clic droit masque.

et stopper l'enregistrement.

Columns("C:C").Select
    Selection.EntireColumn.Hidden = True
    Columns("F:F").Select
    Selection.EntireColumn.Hidden = True


ma question est maintenant comment faire en sorte de cibler les colonnes dans lesquelles certaines cases sont vides d'affichage, mais qui peuvent cependant contenir une formule impliquant un affichage inexistant.

Merci

Troph
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
29 mai 2013 à 12:35
Voici une façon de faire, si j'ai bien compris

    Dim I As Long, J As Long, Nb As Long
    Dim nbLignes As Long, nbColonnes As Long
    
    'Nombre de lignes - Calcul sur colonne A
    nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
    'Nombre de colonnes - Calcul sur ligne 1 (entêtes)
    nbColonnes = Cells(1, Columns.Count).End(xlToLeft).Column
    
    For J = 1 To nbColonnes  'lecture de chaque colonne
        Nb = 0
        For I = 2 To nbLignes 'lecture de chaque ligne, excluant les entêtes
            If Cells(I, J).Value = "" Then
                'on incrémente de 1 à chaque cellule vide
                Nb = Nb + 1
                'Si toutes les cellules sont vides, on masque
                If Nb nbLignes - 1 Then Columns(J).Hidden True
            Else  'On a trouvé au moins une valeur et on sort
                Exit For
            End If
        Next
    Next



MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Bon le chieur est à nouveau là

Ton code marche parfaitement sur la feuille active.

or j'ai la même chose à appliquer sur différentes feuilles.

j'ai bien fait comme ceci pour appliquer à une feuille particulière
(feuille définie auparavant)

If Nb nbLignes - 1 Then Sheets(feuille(2)).Columns(J).Hidden True


mais si je copie cette ligne et que je change le numéro de feuille ça ne marche pas si les cases vides ne sont pas les mêmes.

Nb nbLignes - 1 Then Sheets(feuille(2)).Columns(J).Hidden True
Nb nbLignes - 1 Then Sheets(feuille(1)).Columns(J).Hidden True
Nb nbLignes - 1 Then Sheets(feuille(3)).Columns(J).Hidden True


ya-t'il moyen d'appliquer ton code sur chaque feuille de manière autonome?
je pense qu'un For peut aider, mais j'ai jamais étais très "for" en boucle...


++

Troph
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
29 mai 2013 à 22:54
Tu peux soit passer toutes les feuilles et vérifier leur nom si nécessaire ou te créer un tableau de feuille et boucler ce tableau.
Ça dépend si tu as beaucoup de feuilles et seulement quelques-unes dont tu veux masquer les lignes/colonnes

Une méthode parmi d'autres
Dim arrFeuilles as Variant
arrFeuilles = Array("Feuil1","MaFeuille2","UneAutre") 'les noms des feuilles

for x = 0 to UBound(arrFeuilles)
   arrFeuilles(x).Activate
   'Tout le code que j'ai mis à part les dim
Next


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
argh erreur 424 avec pointage sur la ligne en rouge.

voila le code que j'ai mis j'espère ne pas avoir fais de sonnerie.

Sub Macro1()
'
    Dim I As Long, J As Long, Nb As Long
    Dim nbLignes As Long, nbColonnes As Long
    'Nombre de lignes - Calcul sur colonne A
    nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
    'Nombre de colonnes - Calcul sur ligne 1 (entêtes)
    nbColonnes = Cells(2, Columns.Count).End(xlToLeft).Column
    Dim arrFeuilles As Variant
arrFeuilles = Array("test1", "test2", "test3") 'les noms des feuilles

 For x = 0 To UBound(arrFeuilles)
   arrFeuilles(x).Activate
   'Tout le code que j'ai mis à part les dim
    
      For J = 1 To nbColonnes  'lecture de chaque colonne
        Nb = 0
        For I = 2 To nbLignes 'lecture de chaque ligne, excluant les entêtes
            If Cells(I, J).Value = "" Then
                'on incrémente de 1 à chaque cellule vide
                Nb = Nb + 1
                'Si toutes les cellules sont vides, on masque
                If Nb nbLignes - 1 Then Columns(J).Hidden True
             ' Sheets(feuille(2)).Columns(J).Hidden = True
              
            Else  'On a trouvé au moins une valeur et on sort
                Exit For
            End If
        Next
    Next
Next


End Sub
0
dsl la couleur passe pas avec les basile

arrFeuilles(x).Activate
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
30 mai 2013 à 22:57
Oups... désolé
c'est plutôt Sheets(arrFeuilles(x)).Activate

Aussi mets les initialisations de nbLignes et nbColonnes à l'intérieur de la boucle For x ...Next, avant le For J..., autrement le nombre de lignes et de colonnes seront toujours identiques, ce qui n'est peut-être pas le cas...

    'Nombre de lignes - Calcul sur colonne A
    nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
    'Nombre de colonnes - Calcul sur ligne 1 (entêtes)
    nbColonnes = Cells(2, Columns.Count).End(xlToLeft).Column

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Salut me revoilou.

Le code que me mets MPi fonctionne si toutes les cases de la colonne concernées sont vides.
Or sur mon tableau ce n'est pas le cas, car il y a des entêtes etc...

Mes cases à scanner ne sont que sur une seule ligne. (ligne 2)

Si la case est vide sur la ligne 2 la colonne dans laquelle elle se trouve doit être masquée même si dans les autres cases de cette colonne il y a des valeurs.

D'autre part, j'ai tenté de comprendre ton bout de code, et je me posais une question

les cases sont bien repérer par le couple (abscisse, ordonnée.)
c'est à dire (colonne , ligne) ?

Si c'est le cas n'y a-t'il pas inversion de I et J dans cette formule?

If Cells(I, J).Value = "" Then


j'ai tenté d'inverser, mais rien n'y a fait.
j'ai aussi tenté de fixer I et J en leur donnant la valeur 2 (ligne 2)
mais le tout sans succès.

++

troph
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 juin 2013 à 14:31
Si tu dois vérifier seulement la ligne 2, tu n'as donc plus besoin d'une 2e boucle.

For I = 1 to nbColonnes
 If Sheets(arrFeuilles(X)).Cells(2, I) = "" Then
   Sheets(arrFeuilles(X)).columns(I).Hidden =True
...



MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Rejoignez-nous