工作簿文件路径上的应用程序定义或对象定义的错误

时间:2015-09-22 15:39:38

标签: vba excel-vba excel

我正在尝试将数据从一个工作簿复制到我的打开的工作簿,并始终收到Application-defined or object-defined error

X是我要复制的工作簿的路径,Y是我所在工作簿的路径。错误在set = y ...返回。

我遵循了这个主题:Link columns from two different workbooks

'
' Import data from dump and articles into workbook
'

    Dim x As Workbook
    Dim y As Workbook

    Application.ScreenUpdating = False

    FilePath = Range("C2")

    '## Open both workbooks first:
    Set x = Workbooks.Open(FilePath)
    Set y = Workbooks.Open("C:\Users\Username\Desktop\Filename.xlsx")

    'Now, copy what you want from x:
    y.Sheets("Sheet1").Range("B:B").Value = x.Sheets("articles").Range("A")
    y.Sheets("Sheet1").Range("AD:AD").Value = x.Sheets("articles").Range("B")

    'Close x:
    x.Close

    Application.ScreenUpdating = False

3 个答案:

答案 0 :(得分:1)

Range("A")Range("B")不是合适的范围:

    Range("A").Select   'this generates an error

试试这个(测试过)

Option Explicit

Public Sub copyWorkBookDataColumns()

    Dim wb1 As Workbook, ws1 As Worksheet, ur1 As Range
    Dim wb2 As Workbook, ws2 As Worksheet, ur2 As Range, lr2 As Long

    Application.ScreenUpdating = False

    Set wb1 = ActiveWorkbook 'already open (file running current VBA code)
    Set wb2 = Workbooks.Open("C:\Users\Username\Desktop\FileToOpen.xlsx")

    Set ws1 = wb1.Worksheets("articles")    'copy to this Worksheet
    Set ws2 = wb2.Worksheets("Sheet1")      'copy from this Worksheet

    Set ur1 = ws1.UsedRange                 'copy to this Range
    Set ur2 = ws2.UsedRange                 'copy from this Range

    lr2 = ur2.Row + ur2.Rows.Count          'last row in file2

    'copy from ws2 to ws1
    ws1.Range("A1:A" & lr2).Value2 = ws2.Range("B1:B" & lr2).Value2
    ws1.Range("B1:B" & lr2).Value2 = ws2.Range("AD1:AD" & lr2).Value2

    wb2.Close
    Application.ScreenUpdating = False
End Sub

注意:...Range("B:B")=...Range("A:A")会通过复制100万+值来浪费资源

答案 1 :(得分:0)

假设您已发布了您遇到问题的实际代码,那么您的问题很可能是\ username \不是实际目录。您需要将硬编码为您登录到工作站的实际名称(如果它只是由您运行),或者使其为登录的任何人设置为动态。

如果您的登录名是jsmith,那么您的桌面路径就是。

Set wb2 = Workbooks.Open("C:\Users\jsmith\Desktop\FileToOpen.xlsx")

要使其动态化,您需要从系统中获取用户名。假设您使用的是Windows:

Dim strUserName As String
strUserName = Environ$("Username")
Set wb2 = Workbooks.Open("C:\Users\" & strUserName  & "\Desktop\FileToOpen.xlsx")

处理用户名,您还必须将\ FileToOpen.xlsx更改为您要打开的Excel工作簿的实际名称。防爆。 \ Inventory.xlsx

注意:某些Windows域已设置,因此用户目录为username.domain。因此,如果您的域名是CORP,则您的目录可能是jsmith.CORP。

如果以上不是问题,你可以试试这个。

Set wb2 = Workbooks.Open(Filename:="C:\Users\jsmith\Desktop\FileToOpen.xlsx")

我已经看到过这样做了。

答案 2 :(得分:-1)

MatthewD的评论是正确的,并且您在进行复制的每一行中也存在类似的问题。看起来好像你没有正确引用范围或它们的值。另外,我强烈建议使用Value2而不是Value。如果使用Excel公式设置x = y,则Value2将返回相同的结果,而Value会截断某些数据。几乎肯定不是你想要的功能。

y.Sheets("Sheet1").Range("B:B").Value2 = x.Sheets("articles").Range("A:A").Value2
y.Sheets("Sheet1").Range("AD:AD").Value2 = x.Sheets("articles").Range("B:B").Value2

最后,如果这些修补程序无法解决您的问题,那么如果您可以指出哪一行代码会触发错误,则会非常有用。