Problème lors de la fermeture du classeur

Résolu
mpStoox - 13 déc. 2013 à 15:10
 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

12 réponses

jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
13 déc. 2013 à 15:26
ç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

0
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.
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
13 déc. 2013 à 15:39
Tu as essayé ceci :

xlBook.Saved = True
xlBook.Close


0
Marche pas...
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
13 déc. 2013 à 16:12
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

0
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)
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
13 déc. 2013 à 18:02
Tu n'as pas d'autres Excel d'ouverts ?
0

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

Posez votre question
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
13 déc. 2013 à 18:20
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
13 déc. 2013 à 19:01
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

0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
13 déc. 2013 à 19:30
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 ...
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Modifié par ucfoutu le 13/12/2013 à 21:41
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
14 déc. 2013 à 08:28
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".
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
14 déc. 2013 à 09:15
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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Modifié par ucfoutu le 14/12/2013 à 09:45
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.
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
14 déc. 2013 à 09:57
Bonjour Jacques,
La question est posée dans le thème vbs et non vba.

jean-marc
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
14 déc. 2013 à 18:33
Ah oui, Jean-Marc. Pas vu qu'il pilotait en fait Excel depuis VBS.
0
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)
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
16 déc. 2013 à 10:00
Bonjour,

Dans la feuille "Hello" il y a des macros sur la ligne 1

Peux-tu expliquer ? Des macros sur une ligne ? ( tu veux dire qu'une macro fait quelque chose lorsque l'on change la ligne 1 ? )

Peux-tu nous dire si tu as des macros dans ThisWorkbook ?
Si oui... que font-elles ?
0
Sur la ligne 1, il y un formulaire ou l'on coche et déchoche des informations, l'affichage de colonnes change en fonction
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
16 déc. 2013 à 10:15
ok, et pour la parti .. THISWORKBOOK ?
0
Oui il y a des macros dedans
0
jordane45
Messages postés
35469
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2022
356
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 ??
0
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 !
0
C'est good ! J'ai trouvé : xlApp.CutCopyMode=False

Merci à tous pour m'avoir éclairé !
0