2013-05-02 4 views
1

Я хочу скопировать рабочий лист и поместить его прямо после другого листа. Но у меня проблемы, когда есть скрытые листы.Excel VBA WorkSheet.Copy После Excel 2013

Используя Excel 2013, я открываю новую книгу. Добавить лист после "Sheet1". Переименуйте его «HiddenSheet2» Добавьте лист после «HiddenSheet2». Переименуйте лист «Лист3» Так что у меня «Лист1» - «HiddenSheet1» - «Sheet3» Тогда скрыть «HiddenSheet1»

Следующая запустить этот VBA код:

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

Введенный лист получить помещен после «HiddenSheet2», а не после «Sheet1». Я обнаружил, что скопированный лист становится активным листом.

Get Handle on last worksheet copied by Worksheet.Copy

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

Но моя проблема в том, мне нужно простыню, чтобы оставаться в определенном порядке.

Благодаря

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 

Это не получает новый лист непосредственно после того, как "Лист1" либо.

+3

Почему бы не использовать 'wst.copy после: = wst'? – glh

+0

Что сказал @glh. У вас уже есть 'wst' как переменная Worksheet. Просто используйте это для аргумента 'After' :) –

+0

' wst.copy после: = wst' и 'wst.copy после: = Листы (« Лист1 »)' дают те же результаты. Мой новый лист появляется после скрытого листа, а не сразу после «Sheet1» – Jonathan

ответ

3

Существующий код может быть добавлен

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

Спасибо, что сделал трюк. Я подумал, что могу сделать полу-хак. Но просто хотел убедиться, что я не сумасшедший. я могу его немного: 'Если (ActiveSheet.Index - wst.Index - 1) <> 0 Тогда Dim bVisible Как булевой bVisible = Sheets (wst.Index + 1) .Visible Sheets (WST. Index + 1) .Visible = True ActiveSheet.Переместить после: = wst Листы (wst.Index + 2) .Visible = bVisible Конец If' Возможно, можно сказать, что их скрытый лист является единственным, когда это проблема, но я сохраню видимость только в случай Excel бросает меня на другой цикл. – Jonathan

+0

Не знаете, почему он не форматировал код правильно ... – Jonathan

+0

+1 хороший. Не знал об этом * проблеме * со скрытыми листами. – glh

0

Свойство индекса является нулевой базой, если не указано иное. Свойство «Листы» является базовым. Вам необходимо:

  1. Добавить 1 в список, не рекомендуется.
  2. Ссылка на свойство .name, лучше.
  3. Ссылка на переменную листа, которую вы имеете I.e. Wst.copy после: = wst, лучше всего.
  4. Или переместите скрытый лист на новый.
+1

Спасибо, я избегу использовать индексы, если смогу, хотя это не было проблема в этом случае. – Jonathan

Смежные вопросы