Erreur macro sur fonction "If Not Intersect..."
Résolu/Fermé
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
-
18 juin 2015 à 16:44
Éternité... Messages postés 28 Date d'inscription dimanche 21 septembre 2008 Statut Membre Dernière intervention 19 juin 2015 - 19 juin 2015 à 16:20
Éternité... Messages postés 28 Date d'inscription dimanche 21 septembre 2008 Statut Membre Dernière intervention 19 juin 2015 - 19 juin 2015 à 16:20
A voir également:
- Erreur macro sur fonction "If Not Intersect..."
- Input not supported - Forum Ecran
- Input signal not found ✓ - Forum Matériel & Système
- Vba if not ✓ - Forum Excel
- The language dll vb6fr.dll could not be found - Forum Windows
- Could not connect to server - Forum TV & Vidéo
4 réponses
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
Modifié par Éternité... le 19/06/2015 à 08:28
Modifié par Éternité... le 19/06/2015 à 08:28
J'ai réussi à résoudre le problème grâce à la suggestion de eriiic vis-à-vis du s.Type.
Code modifié :
Par contre ça ne m'efface que les image insérées par un "copier une zone de cellule" et "coller en tant qu'image".
Or dans cette zone, j'ai également la possibilité d'insérer des images externe via le code qui suit :
Avec la modification du code précédent, les images insérées via le bouton "Public Sub insere_image()" ne se supprimer pas lors du nettoyage.
Je vais continuer à creuser, si d'ici mon prochain post quelqu'un a une suggestion, je suis bien entendu preneur =)
Code modifié :
Sub Effacer_forme_zone_dessin()
ActiveSheet.Unprotect "moncode"
For Each s In ActiveSheet.Shapes
If s.Type = msoPicture Or s.Type = msoLinkedPicture Then
If Not Intersect(s.TopLeftCell, Range("$B$31:$Z$47")) Is Nothing Then
s.Delete
End If
End If
Next s
ActiveSheet.Protect "moncode"
End Sub
Par contre ça ne m'efface que les image insérées par un "copier une zone de cellule" et "coller en tant qu'image".
Or dans cette zone, j'ai également la possibilité d'insérer des images externe via le code qui suit :
Public Sub insere_image()
Dim ficimg As Variant
ActiveSheet.Unprotect "moncode"
On Error Resume Next
ficimg = Application.GetOpenFilename(".jpg,*.jpg", , "Choisissez l'image")
ActiveSheet.Pictures.Insert(ficimg).Select ' insertion
With Selection
.Locked = False
.PrintObject = True
.Placement = xlMoveAndSize
End With
ActiveSheet.Protect "moncode"
End Sub
Avec la modification du code précédent, les images insérées via le bouton "Public Sub insere_image()" ne se supprimer pas lors du nettoyage.
Je vais continuer à creuser, si d'ici mon prochain post quelqu'un a une suggestion, je suis bien entendu preneur =)
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 428
18 juin 2015 à 22:09
18 juin 2015 à 22:09
Bonjour
Déposes ton fichier sur cjoint.com et joins le lien obtenu à ton prochain message
Cdlmnt
Déposes ton fichier sur cjoint.com et joins le lien obtenu à ton prochain message
Cdlmnt
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
18 juin 2015 à 23:19
18 juin 2015 à 23:19
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
19 juin 2015 à 00:51
19 juin 2015 à 00:51
Bonjour,
J'ai réussi à le faire planter une seule fois, il ne plante plus bien que je n'ai pas sauvegardé après (?)
J'ai eu le temps de voir que c'était un objet nommé "Drop Down 171" qui l'embêtait.
Peut-être pas de propriété TopLeftCell, ce qui serait étonnant, ou un objet fantôme (re ?) avec un nettoyage incomplet.
Tu pourrais te servir de s.type pour ne traiter que des objet du type attendu dans cette plage (en espérant qu'il soit ailleurs), ou du début de s.name selon ce qui est le plus pratique pour toi.
Ou bien traiter l'erreur puisque bizarrement cet objet a l'air de disparaitre tout seul
Si ça peut t'aider à avancer...
eric
J'ai réussi à le faire planter une seule fois, il ne plante plus bien que je n'ai pas sauvegardé après (?)
J'ai eu le temps de voir que c'était un objet nommé "Drop Down 171" qui l'embêtait.
Peut-être pas de propriété TopLeftCell, ce qui serait étonnant, ou un objet fantôme (re ?) avec un nettoyage incomplet.
Tu pourrais te servir de s.type pour ne traiter que des objet du type attendu dans cette plage (en espérant qu'il soit ailleurs), ou du début de s.name selon ce qui est le plus pratique pour toi.
Ou bien traiter l'erreur puisque bizarrement cet objet a l'air de disparaitre tout seul
Si ça peut t'aider à avancer...
eric
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
19 juin 2015 à 08:03
19 juin 2015 à 08:03
Bonjour,
Chez moi la macro ne plante pas à l'ouverture, c'est dès qu'il y a modification de la cellule H19 qu'ensuite la macro "Nettoyer zone de dessin" ne veut plus fonctionner.
Je ne connais pas la fonction s.type ni s.name, je vais aller chercher un peu sur les forum pour voir ce que je peux y dénicher, je reviens ici ensuite pour dire ce que ça donne.
Si tu as des suggestions plus précises à me donner par rapport au fichier, je suis bien sur preneur.
Chez moi la macro ne plante pas à l'ouverture, c'est dès qu'il y a modification de la cellule H19 qu'ensuite la macro "Nettoyer zone de dessin" ne veut plus fonctionner.
Je ne connais pas la fonction s.type ni s.name, je vais aller chercher un peu sur les forum pour voir ce que je peux y dénicher, je reviens ici ensuite pour dire ce que ça donne.
Si tu as des suggestions plus précises à me donner par rapport au fichier, je suis bien sur preneur.
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
19 juin 2015 à 12:05
19 juin 2015 à 12:05
Bonjour,
Il n'y a pas vraiment de .Refresh ou .Repaint pour les feuilles, c'est sensé être toujours bon ;-)
Tente avec :
ActiveWindow.SmallScroll Down:=1
ActiveWindow.SmallScroll Down:=-1
ou des trucs comme ça.
Rien à voir mais pour ton Module3 tu peux peut-être remplacer tes 20000 lignes de codes par qq chose comme :
Je cherche ton nombre sur la feuille (il faut qu'il soit unique). Comme il est dans une cellule fusionnée (presque) à la bonne largeur j'agrandi la sélection décalée et retaillée d'une ligne tant qu'il y a une bordure à gauche.
Pas tout testé tes 225 schémas bien sûr...
Un problème détecté quand même pour tes fenêtres. Ca passe si tu prolonges le trait à gauche avec des pointillés par exemple jusqu'à la vue de dessus qui doit être sélectionnée avec.
Si tes tests confirment que c'est ok tu pourras ajouter des shémas, les déplacer etc sans retoucher au code.
A voir...
eric
Il n'y a pas vraiment de .Refresh ou .Repaint pour les feuilles, c'est sensé être toujours bon ;-)
Tente avec :
ActiveWindow.SmallScroll Down:=1
ActiveWindow.SmallScroll Down:=-1
ou des trucs comme ça.
Rien à voir mais pour ton Module3 tu peux peut-être remplacer tes 20000 lignes de codes par qq chose comme :
Sub Inserer_schema_F1() Dim v As Long, pl As Range, c As Range, lig As Long, fini As Boolean, a ' v = CLng([Y48]) v = 217 ' pour tests If v <= Application.Max(Cells) Then ActiveSheet.Unprotect "moncode" Sheets("Schémas").Activate Set pl = Cells.Find(v, LookIn:=xlFormulas, Lookat:=xlWhole) Set pl = pl.MergeArea Set pl = pl.Offset(1, -1).Resize(, pl.Columns.Count + 2) Set c = pl.Range("A1") Do Set c = c.Offset(1) If c.Borders(xlEdgeRight).LineStyle = xlNone Then Set pl = pl.Resize(pl.Rows.Count + 1) Exit Do Else Set pl = pl.Resize(pl.Rows.Count + 1) End If Loop pl.Select ' pour tests Stop ' pour tests pl.Copy Sheets("Fiche minute 1").Activate Range("B32").Select ActiveSheet.Pictures.Paste ActiveSheet.Protect "moncode" End If End Sub
Je cherche ton nombre sur la feuille (il faut qu'il soit unique). Comme il est dans une cellule fusionnée (presque) à la bonne largeur j'agrandi la sélection décalée et retaillée d'une ligne tant qu'il y a une bordure à gauche.
Pas tout testé tes 225 schémas bien sûr...
Un problème détecté quand même pour tes fenêtres. Ca passe si tu prolonges le trait à gauche avec des pointillés par exemple jusqu'à la vue de dessus qui doit être sélectionnée avec.
Si tes tests confirment que c'est ok tu pourras ajouter des shémas, les déplacer etc sans retoucher au code.
A voir...
eric
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
19 juin 2015 à 13:51
19 juin 2015 à 13:51
eriiic,
J'ai testé la fonction :
ActiveWindow.SmallScroll Down:=1
ActiveWindow.SmallScroll Down:=-1
mais sans succès.
Pas grave, c'est moindre mal, soucis pas très gênant au final.
Ce que tu me propose pour épurer lourdement mon Module3 m'intéresse fortement, cependant mes connaissances en Macro sont trop limitées pour comprendre comment comment elle fonctionne.
Si tu as le temps, je veux bien que tu m'explique étape par étape la procédure qui est appliquée.
Merci
(je passe le sujet en "Résolu" car la question de base a été traité, avec efficacité et brio)
J'ai testé la fonction :
ActiveWindow.SmallScroll Down:=1
ActiveWindow.SmallScroll Down:=-1
mais sans succès.
Pas grave, c'est moindre mal, soucis pas très gênant au final.
Ce que tu me propose pour épurer lourdement mon Module3 m'intéresse fortement, cependant mes connaissances en Macro sont trop limitées pour comprendre comment comment elle fonctionne.
Si tu as le temps, je veux bien que tu m'explique étape par étape la procédure qui est appliquée.
Merci
(je passe le sujet en "Résolu" car la question de base a été traité, avec efficacité et brio)
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
19 juin 2015 à 14:29
19 juin 2015 à 14:29
Le but est de retrouver la plage du schéma à copier à partir de son n°.
N'oublie pas d'ajouter un pointillé vertical aux fenêtres pour combler le trou (bordure gauche de D518:D519 pour la 1ère) sinon tu n'auras que la partie haute de ton schéma.
Le code commenté, avec qq contrôle de sécurité ajoutés :
Tu remplaces tes 3 procédures du module3 par ce code et tu testes. Juste le nom d'appel de la macro (unique) à changer dans ton code.
Si soucis déposer un nouveau fichier avec les manip à faire pour reproduire le pb. Je ne sais pas comment fonctionne ton fichier, ce qu'il fait, ni comment l'utiliser.
Garde ton original. Aucune idée de si ça conviendra totalement et si les anomalies seront corrigeables.
eric
N'oublie pas d'ajouter un pointillé vertical aux fenêtres pour combler le trou (bordure gauche de D518:D519 pour la 1ère) sinon tu n'auras que la partie haute de ton schéma.
Le code commenté, avec qq contrôle de sécurité ajoutés :
Sub Inserer_schema_F1()
Dim v As Long, pl As Range, c As Range, lig As Long, fini As Boolean, a
v = CLng([Y48])
If v <= Application.Max(Sheets("Schémas").Cells) Then
' si le nombre est inférieur au maxi trouvé sur feuille Schémas
ActiveSheet.Unprotect "moncode"
Sheets("Schémas").Activate
' chercher n° schéma sur la feuille
Set pl = Cells.Find(v, LookIn:=xlFormulas, Lookat:=xlWhole)
If pl Is Nothing Then
MsgBox "n° schéma non trouvé"
Else
' n° schéma trouvé
Set pl = pl.MergeArea 'sélectionner la plage de fusion du n° schéma
Set pl = pl.Offset(1, -1).Resize(, pl.Columns.Count + 2) ' la décaler et l'élagir de 2 col
Set c = pl.Range("A1") ' 1ère cell de gauche
Do
Set c = c.Offset(1) ' décaler cell d'une ligne vers le bas
If c.Borders(xlEdgeRight).LineStyle = xlNone Then
' pas de bordure, ajout d'une dernière ligne à la plage puis fin
Set pl = pl.Resize(pl.Rows.Count + 1)
Exit Do
Else
' présence bordure, ajout d'une ligne à la plage
Set pl = pl.Resize(pl.Rows.Count + 1)
End If
Loop
' ici pl = range de la plage du shéma
pl.Select ' pour tests, à supprimer
MsgBox pl.Address ' pour tests, à supprimer
pl.Copy ' copier la plage détectée
' suite avec ton code original (non testé)
Sheets("Fiche minute 1").Activate
Range("B32").Select
ActiveSheet.Pictures.Paste
ActiveSheet.Protect "moncode"
End If
End If
End Sub
Tu remplaces tes 3 procédures du module3 par ce code et tu testes. Juste le nom d'appel de la macro (unique) à changer dans ton code.
Si soucis déposer un nouveau fichier avec les manip à faire pour reproduire le pb. Je ne sais pas comment fonctionne ton fichier, ce qu'il fait, ni comment l'utiliser.
Garde ton original. Aucune idée de si ça conviendra totalement et si les anomalies seront corrigeables.
eric
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
19 juin 2015 à 15:14
19 juin 2015 à 15:14
Super ton explication, merci beaucoup.
Ca semble marcher du tonnerre (pas encore testé pour tous les schémas mais efficace sur ceux testé, y compris sur ceux où j'ai du rajouter une bordure).
Un petit soucis par contre, lorsque je nettoie ma feuille (avec la fameuse macro sur laquelle portait mon sujet à la base), étant donné que la cellule Y48 se retrouvé vidée, je suis renvoyé automatiquement à la feuille "Schémas" (pareil si je supprime manuellement le contenu de la cellule Y48. Sauf que du coup, ma "Fiche minute 1" s'en retrouve déprotégé. Pas cool cette faille :/
Surement une petite condition à rajouter dans le code que tu m'as proposé, mais je ne sais ni où ni quel code rajouter.
L'idéal serait que lorsque je supprime manuellement le contenu de la cellule Y48, ou bien lorsque celle ci est vidé automatiquement lorsque la macro qui nettoie la zone de dessin est activé, le dessin soit simplement supprimé et que je reste sur la feuille active (Fiche minute 1 donc)...et tout ceci bien sur en laissant la feuille protégé ^^
Comptant une fois de plus sur tes lumières =)
Ca semble marcher du tonnerre (pas encore testé pour tous les schémas mais efficace sur ceux testé, y compris sur ceux où j'ai du rajouter une bordure).
Un petit soucis par contre, lorsque je nettoie ma feuille (avec la fameuse macro sur laquelle portait mon sujet à la base), étant donné que la cellule Y48 se retrouvé vidée, je suis renvoyé automatiquement à la feuille "Schémas" (pareil si je supprime manuellement le contenu de la cellule Y48. Sauf que du coup, ma "Fiche minute 1" s'en retrouve déprotégé. Pas cool cette faille :/
Surement une petite condition à rajouter dans le code que tu m'as proposé, mais je ne sais ni où ni quel code rajouter.
L'idéal serait que lorsque je supprime manuellement le contenu de la cellule Y48, ou bien lorsque celle ci est vidé automatiquement lorsque la macro qui nettoie la zone de dessin est activé, le dessin soit simplement supprimé et que je reste sur la feuille active (Fiche minute 1 donc)...et tout ceci bien sur en laissant la feuille protégé ^^
Comptant une fois de plus sur tes lumières =)
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
19 juin 2015 à 15:44
19 juin 2015 à 15:44
Mon code n'a rien à voir, ça devait déjà te le faire avant.
Regarde les conditions d'appel après
Teste Y48 et n'appelle la macro que si Y48 n'est pas vide et contient bien un numérique
Regarde les conditions d'appel après
If Not Application.Intersect(Target, Range("Y48")) Is Nothing Then
Teste Y48 et n'appelle la macro que si Y48 n'est pas vide et contient bien un numérique
Éternité...
Messages postés
28
Date d'inscription
dimanche 21 septembre 2008
Statut
Membre
Dernière intervention
19 juin 2015
2
19 juin 2015 à 16:02
19 juin 2015 à 16:02
La seule condition d'appel après ce code est
Call Inserer_schema_F1:/. Je ne pense donc pas que le problème vienne de là étant donné qu'il renvoi directement à ton code
19 juin 2015 à 08:35
(13 car l'objet est une image)
J'en profite pour poser une dernière question sur cette feuille, y a-t-il moyen de faire une actualisation de la visualisation de la feuille une fois le nettoyage fait. En effet les images sont bien supprimées, mais elles apparaissent encore à l'écran (suffit que je fasse défiler la feuille, que je change d'onglet ou que j'insère une nouvelle image pour qu'elle disparaisse).
Une proposition ? =)