Excel не может скопировать лист vba

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

Всем добрый день!  

  Никто не сталкивался с такой проблемой — периодически возникает ошибка при копировании листа через VBA:  
«Метод Copy из класса Worksheet завершен не верно»  
Причем, что самое интересное, ошибка возникает именно периодически и исчезает через некоторое время сама собой и код отрабатывается без проблем. Проводил проверку — при возникновении этой ошибки открываю новую книгу Excel, включаю макрорекордер, копирую лист — это действие не записывается.    

  Нет ли у кого-нибудь идей что это такое и как с этим жить?  
Спасибо  

  PS Excel 2007 SP2

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Переустановить Office нет желания?)

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

{quote}{login=nerv}{date=01.08.2011 10:04}{thema=}{post}Переустановить Office нет желания?){/post}{/quote}  

  Может и есть, но поскольку компьютер рабочий, то тут учитывается желание наших IT-шников, и мне кажется, что это не поможет, т.к. эта ошибка наблюдается как минимум еще на одном компьютере (кстати, одновременно с моим…)

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

от вирусов надежно защищены? Может быть в последнее время на обе машины устанавливалось каое-либо ПО, которое влияет на работу пакета MS Office?

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Еще предположение: надстройки для Excel, плюс проверьте Personal.xls.  

  Вы точно уверены, что дело не в макросе?

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

Да, уверен — дело точно не в макросе. Personal.xls у меня вообще нет. Одно и то же ПО — наверное вряд ли, но надо будет уточнить. А вот вирусы… Это вопрос.  

  Спасибо.

 

Лист копируется в эту же книгу, или в другую?  
Не защищена ли книга?

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

{quote}{login=Казанский}{date=01.08.2011 11:00}{thema=webley}{post}Лист копируется в эту же книгу, или в другую?  
Не защищена ли книга?{/post}{/quote}  

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

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

 

Может, кто-то периодически включает общий доступ к книге?

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

{quote}{login=nerv}{date=01.08.2011 11:47}{thema=to webley}{post}А можно код посмотреть?{/post}{/quote}  

  Да, конечно. Вот начало модуля, ошибка происходит при копировании. Думаю, этого кусочка достаточно, если нет — могу выложить весь код, но проверить его работоспособность все равно не получится, т.к. он оперирует файлами, лежащими на сервере  

    Sub Analitic()  
   Dim r, c  

     Set WBres = Workbooks.Open(PathStr & «МОНИТОРИНГ КЛИЕНТОВ.xlsm»)  

         ‘создаем временную книгу и копируем туда необходимые листы из разных книг  
   Set WBanalitic = Workbooks.Add  
   WBres.Sheets(«Data»).Copy after:=WBanalitic.Sheets(WBanalitic.Sheets.Count)  
   WBlut.Sheets(«LUT»).Copy after:=WBanalitic.Sheets(WBanalitic.Sheets.Count)  
   WBlut.Sheets(«CU_add_date»).Copy after:=WBanalitic.Sheets(WBanalitic.Sheets.Count)

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

{quote}{login=Казанский}{date=01.08.2011 11:55}{thema=}{post}Может, кто-то периодически включает общий доступ к книге?{/post}{/quote}  

  нет, файл с макросом — это excel-отчет из корпоративной системы, т.е. он локальный

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

И что интересно — дождался появления ошибки, ушел в отладку макроса и попробовал скопировать эти листы руками: Excel их просто не стал копировать… Ни ошибки, никаких сообщений — просто не копирует…

 

Строки длиннее 255 символов — кажется, в 2003 с этим была проблема?  

  Конфликт имен (одинаковые имена в разных книгах)?

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

мне кажется Казанский прав, может это — Конфликт имен?

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

Про конфликт имен — не думаю, т.к. создаю новую книгу, и копирую листы с уже измененными названиями. Вообще какая-то мистика — перед запуском сохранил файл в корневой каталог на диск D, после этого все сработало. Сразу после выгрузки файл сохраняется здесь:  
C:Documents and SettingsaberkutovLocal SettingsTemporary Internet FilesSiebel25.07.11-31.07.11.xlsm  
Может быть тут собака порылась?  

  В любом случае, всем спасибо, попытаюсь выявить закономерность этой ошибки, а там видно будет…

 

БАХ43

Гость

#17

01.08.2011 22:15:23

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

Помогите, пожалуйста, не могу скопировать лист вакансии из книги, которую открываю через диалоговое окно в активную книгу Лист Microoft Excel.xlsm, где будет писаться макрос, вылезает ошибка, пробовала тремя разными способами( 2 из них закомментированы), в идеале потом книгу, из которой копировался лист » Вакансии» надо закрыть. А активной сделать книгу Лист Microoft Excel.xlsm

a=Application.GetOpenFilename_
("Excel files(*.xls*),*xls*",1,_
"Выберите Excel файл, скаченный с hh",,False)
'Sheets("Вакансии").Copy After:=WorkBooks("Лист Microoft Excel.xlsm").Sheets("Лист1")
WorkBooks("Лист Microoft Excel.xlsm").Sheets("Лист1").Value=a.Sheets("Вакансии").Value
'Sheets("Вакансии").Range("A:U").Copy After:=WorkBooks("Лист Microoft Excel.xlsm").Sheets("Лист1").Range("A:U")
Sheets("Лист1").Activate

введите сюда описание изображения

So, what I want to do, generally, is make a copy of a workbook. However, the source workbook is running my macros, and I want it to make an identical copy of itself, but without the macros. I feel like there should be a simple way to do this with VBA, but have yet to find it. I am considering copying the sheets one by one to the new workbook, which I will create. How would I do this? Is there a better way?

Martijn Pieters's user avatar

asked Jul 28, 2011 at 18:34

Brian's user avatar

1

I would like to slightly rewrite keytarhero’s response:

Sub CopyWorkbook()

Dim sh as Worksheet,  wb as workbook

Set wb = workbooks("Target workbook")
For Each sh in workbooks("source workbook").Worksheets
   sh.Copy After:=wb.Sheets(wb.sheets.count) 
Next sh

End Sub

Edit: You can also build an array of sheet names and copy that at once.

Workbooks("source workbook").Worksheets(Array("sheet1","sheet2")).Copy _
         After:=wb.Sheets(wb.sheets.count)

Note: copying a sheet from an XLS? to an XLS will result into an error. The opposite works fine (XLS to XLSX)

answered Jul 28, 2011 at 21:05

iDevlop's user avatar

iDevlopiDevlop

24.6k11 gold badges89 silver badges147 bronze badges

3

Someone over at Ozgrid answered a similar question. Basically, you just copy each sheet one at a time from Workbook1 to Workbook2.

Sub CopyWorkbook()

    Dim currentSheet as Worksheet
    Dim sheetIndex as Integer
    sheetIndex = 1

    For Each currentSheet in Worksheets

        Windows("SOURCE WORKBOOK").Activate 
        currentSheet.Select
        currentSheet.Copy Before:=Workbooks("TARGET WORKBOOK").Sheets(sheetIndex) 

        sheetIndex = sheetIndex + 1

    Next currentSheet

End Sub

Disclaimer: I haven’t tried this code out and instead just adopted the linked example to your problem. If nothing else, it should lead you towards your intended solution.

Community's user avatar

answered Jul 28, 2011 at 19:05

Chris Flynn's user avatar

Chris FlynnChris Flynn

9536 silver badges11 bronze badges

2

You could saveAs xlsx. Then you will loose the macros and generate a new workbook with a little less work.

ThisWorkbook.saveas Filename:=NewFileNameWithPath, Format:=xlOpenXMLWorkbook

answered Jul 28, 2011 at 20:55

Brad's user avatar

BradBrad

11.9k4 gold badges44 silver badges70 bronze badges

2

I was able to copy all the sheets in a workbook that had a vba app running, to a new workbook w/o the app macros, with:

ActiveWorkbook.Sheets.Copy

Prashant Kumar's user avatar

answered Feb 28, 2014 at 17:50

George Ziniewicz's user avatar

Assuming all your macros are in modules, maybe this link will help. After copying the workbook, just iterate over each module and delete it

Community's user avatar

answered Jul 28, 2011 at 18:59

raven's user avatar

ravenraven

4376 silver badges17 bronze badges

Try this instead.

Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
    ws.Copy
Next

ZygD's user avatar

ZygD

21k39 gold badges77 silver badges98 bronze badges

answered Jan 17, 2013 at 21:28

Ch3knraz3's user avatar

You can simply write

Worksheets.Copy

in lieu of running a cycle.
By default the worksheet collection is reproduced in a new workbook.

It is proven to function in 2010 version of XL.

iDevlop's user avatar

iDevlop

24.6k11 gold badges89 silver badges147 bronze badges

answered Feb 17, 2015 at 14:25

Hors2force's user avatar

Hors2forceHors2force

1011 silver badge2 bronze badges

    Workbooks.Open Filename:="Path(Ex: C:ReportsClientWiseReport.xls)"ReadOnly:=True


    For Each Sheet In ActiveWorkbook.Sheets

        Sheet.Copy After:=ThisWorkbook.Sheets(1)

    Next Sheet

answered Feb 22, 2013 at 11:39

Sainath J's user avatar

Here is one you might like it uses the Windows FileDialog(msoFileDialogFilePicker) to browse to a closed workbook on your desktop, then copies all of the worksheets to your open workbook:

Sub CopyWorkBookFullv2()
Application.ScreenUpdating = False

Dim ws As Worksheet
Dim x As Integer
Dim closedBook As Workbook
Dim cell As Range
Dim numSheets As Integer
Dim LString As String
Dim LArray() As String
Dim dashpos As Long
Dim FileName As String

numSheets = 0

For Each ws In Application.ActiveWorkbook.Worksheets
    If ws.Name <> "Sheet1" Then
       Sheets.Add.Name = "Sheet1"
   End If
Next

Dim fileExplorer As FileDialog
Set fileExplorer = Application.FileDialog(msoFileDialogFilePicker)
Dim MyString As String

fileExplorer.AllowMultiSelect = False

  With fileExplorer
     If .Show = -1 Then 'Any file is selected
     MyString = .SelectedItems.Item(1)

     Else ' else dialog is cancelled
        MsgBox "You have cancelled the dialogue"
        [filePath] = "" ' when cancelled set blank as file path.
        End If
    End With

    LString = Range("A1").Value
    dashpos = InStr(1, LString, "") + 1
    LArray = Split(LString, "")
    'MsgBox LArray(dashpos - 1)
    FileName = LArray(dashpos)

strFileName = CreateObject("WScript.Shell").specialfolders("Desktop") & "" & FileName

Set closedBook = Workbooks.Open(strFileName)
closedBook.Application.ScreenUpdating = False
numSheets = closedBook.Sheets.Count

        For x = 1 To numSheets
            closedBook.Sheets(x).Copy After:=ThisWorkbook.Sheets(1)
        x = x + 1
                 If x = numSheets Then
                    GoTo 1000
                 End If
Next

1000

closedBook.Application.ScreenUpdating = True
closedBook.Close
Application.ScreenUpdating = True

End Sub

answered Apr 5, 2020 at 22:26

RWB's user avatar

try this one

Sub Get_Data_From_File()

     'Note: In the Regional Project that's coming up we learn how to import data from multiple Excel workbooks
    ' Also see BONUS sub procedure below (Bonus_Get_Data_From_File_InputBox()) that expands on this by inlcuding an input box
    Dim FileToOpen As Variant
    Dim OpenBook As Workbook
    Application.ScreenUpdating = False
    FileToOpen = Application.GetOpenFilename(Title:="Browse for your File & Import Range", FileFilter:="Excel Files (*.xls*),*xls*")
    If FileToOpen <> False Then
        Set OpenBook = Application.Workbooks.Open(FileToOpen)
         'copy data from A1 to E20 from first sheet
        OpenBook.Sheets(1).Range("A1:E20").Copy
        ThisWorkbook.Worksheets("SelectFile").Range("A10").PasteSpecial xlPasteValues
        OpenBook.Close False
        
    End If
    Application.ScreenUpdating = True
End Sub

or this one:

Get_Data_From_File_InputBox()

Dim FileToOpen As Variant
Dim OpenBook As Workbook
Dim ShName As String
Dim Sh As Worksheet
On Error GoTo Handle:

FileToOpen = Application.GetOpenFilename(Title:="Browse for your File & Import Range", FileFilter:="Excel Files (*.xls*),*.xls*")
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If FileToOpen <> False Then
    Set OpenBook = Application.Workbooks.Open(FileToOpen)
    ShName = Application.InputBox("Enter the sheet name to copy", "Enter the sheet name to copy")
    For Each Sh In OpenBook.Worksheets
        If UCase(Sh.Name) Like "*" & UCase(ShName) & "*" Then
            ShName = Sh.Name
        End If
    Next Sh

    'copy data from the specified sheet to this workbook - updae range as you see fit
    OpenBook.Sheets(ShName).Range("A1:CF1100").Copy
    ThisWorkbook.ActiveSheet.Range("A10").PasteSpecial xlPasteValues
    OpenBook.Close False
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub

Handle:
If Err.Number = 9 Then
MsgBox «The sheet name does not exist. Please check spelling»
Else
MsgBox «An error has occurred.»
End If
OpenBook.Close False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

both work as

answered Jul 6, 2020 at 4:26

Silvio Rivas's user avatar

Создание, копирование, перемещение и удаление рабочих листов Excel с помощью кода VBA. Методы Sheets.Add, Worksheet.Copy, Worksheet.Move и Worksheet.Delete.

Создание новых листов

Создание новых рабочих листов осуществляется с помощью метода Sheets.Add.

Синтаксис метода Sheets.Add

expression.Add [Before, After, Count, Type]

где expression — переменная, представляющая собой объект Sheet.

Компоненты метода Sheets.Add

  • Before* — необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлен новый.
  • After* — необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлен новый.
  • Count — необязательный параметр типа данных Variant, указывающий, сколько листов будет добавлено (по умолчанию — 1).
  • Type — необязательный параметр типа данных Variant, указывающий тип листа: xlWorksheet** (рабочий лист) или xlChart (диаграмма), по умолчанию — xlWorksheet.

*Если Before и After не указаны, новый лист, по умолчанию, будет добавлен перед активным листом.

**Для создания рабочего листа (xlWorksheet) можно использовать метод Worksheets.Add, который для создания диаграмм уже не подойдет.

Примеры создания листов

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

‘Создание рабочего листа:

Sheets.Add

Worksheets.Add

ThisWorkbook.Sheets.Add After:=ActiveSheet, Count:=2

Workbooks(«Книга1.xlsm»).Sheets.Add After:=Лист1

Workbooks(«Книга1.xlsm»).Sheets.Add After:=Worksheets(1)

Workbooks(«Книга1.xlsm»).Sheets.Add After:=Worksheets(«Лист1»)

‘Создание нового листа с заданным именем:

Workbooks(«Книга1.xlsm»).Sheets.Add.Name = «Мой новый лист»

‘Создание диаграммы:

Sheets.Add Type:=xlChart

‘Добавление нового листа перед

‘последним листом рабочей книги

Sheets.Add Before:=Sheets(Sheets.Count)

‘Добавление нового листа в конец

Sheets.Add After:=Sheets(Sheets.Count)

  • Лист1 в After:=Лист1 — это уникальное имя листа, указанное в проводнике редактора VBA без скобок.
  • Лист1 в After:=Worksheets(«Лист1») — это имя на ярлыке листа, указанное в проводнике редактора VBA в скобках.

Создаваемый лист можно присвоить объектной переменной:

Dim myList As Object

‘В активной книге

Set myList = Worksheets.Add

‘В книге «Книга1.xlsm»

Set myList = Workbooks(«Книга1.xlsm»).Worksheets.Add

‘Работаем с переменной

myList.Name = «Listok1»

myList.Cells(1, 1) = myList.Name

‘Очищаем переменную

Set myList = Nothing

Если создаваемый лист присваивается объектной переменной, он будет помещен перед активным листом. Указать дополнительные параметры невозможно.

Копирование листов

Копирование рабочих листов осуществляется с помощью метода Worksheet.Copy.

Синтаксис метода Worksheet.Copy

expression.Copy [Before, After]

где expression — переменная, представляющая собой объект Worksheet.

Компоненты метода Worksheet.Copy

  • Before* — необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлена копия.
  • After* — необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлена копия.

*Если Before и After не указаны, Excel создаст новую книгу и поместит копию листа в нее. Если скопированный лист содержит код в проекте VBA (в модуле листа), он тоже будет перенесен в новую книгу.

Примеры копирования листов

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

‘В пределах активной книги

‘(уникальные имена листов)

Лист1.Copy After:=Лист2

‘В пределах активной книги

‘(имена листов на ярлычках)

Worksheets(«Лист1»).Copy Before:=Worksheets(«Лист2»)

‘Вставить копию в конец

Лист1.Copy After:=Sheets(Sheets.Count)

‘Из одной книги в другую

Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Copy _

After:=Workbooks(«Книга2.xlsm»).Worksheets(«Лист1»)

‘Один лист активной книги в новую книгу

Лист1.Copy

‘Несколько листов активной книги в новую книгу*

Sheets(Array(«Лист1», «Лист2», «Лист3»)).Copy

‘Все листы книги с кодом в новую книгу

ThisWorkbook.Worksheets.Copy

* Если при копировании в новую книгу нескольких листов хотя бы один лист содержит умную таблицу — копирование невозможно. Один лист, содержащий умную таблицу, копируется в новую книгу без проблем.

Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.

Перемещение листов

Перемещение рабочих листов осуществляется с помощью метода Worksheet.Move.

Синтаксис метода Worksheet.Move

expression.Move [Before, After]

где expression — переменная, представляющая собой объект Worksheet.

Компоненты метода Worksheet.Move

  • Before* — необязательный параметр типа данных Variant, указывающий на лист, перед которым будет размещен перемещаемый лист.
  • After* — необязательный параметр типа данных Variant, указывающий на лист, после которого будет размещен перемещаемый лист.

*Если Before и After не указаны, Excel создаст новую книгу и переместит лист в нее.

Примеры перемещения листов

Простые примеры перемещения листов:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

‘В пределах активной книги

‘(уникальные имена листов)

Лист1.Move After:=Лист2

‘В пределах активной книги

‘(имена листов на ярлычках)

Worksheets(«Лист1»).Move Before:=Worksheets(«Лист2»)

‘Размещение после последнего листа:

Лист1.Move After:=Sheets(Sheets.Count)

‘Из одной книги в другую

Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Move _

After:=Workbooks(«Книга2.xlsm»).Worksheets(«Лист1»)

‘В новую книгу

Лист1.Move

Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.

Перемещение листа «Лист4» в позицию перед листом, указанным как по порядковому номеру, так и по имени ярлыка:

Sub Peremeshcheniye()

Dim x

x = InputBox(«Введите имя или номер листа», «Перемещение листа «Лист4»»)

If IsNumeric(x) Then x = CLng(x)

Sheets(«Лист4»).Move Before:=Sheets(x)

End Sub

Удаление листов

Удаление рабочих листов осуществляется с помощью метода Worksheet.Delete

Синтаксис метода Worksheet.Delete

expression.Delete

где expression — переменная, представляющая собой объект Worksheet.

Примеры удаления листов

‘По уникальному имени

Лист1.Delete

‘По имени на ярлычке

Worksheets(«Лист1»).Delete

‘По индексу листа

Worksheets(1).Delete

‘В другой книге

Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Delete

Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.

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

28 янв 2008, 08:55

Всем, принявшим участие в обсуждении проблемы – спасибо.
Причина оказалась совсем не в VBA и вышла на нее, в общем-то, случайно. Опишу ее, чтобы кто-нибудь еще не споткнулся на этом.
Оставила на проблемной машине и той, где макрос шел, только файл с проблемным макросом и сравнила перечень процессов на этих двух машинах. Оказалось, что на проблемной присутствует антивирус, на второй же его нет. После запуска антивируса на первой макрос перестал работать и там, а после отключения антивируса на второй макрос на ней заработал. Привлекла администратора сети (кстати, именно к нему я обращалась первоначально со своим вопросом, но мой вопрос классифицировался им как сугубо программистский). Оказалось, что в течении нескольких последних дней системный администратор поэтапно обновлял на компьютерах сети AVP.exe(5-ую версию заменял 6-ой). Когда посмотрели настройки 6-ой версии(использовались стандартные), то в настройке «Проверка VBA-макросов» было включено «Остановить выполнение макроса» для макрокоманды «Копирование таблицы Mictosoft Office EXCEL». Поэтому, на тех компьютерах, на которых успел появиться AVP 6-ой версии, и возникала проблема. Чисто случайно для сравнения я взяла машину, где AVP вообще не было, иначе вряд ли в поле внимания попала бы AVP.exe, во всяком случае, не так быстро.

Like this post? Please share to your friends:
  • Excel не может прочитать содержимое
  • Excel не может подключиться к принтеру
  • Excel не может переместить непустые ячейки за пределы листа
  • Excel не может отобразить картинку
  • Excel не может открыть файл так как формат или расширение этого файла