2013-03-13 19 views
-1

Я столкнулся с некоторым кодом, чтобы скопировать диапазон в новую книгу, но я не уверен, почему он работает.Копирование диапазона в новую книгу

Worksheets("Short Form").Copy 
Set wb = ActiveWorkbook 

Как это делает копию рабочего листа «короткометражный» в новую книгу, когда все, что код говорит, назначить активную рабочую книгу в качестве ссылки «термометру»? Он даже не использует метод .add. Прямо сейчас я хочу вставлять значения только в эту новую книгу, но не совсем уверен, как это сделать, потому что я не понимаю этот блок кода.

+0

Может быть, вы могли бы добавить еще какой-то код? Потому что все, что у вас есть (если я прав), это скопировать лист «Короткая форма» и установить wb как активную рабочую книгу. – CustomX

+3

По умолчанию Worksheet.Copy копирует рабочий лист в новую книгу. Таким образом, этот код копирует весь рабочий лист, а затем устанавливает wb как ссылку на недавно созданную книгу. –

+2

Рабочие листы («имя»). Копирование - не означает ТОЛЬКО КОПИРОВАНИЕ см. [DOCS] (http://msdn.microsoft.com/en-us/library/office/ff835605.aspx) – 2013-03-13 15:19:34

ответ

1

Попробуйте это - как следующие действия вручную такие же, как фрагмент кода:

1.Open пустой книги
2.Press запись макроса
3.Right откройте вкладку рабочей книги Лист1
4 .Select «Переместить или Копировать»
5.In комбо «Для того, чтобы заказать» выбрать (новая книга)
6.Check «Создать копию» окно так, что окно теперь выглядит следующим образом:
enter image description here 7. Остановите рекордер
8.Go и найти записанный код ... и вуаля .... мое выглядит так

Option Explicit 

Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
    Sheets("Sheet1").Select 
    Sheets("Sheet1").Copy 
End Sub 

Ваш код такой же, как то, что описывают эти действия вручную.


Вы должны иметь линию Dim wb as workbook где-нибудь, или это не будет работать.

Эта строка Set wb = ActiveWorkbook затем сделает объект wb равным новой книге, в которую вы скопировали, так как она активна, поэтому вы можете выполнять дальнейшие операции над ней. Вы можете легко переключаться книгу, Wb наведен на:

Sub Macro1() 
Dim wb As Workbook 

ThisWorkbook.Sheets("Sheet1").Copy 
Set wb = ActiveWorkbook 
MsgBox wb.Name 
ThisWorkbook.Activate 
Set wb = ActiveWorkbook 
MsgBox wb.Name 

End Sub 

НО
В моем рабочем коде я вообще никогда не использую Set x To ActiveWorkbook Я всегда назвать книгу, а затем использовать Set x To Workbooks("DefiniteName")


БЕЗ ИСПОЛЬЗОВАНИЯ КЛИПАТОРА
Если вы хотите избежать использования платы клипа, то в следующем примере показано, как перемещать данные только для значений без использования пасты:

Sub WithoutPastespecial() 


Dim firstRange As Range 
Set firstRange = ThisWorkbook.Worksheets("Short Form").Range("S4:S2000") 'can change S4:S2000 to the range you want to copy 

Dim newBk As Workbook 
Dim secondRange As Range 
Set newBk = Workbooks.Add 
Set secondRange = newBk.Worksheets("Sheet1").Range("A1") 

With firstRange 
     Set secondRange = secondRange.Resize(.Rows.Count, .Columns.Count) 
End With 
secondRange.Value = firstRange.Value 

End Sub 
0

Примечание это не копирование Range скорее всего worskheet :)

Если вы используете метод:

Worksheets("Short Form").Cells.Copy

Тогда вы будете копировать только клетки , а не весь рабочий лист, и этот метод НЕ создаст новую книгу. Вы можете сказать это, чтобы добавить книгу, когда это необходимо.

Вот пример:

Option Explicit 

Sub CopyNew() 
Dim wbNew As Workbook 
Dim wb As Workbook 

Set wb = ThisWorkbook 'It is a good idea to explicitly control workbooks using either a defined variable like "wb" or the "ThisWorkbook" object, instead of using "ActiveWorkbook" or referring to files by name. 

Application.CutCopyMode = False 
wb.Sheets("Short Form").Cells.Copy 


'Add a new workbook for the values: 
Set wbNew = Workbooks.Add 

wbNew.Sheets(1).Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 


End Sub 
+0

Эта строка кода 'Set wb = ThisWorkbook' бессмысленна ... все, что вы делаете, сокращает' ThisWorkbook' до этого 'wb'. Вы сохраняете какую-то ввод, но потом в коде все становится менее читаемым, так как он говорит, что wb и читатель кода могут не понимать, что он относится к 'ThisWorkbook'. Можете ли вы дать конкретный пример того, почему это «всегда хорошая идея»? – whytheq

+0

Нет, вы абсолютно правы. Использование 'wb' вместо' ThisWorkbook' является личным предпочтением. Я имел в виду, что всякий раз, когда вы работаете с несколькими книгами, рекомендуется использовать переменные для каждого (или, если хотите, «ThisWorkbook» и одну переменную рабочей книги), а не ссылаться на них явно (по имени) или «ActiveWorkbook» который будет генерировать макрорекордер. Однако я считаю, что использование 'wb' вместо' ThisWorkbook' делает несколько более многоразовым. Возможно, вы хотите использовать это в приложении, файл надстройки XLAM и т. Д. Затем вам нужно только изменить строку, которая 'Set wb = ...'. –

+1

... ОК никаких забот - согласился; Я бы, конечно, сделал ссылку на «Рабочие книги» («это имеет очень длинное имя») »и согласен с тем, что это хорошая практика, чтобы поместить это в переменную объекта, такую ​​как' wb' – whytheq

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