0

我正在研究一个宏,该宏会将工作表从选定的 Excel 工作表移动到已加载宏的文档中。

我在实际让工作表移动时遇到问题,我不断收到下标超出范围的错误,我不确定为什么

到目前为止,我已经仔细阅读了 stackoverflow 和其他一些资源。我尝试过使用.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

理想情况下,我想将选定工作簿中的工作表复制到我的预定义工作簿中。

4

3 回答 3

0

没有必要创建额外的 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
于 2019-06-20T20:41:16.177 回答
0

下标超出范围是因为"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)
于 2019-06-20T20:42:11.190 回答
0

倒数第二行 - 你有

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

这应该是

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

这是第二个字符的错字

于 2019-06-21T11:03:48.830 回答