Проблемы с перемещением листов между рабочими книгами - PullRequest
0 голосов
/ 20 июня 2019

Я работаю над макросом, который переместит лист из выбранного листа Excel в документ с уже загруженным макросом.

У меня возникли проблемы с фактическим перемещением листа.продолжаю получать индекс из-за ошибки диапазона, и я не уверен, почему

я до сих пор просматривал стековый поток и несколько других ресурсов.Я пытался использовать .sheets / workbook(workbookname).worksheets(1).copy ... и так далее, и тому подобное.

Sub runEXCEL()

dim wb1 as workbook, wb2 as workbook
dim fd as filedialog
dim shtpath as string
dim ws as worksheet


Set fd = Application.FileDialog(msoFileDialogFilePicker)

If fd.Show = True Then
    If fd.SelectedItems(1) <> vbNullString Then
        shtpath = fd.SelectedItems(1)
    End If
Else
    End
End If

set wb1 = workbooks.open("c:\users\username\documents\yestbook.xlsm", true, false
set wb2 = workbooks.open(shtpath)
set ws = wb2.worksheets(1)
ws.name = "testname"
ws.worksheets(1).copy after:=wb1.sheets(1)
'xl.Application.Run "yestbook.xlsm!findCellAddress"

End Sub

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

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Подстрочный индекс выходит за пределы диапазона, потому что "yestbook.xlsm" не существует в глобальной коллекции Workbooks, которая в этом случае ограничена активным экземпляром Excel (т. Е. Экземпляром, из которого этот кодвыполняется).Вы открыли две рабочие книги, каждая в новом и отдельном экземпляре Excel, что создает дополнительные проблемы, потому что вы не можете Copy рабочих таблиц между экземплярами, подобными этому.

Это должно работать, если только нет особых причин, по которым каждый файл должен открываться в своем собственном экземпляре:

Dim wb1 As Workbook, wb2 as Workbook
Dim fd As FileDialog
Dim shtpath As String
Dim ws As Worksheet

Set fd = Application.FileDialog(msoFileDialogFilePicker)

If fd.Show = True Then
    If fd.SelectedItems(1) <> vbNullString Then
        shtpath = fd.SelectedItems(1)
    End If
Else
    End
End If

Set wb1 = Workbooks.Open("C:\Users\username\Desktop\yestbook.xlsm", True, False)
Set wb2 = Workbooks.Open(shtpath)
Set ws = wb2.Worksheets(1)
ws.Name = "testname"
ws.Copy after:=wb1.Sheets(1)
0 голосов
/ 21 июня 2019

От второй до последней строки - у вас есть

ws.worksheets(1).copy after:=wb1.sheets(1)

Это должно быть

wb.worksheets(1).copy after:=wb1.sheets(1)

это опечатка на втором символе

0 голосов
/ 20 июня 2019

Нет необходимости создавать дополнительные процессы Excel (на самом деле, это может быть причиной проблемы).Вам также следует использовать переменные для рабочих книг и рабочих листов для всех доступа к листам и избегать неквалифицированного доступа, например Sheets("testname").

Попробуйте что-то вроде:

Dim wb as workbook, ws as worksheet, wb2 as workbook, ws2 as worksheet

Set wb = Workbooks.Open(mysheetpath1)
Set ws=wb.Worksheets(1)

set wb2=Workbooks.Open(mysheetpath2)
set ws2=wb2.Worksheets(1)
ws2.Copy after:=ws
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...