2015-10-13 5 views
1

Je suis un tout nouveau programmeur autodidacte, alors gardez cela à l'esprit dans vos réponses. J'ai beaucoup cherché ceci et d'autres forum et ne peux pas sembler trouver une question semblable.VBA: Coller cesse de travailler (soudainement) dans une macro spécifique

Le code suivant a fonctionné pendant des semaines et n'a pas été modifié. (Ma macro inclut plus de variables et de code, mais je sais que je les démonte pour que ces pièces fonctionnent, donc je les ai laissées pour plus de clarté). De ce que je peux dire la fonction PasteSpecial est spécifiquement ne fonctionne pas.

Dim StimSheet As String 

ActiveCell.Rows("1:290").EntireRow.Select 
Selection.Copy 
'Copies the data for the current stimulus 
StimSheet = Application.InputBox("Enter the name of the stimulus") 
'asks name of the stimulus 

Sheets.Add After:=Worksheets(Worksheets.Count) 
ActiveSheet.Name = StimSheet 
'adds new sheet at the end and names whatever you input as stimulus name 

Sheets(StimSheet).Select 
Selection.PasteSpecial Paste:=xlPasteValues 
'pastes data into new sheet 

À ce stade, il n'y a pas d'erreur, la macro s'arrête simplement après la copie et la création de la nouvelle feuille.

Voici ce que je sais/ont essayé:

  1. La macro fait et nommer avec succès la nouvelle feuille et la copie la sélection dans le presse-papiers, parce que je peux coller manuellement après l'exécution de la macro. Il semble être coincé à la pièce de pâte.

  2. D'autres macros qui utilisent exactement le même format de copier/coller spécial fonctionnent toujours correctement.

  3. Un autre forum avec un programme similaire a suggéré de taper "Application.EnableEvents = True" dans la fenêtre immédiate. Cela n'a rien changé.

  4. Cette macro a fonctionné pendant plusieurs semaines sans erreur. J'ai fait de nouvelles macros en utilisant du code précédemment sauvegardé au cas où quelque chose aurait été modifié par inadvertance dans le courant, mais cela n'a pas fonctionné non plus.

  5. L'option de collage fonctionnera une fois sur un nouveau fichier, puis cessera de fonctionner à nouveau.

Merci d'avance pour vos suggestions.

+0

-t-il travailler sur un autre poste de travail? – MatthewD

+0

Malheureusement, je n'ai pas accès immédiatement à un autre poste de travail, mais je suis passé à un collègue à un autre endroit pour essayer. Je mettrai à jour avec cette information quand j'entendrai en arrière. – katunruh

+0

@MatthewD Je travaille sur un Mac en utilisant Office 2011; envoyé à un collègue en utilisant un Mac avec Office 2011 et le code fonctionne, donc doit être spécifique à mon poste de travail. J'ai depuis essayé d'écrire du nouveau code et de l'essayer sur un ensemble de fichiers différent et j'ai toujours ce problème. J'ai redémarré mon ordinateur, etc. – katunruh

Répondre

1

Vous pourriez trouver que le problème est que vous n'avez pas beaucoup de contrôle sur le classeur et la feuille de calcul auxquels ce code s'applique. Il est préférable d'éviter ActiveSheet, Select, et Sheet sans parent autant que vous le pouvez.

Si vous avez seulement besoin de copier les valeurs des cellules sans aucun formatage, alors Paste n'est pas nécessaire non plus.

Essayez de changer votre code à la suivante et voir si vous avez plus de chance:

Const BOOK_NAME As String = "Book1.xlsm" 'change this to your workbook name 
Const SOURCE_SHEET_NAME As String = "Sheet1" 'change this to your sheet name 
Dim wb As Workbook 
Dim sourceSheet As Worksheet 
Dim newSheet As Worksheet 
Dim newSheetName As String 
Dim validName As Boolean 
Dim rng As Range 

' Set the book, sheet and range objects 
Set wb = Workbooks(BOOK_NAME) 
Set sourceSheet = wb.Worksheets(SOURCE_SHEET_NAME) 
Set newSheet = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count)) 

' Acquire the new sheet name and check it's valid. 
Do 
    newSheetName = InputBox("Enter the name of the stimulus") 
    On Error Resume Next 
    newSheet.Name = newSheetName 
    validName = (Err.Number = 0) 
    On Error GoTo 0 
    If Not validName Then MsgBox "Sheet name isn't valid. Try again." 
Loop Until validName 

' Write the values into the new sheet 
Set rng = sourceSheet.Cells(1, 1).Resize(290, sourceSheet.UsedRange.Columns.Count) 
newSheet.Range(rng.Address).value = rng.Value2 
+0

Travaillez-vous sur deux classeurs différents par hasard et la feuille source a un nom générique comme "Sheet1"? Cela expliquerait cela et vos erreurs 1004. – Ambie

+0

Je viens de supprimer mon commentaire précédent, car cela fonctionne maintenant - doit avoir été une erreur de ma part lorsque j'ai inséré votre code. Cela fonctionne bien maintenant. Je vous remercie beaucoup pour votre aide! – katunruh

0

je me suis déplacé cette ligne:

StimSheet = Application.InputBox("Enter the name of the stimulus") 

au sommet de la méthode et il semble fonctionner de manière fiable. Je voudrais pouvoir vous dire exactement pourquoi, mais au moins vous pouvez continuer. Peut-être que cela a quelque chose à voir avec le changement d'orientation.

Aussi, quand il a échoué pour moi (Office 2013) J'obtenu l'erreur suivante:

Erreur d'exécution 1004: application défini ou un objet défini erreur.

Lorsque le sous-marin était dans un code de feuille derrière, et ceci:

Erreur d'exécution '1004' méthode PasteSpecial de classe Range a échoué.

Collé dans un module.

+0

Merci @Chaz. J'étais sur le point de poster une mise à jour disant que j'avais essayé de réécrire/utiliser un document différent et que tout fonctionnait jusqu'à ce que j'ajoute cette ligne. Je vais essayer de déplacer cela et de vérifier les mises à jour d'Excel qui pourraient avoir été installé. – katunruh

+0

"Peut-être que cela a quelque chose à voir avec le changement de focus". Oui. @katunruh, s'il vous plaît voir ma réponse car votre code est dangereux. Si vous avez plusieurs applications ouvertes, plus d'un classeur ouvert ou un commutateur de feuilles alors votre code jettera toujours une erreur 1004. – Ambie