【问题标题】:Error importing sheets in VBA在 VBA 中导入工作表时出错
【发布时间】:2014-11-01 16:55:24
【问题描述】:

我正在尝试编写一个 VBA 宏来从另一个工作簿导入工作表。我在“复制”行收到“下标超出范围”错误。文件可以正确打开,但我不确定之后出了什么问题。

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim lastdate As String, filename As String

lastdate = Format(sheet_1.Range("D11") - 7, "ddmmyy")
filename = "C:\Dir\file " & lastdate & ".xlsm"

Workbooks.Open (filename)
Workbooks(filename).Worksheets(2).Copy after:=ThisWorkbook.Worksheets(1)

Workbooks(filename).Close

Application.ScreenUpdating = True
Application.DisplayAlerts = False

End Sub

编辑:错误更改为“下标超出范围”,代码已更改,因此索引引用了工作表。

代码 v2:

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim lastdate As String, filename As String

lastdate = Format(sheet1.Range("D11") - 7, "ddmmyy")
filename = "C:\Dir\file " & lastdate & ".xlsm"

Dim wbk As Workbook
wbk = Workbooks.Open(filename)

wbk.Worksheets(2).Copy after:=ThisWorkbook.Worksheets(1)
wbk.Close

End Sub

【问题讨论】:

  • sheet_3sheet_1 的维度在哪里,它们的数据类型和值是什么?
  • 这是我试图阻止你在不保存的情况下关闭:我想你最后想要Application.DisplayAlerts = True。此外,在将其设置为 False 时,您应该始终进行错误处理,否则您很快就会遇到意外。
  • 您好,我在上面进行了编辑。我使用 sheet_3 和 sheet_1 作为占位符来稍微简化代码,这导致了部分错误。但是,仍然存在一个潜在问题 - 当我使用索引执行相同操作时,我得到一个“下标超出范围”错误(我认为这是原始错误)。
  • 让-弗朗索瓦,你是对的。抱歉,打错字了!
  • @Jean-FrançoisCorbett Application.DisplayAlerts。根据帮助,“如果您将此属性设置为 False,Microsoft Excel 会在代码完成时将此属性设置为 True,除非您正在运行跨进程代码。”

标签: vba excel


【解决方案1】:

您收到下标超出范围错误,因为您没有工作簿的 Name 权限。 Name 与完整路径不同(这是您一直在假设的);它与文件名相同。

这将起作用:

Workbooks.Open "C:\Dir\file1234.xlsm"
Workbooks("file1234.xlsm").Sheets(1).Range("a1").Value = "yay"

而这不会:

Workbooks.Open "C:\Dir\file1234.xlsm"
Workbooks("C:\Dir\file1234.xlsm").Sheets(1).Range("a1").Value = "yay"

但是引用工作簿的更好方法是像这样设置对它的显式引用:

Dim wbk As Workbook
Set wbk = Workbooks.Open(filename)
wbk.Worksheets(2).Copy after:=ThisWorkbook.Worksheets(1)

使用wbk,您现在可以处理您想要的工作簿;你不必猜测它的名字或任何东西。

【讨论】:

    【解决方案2】:

    引用对象变量时需要关键字“Set”:

    Private Sub CommandButton1_Click()
    
    Application.ScreenUpdating = False
    'Application.DisplayAlerts = False '<<this does not look like it is required - when is an alert displayed in the method?
    
    Dim lastdate As String, filename As String
    
    lastdate = Format(sheet1.Range("D11") - 7, "ddmmyy")
    filename = "C:\Dir\file " & lastdate & ".xlsm"
    
    Dim wbk As Workbook
    Set wbk = Workbooks.Open(filename)   '<<Set is required
    
    wbk.Worksheets(2).Copy after:=ThisWorkbook.Worksheets(1)
    wbk.Close
    
    End Sub
    

    【讨论】:

      【解决方案3】:
      Option Explicit
      
      Sub Import_Worksheets()
      
      Dim FolderPath As String
      Dim Filename As String
      Dim sheet As Worksheet
      
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      
      FolderPath = "H:G:\D S Class\Excel VBA (Macro)\RTO form\VBA\"
      Filename = Dir(FolderPath & "RESTAURANT_USAGE_DATA.xlsx")
      
      Do While Filename <> ""
       Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True
       For Each sheet In ActiveWorkbook.Sheets
       sheet.Copy After:=ThisWorkbook.Sheets(1)
       Next sheet
       Workbooks(Filename).Close
       Filename = Dir()
      Loop
      
      Application.ScreenUpdating = True
      Application.DisplayAlerts = True
      
      End Sub
      
          enter code here
      

      【讨论】:

      • 点评来源: Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他也有类似问题的用户有用。请参阅:How do I write a good answer?。谢谢
      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2014-07-26
      • 2014-09-24
      相关资源
      最近更新 更多