2013-05-02 5 views
1

Je souhaite copier une feuille de calcul et la placer DIRECTEMENT après une autre feuille. Mais j'ai des problèmes quand il y a des feuilles cachées. En utilisant Excel 2013, j'ouvre un nouveau classeur. Ajouter une feuille après "Feuille1". Renommez-le "HiddenSheet2" Ajouter une feuille après "HiddenSheet2". Renommer nouvelle feuille "Feuil3" j'ai donc "Sheet1" - "HiddenSheet1" - "Feuil3" cachent ensuite "HiddenSheet1"Excel VBA WorkSheet.Copy Après Excel 2013

Suivant exécuter ce code VBA:

Sub test() 
Dim ws1 AS Worksheet 
Set wst = Sheets("Sheet1") 
wst.Copy After:=Sheets(wst.Index) 
End Sub 

La feuille insérée obtenir placé après "HiddenSheet2" et non après "Sheet1". J'ai trouvé que la feuille copiée devient la feuille active.

Get Handle on last worksheet copied by Worksheet.Copy

VBA Copy Sheet to End of Workbook (with Hidden Worksheets)

Mais mon problème est que je dois la feuille de rester dans un ordre précis.

Merci

Edit:

Sub test() 
Dim ws1 AS Worksheet 
Set wst = Sheets("Sheet1") 
wst.Copy After:=Sheets(wst.Index) 
ThisWorkbook.ActiveSheet.Move After:=Sheets(wst.Index) 
End Sub 

Cela ne reçoit pas la nouvelle feuille directement après "Sheet1" non plus.

+3

Pourquoi ne pas utiliser 'wst.copy après: = wst'? – glh

+0

Ce que dit @glh. Vous avez déjà 'wst' comme variable de feuille de calcul. Utilisez simplement cela pour l'argument 'After' :) –

+0

' wst.copy après: = wst' et 'wst.copy après: = Sheets (" Sheet1 ")' produit les mêmes résultats. Ma nouvelle feuille se place après la feuille cachée et pas directement après "Sheet1" – Jonathan

Répondre

3

Code existant peut être ajouté

Sub test() 
Dim ws1 AS Worksheet 
Set wst = Sheets("Sheet1") 
wst.Copy After:=Sheets(wst.Index) 
ThisWorkbook.ActiveSheet.Move After:=Sheets(wst.Index) 
If (ActiveSheet.Index - wst.Index - 1) <> 0 Then 
     Sheets(wst.Index + 1).Visible = True 
     ActiveSheet.Move After:=wst 
     Sheets(wst.Index + 2).Visible = False 
    End If 
End Sub 
+0

Merci cela a fait l'affaire. Je pensais que je pourrais finir par faire un demi-hack. Mais je voulais juste m'assurer que je n'étais pas folle. je peux le un peu: 'Si (ActiveSheet.Index - wst.Index - 1) <> 0 Then Dim bVisible As Boolean bVisible = Sheets (wst.Index + 1) .Visible Sheets (WST. Index + 1) .Visible = Vrai ActiveSheet.Déplacez après: = wst Feuilles (wst.Index + 2) .Visible = bVisible End If 0'' Est probablement sûr de dire leur une feuille cachée car c'est la seule fois que c'est un problème, mais je vais enregistrer la visibilité juste en cas Excel me lance pour une autre boucle. – Jonathan

+0

Vous ne savez pas pourquoi le code n'a pas été formaté correctement ... – Jonathan

+0

+1 bon. Je ne savais pas à propos de ce * problème * avec des feuilles cachées. – glh

0

La propriété d'index est zéro base, sauf spécification contraire. La propriété de Sheets est base d'un. Vous devez soit:

  1. Ajouter 1 à l'index, non préféré.
  2. Référencez la propriété .name, mieux.
  3. Référencez la variable de feuille que vous avez I.e. Wst.copy après: = wst, mieux.
  4. Ou déplacez la feuille masquée après la nouvelle.
+1

Merci j'éviterai d'utiliser des index quand je le peux bien que ce n'était pas le problème dans ce cas. – Jonathan