Problème lors de la fermeture du classeur [Résolu]

mpStoox - 13 déc. 2013 à 15:10 - Dernière réponse :  mpStoox
- 16 déc. 2013 à 13:03
Bonjour à tous,

J'ai un problème dans le code VBS ci-dessous.
Il fonctionne très bien jusqu'à se qui se sauvegarde et se ferme !
Il m'affiche "L'indice n'appartient pas à la sélection".
Sachant que lorsque je répond "OK" à cette fenetre, le classeur se ferme et s'enregistre très bien...

Merci pour votre aide..!

Mon code :

Const xlValues = -4163
Const xlNone = -4142

Dim xlApp,xlBook,xlSheetData,xlSheetNew,k

Path="P:\monfichier.xls"

Set xlApp= CreateObject("Excel.Application")
xlApp.Visible=True

Set xlBook= xlApp.Workbooks.Open(Path)

xlBook.Worksheets.Add.Name = "Coucou"

Set xlSheetData= xlBook.WorkSheets("Hello")

Set xlSheetNew= xlBook.WorkSheets("Coucou")

'-------------

'Copier les données:
DerLigne = xlSheetData.UsedRange.Rows.Count
xlSheetData.Rows("2:" & DerLigne).Copy

'Coller les données:
xlSheetNew.Rows("1").PasteSpecial xlValues, xlNone, False, False

'Supprimer l'ancienne feuille:
xlApp.DisplayAlerts = False
xlSheetData.Delete
xlApp.DisplayAlerts = True

'-------------

'Quitter et sauvegarder:
xlBook.Close True
xlApp.Quit

'-------------

'Liberer mémoire:
Set xlSheetData = Nothing
Set xlSheetNew =Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Afficher la suite 

Votre réponse

27 réponses

jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 13 déc. 2013 à 15:26
0
Merci
ça ne serait pas au moment de libérer la mémoire..


'Liberer mémoire:
Set xlSheetData = Nothing
Set xlSheetNew =Nothing
Set xlBook = Nothing
Set xlApp = Nothing

Commenter la réponse de jordane45
0
Merci
Négatif...

C'est vraiment à la fermeture apparament. Lorsque j'arrete le code après la suppression de la feuille et que je ferme manuellement, le classeur il m'affiche la même fenêtre.
Commenter la réponse de mpStoox
jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 13 déc. 2013 à 15:39
0
Merci
Tu as essayé ceci :

xlBook.Saved = True
xlBook.Close


Commenter la réponse de jordane45
jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 13 déc. 2013 à 16:12
0
Merci
Ton code fonctionne parfaitement chez moi.

Tu as bien créé le fichier P:\monfichier.xls ?
Ce fichier comporte bien une feuille nommée : Hello ?


Sinon, en ajoutant des MsqgBox à chaque étape;.cela te permettrait de déterminer à quel endroit ça bloque...

Const xlValues = -4163 
Const xlNone = -4142 

Dim xlApp,xlBook,xlSheetData,xlSheetNew,k 

Path="C:\tmp\monfichier.xls" 
msgbox Path
Set xlApp= CreateObject("Excel.Application") 
xlApp.Visible=True 

Msgbox "Ouverture du classeur"
Set xlBook= xlApp.Workbooks.Open(Path) 

Msgbox " Ajout d'une feuille"
xlBook.Worksheets.Add.Name = "Coucou" 

Set xlSheetData= xlBook.WorkSheets("Hello") 

Set xlSheetNew= xlBook.WorkSheets("Coucou") 

'------------- 

Msgbox "Copier les données" 
DerLigne = xlSheetData.UsedRange.Rows.Count 
xlSheetData.Rows("2:" & DerLigne).Copy 

Msgbox "Coller les données: "
xlSheetNew.Rows("1").PasteSpecial xlValues, xlNone, False, False 

MsgBox "Supprimer l'ancienne feuille" 
xlApp.DisplayAlerts = False 
xlSheetData.Delete 
xlApp.DisplayAlerts = True 

'------------- 

Msgbox "Quitter et sauvegarder"
xlBook.Close True 
xlApp.Quit 

'------------- 

'Liberer mémoire: 
Set xlSheetData = Nothing 
Set xlSheetNew =Nothing 
Set xlBook = Nothing 
Set xlApp = Nothing

Le fichier et la feuille existe bien !

Les MsgBox ont confirmées que c'est bien au moment de fermer qu'il bloque..!! (il peut s'enregistrer mais veut pas se fermer)
jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 13 déc. 2013 à 18:02
Tu n'as pas d'autres Excel d'ouverts ?
Commenter la réponse de jordane45
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 13 déc. 2013 à 18:20
0
Merci
Bonjour,

Comme Jordane45, le code proposé fonctionne sous XP avec Excel 2003.

Il est inutile d'instancié les feuilles.

Exemple:

Set xlBook = xlApp.Workbooks.Open(Path)
xlBook.Worksheets.Add.Name = "Coucou"
'-------------
'Copier les données:
DerLigne = xlBook.Sheets("Hello").UsedRange.Rows.Count
xlBook.Sheets("Hello").Rows("2:" & DerLigne).Copy

'Coller les données:
xlBook.Sheets("Coucou").Rows("1").PasteSpecial xlValues, xlNone, False, False

'Supprimer l'ancienne feuille
xlApp.DisplayAlerts = False
xlBook.Sheets("Hello").Delete
xlBook.Close True
xlApp.DisplayAlerts = True
xlApp.Quit
'-------------
'Liberer mémoire:
Set xlBook = Nothing
Set xlApp = Nothing
--
jean-marc
Commenter la réponse de cs_JMO
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 13 déc. 2013 à 19:01
0
Merci
Bonjour, je vois beaucoup de choses inutiles, d'autres incomplètes et des lourdeurs dans ce code, mais il devrait en effet quand-même fonctionner, pour autant qu'existe bien une feuille nommée Hello dans monfichier.xls au moment de son ouverture

Commenter la réponse de ucfoutu
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 13 déc. 2013 à 19:30
0
Merci
Il nous faut par ailleurs espérer que tu n'as par ailleurs pas mis une instruction de suppression de la feuille Hello dans, par exemple, l'évènement Workbook_BeforeClose du classeur P:\monfichier.xls
Ce serait alors pour le moins assez cocasse, mais sait-on jamais ...
Commenter la réponse de ucfoutu
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 13/12/2013 à 21:41
0
Merci
Pourquoi ai-je enfin l'impression de ce que tout ce code serait finalement et bêtement remplaçable par ces quelques lignes :
 Dim toto As Workbook
Set toto = Workbooks.Open("P:\monfichier.xls")
With toto
With .Worksheets("hello")
.UsedRange.Copy
.Range("A1").PasteSpecial xlValues, xlNone, False, False
.Rows(1).Delete
.Name = "coucou"
End With
.Close True
End With
Il faut par ailleurs qu'il soit bien clair qu'il ne fonctionnerait (comme le tien, d'ailleurs) qu'une seule fois, puisque, dès la seconde, la feuille "Hello" n'existe déjà plus.
Et (bien entendu) : ne pas se "mélanger les pinceaux (me relire) éventuellement avec l'évènement BeforeClose.
________________________
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'interviend
Commenter la réponse de ucfoutu
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 14 déc. 2013 à 08:28
0
Merci
Plus je me réveille, plus je pense que l'un des évènements de ton classeur P:\monfichier.xls exécxute une instruction faisant référence à la feuille nommée Hello (que tu viens de supprimer !)
Si ce classeur contient des formules, examine-les aussi, pour le cas où elles contiendraient une référence à la feuille "Hello"
Reviens-nous en parler après examen. On te proposera alors deux petits rajouts "libératoires".
Commenter la réponse de ucfoutu
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 14 déc. 2013 à 09:15
0
Merci
Bonjour

Reprenant le script de ucfoutu (que je salue).
With CreateObject("Excel.Application").Workbooks.Open("P:\monfichier.xls")
With .Worksheets("Hello")
.UsedRange.Copy
.Range("A1").PasteSpecial -4163, -4142, False, False
.Rows(1).Delete
.Name = "Coucou"
.Range("A1").Select
End With
.Close True
End With
--
jean-marc
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 14 déc. 2013 à 09:44
Bonjour, cs_JMO
Regarde ce qu'affiche
msgbox xlvalues & vbcrlf & xlnone
xlvalues et xlnone sont des constantes VBA déjà existantes dans VBA
Il vaut mieux les utiliser par leur nom. Pourquoi ? Juste pour le cas où, dans une version ultérieure, Microsoft décidait un jour de leur affecter une autre valeur. Ces deux-là seraient toujours bonnes.
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 14 déc. 2013 à 09:57
Bonjour Jacques,
La question est posée dans le thème vbs et non vba.

jean-marc
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 14 déc. 2013 à 18:33
Ah oui, Jean-Marc. Pas vu qu'il pilotait en fait Excel depuis VBS.
Commenter la réponse de cs_JMO
0
Merci
Bonjour à tous (dsl de mon absence pendant le weekend)

J'ai peut-être oublié de vous dire pourquoi j'effectue ce traitement :
Dans la feuille "Hello" il y a des macros sur la ligne 1 et j'ai besoin de nettoyer la feuille pour l'importer dans Access par la suite.
(Je n'arrive pas à supprimer cette ligne, j'ai seulemnt trouvé le moyen en supprimant la feuille complète)
jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 16 déc. 2013 à 10:20
Et .. ??;.. quoi comme macros.. elles font quoi ??
Est-ce qu'il y en aurait pas une qui se déclencherait lors de la fermeture de classeur ??
Donc apparament, se sont les macros à l'intérieur qui pose problème... Quand j'essai de rentrer dans le développeur il me met le message "l'indice n'appartient pas à la sélection".
Par contre le VBA est protégé par un code...
jordane45
Messages postés
23209
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
14 novembre 2018
- 16 déc. 2013 à 10:25
Et tu n'as pas ce password ? ce n'est pas un fichier à toi ?
Enfin sinon.. oui... il y a des chances que ce soit les macros dans ThisWorkbook qui posent problème......
Le plus simple finalement, serait de dupliquer la feuille voulue dans un nouveau classeur.
Non, le fichier n'est pas à moi. C'est une extract que je récupère...
Commenter la réponse de mpStoox
0
Merci
Ca venait bien des macros dans le fichier qui m'embêtaient pour fermer...
Je colle dans un autre fichier à présent et ca fonctionne bien !
Dernière question :

Quelle est la ligne de code pour vider le presse papier ?!

Merci !
C'est good ! J'ai trouvé : xlApp.CutCopyMode=False

Merci à tous pour m'avoir éclairé !
Commenter la réponse de mpStoox

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.