VBA脚本中的运行时错误9

时间:2013-09-28 02:45:51

标签: vba excel-vba runtime-error excel

所以基本上我可能有一个蹩脚的问题。我现在已经使用VBA大约两个小时了,我只是想创建一个宏来创建一个新的speadsheet并从现有的复制数据。

我已经处理过编译错误,但是现在当我尝试编译项目时,我得到一个“运行时错误9:下标超出范围”。在下面的代码中,错误出现在Name变量被赋值的行中。

我已经查看过具有相同问题的其他线程,但由于我对VBA的了解有限,我无法弄清楚出现了什么问题,或者这段代码是否可行。任何帮助将不胜感激! 谢谢大家!

Option Explicit

Sub PointsCopy()


'Declaring variables for correct naming

    Dim Pit As String
    Dim RL As Integer
    Dim Pattern As Integer
    Dim Name As String
    Dim DataBook As String
    Dim DataSheet As String
    Dim oBook As Workbook
    Dim oSheet As Worksheet
    Dim NewBook As Workbook
    Dim NewSheet As Worksheet
    Dim Rows As Integer
    Dim Pts As String



'Figuring out active workbook and worksheet

    Set oBook = ActiveWorkbook
    Set oSheet = ActiveSheet

    DataBook = ThisWorkbook.Name
    DataSheet = ActiveSheet.Name


'Getting pit, RL and pattern name from cell A2 and assigning to variable

此行中出现错误9          Name = Workbooks(DataBook).Sheets(DataSheet).Range(“A2”)。Text

    Name = Workbooks(DataBook).Sheets(DataSheet).Range("A2").Text
    Pit = Mid(Name, 4, 2)
    RL = Mid(Name, 7, 4)
    Pattern = Right(Name, 4)
    Pts = "" & Pit & "_" & RL & "_" & Pattern & "_pts.csv"


'Adding new workbook with a proper name

Set NewBook = Workbooks.Add
    With NewBook
    .SaveAs Filename:="" & Pts & ""

    Set NewSheet = Workbooks(NewBook).Sheets("Sheet1")

'Activating new worksheet
NewSheet.Activate

'Adding column names to the new workbook

    Range("A1").Value = "MQ2_PIT_CODE"
    Range("B1").Value = "BLOCK_TOE"
    Range("C1").Value = "PATTERN_NUMBER"
    Range("D1").Value = "BLOCK_NAME"
    Range("E1").Value = "EASTING"
    Range("F1").Value = "NORTHING"
    Range("G1").Value = "RL"
    Range("H1").Value = "POINT_NO"

'Activate original data sheet

    Workbooks(oBook).Sheets(oSheet).Activate

'Count number of data rows in the original spreadsheet

    Rows = Application.Count(Range("A2:A"))

'Activate the new spreadsheet and enter pit code, block toe and pattern number

    NewSheet.Activate
    Range("A2:A" & Rows) = "" & Pit & ""
    Range("B2:B" & Rows) = "" & RL & ""
    Range("C2:C" & Rows) = "" & Pattern & ""

'Copying data for easting, northing, rl and point number from original spreadsheet to the new one

    Workbooks(oBook).Sheets(oSheet).Activate
    Range("C2:C" & Rows).Select
    Selection.Copy

    NewSheet.Activate
    Range("D2").PasteSpecial Paste:=xlPasteValues

    Workbooks(oBook).Sheets(oSheet).Activate
    Range("E2:E" & Rows).Select
    Selection.Copy

    NewSheet.Activate
    Range("H2").PasteSpecial Paste:=xlPasteValues

    Workbooks(oBook).Sheets(oSheet).Activate
    Range("G2:I" & Rows).Select
    Selection.Copy

    NewSheet.Activate
    Range("E2").PasteSpecial Paste:=xlPasteValues

    Workbooks(NewBook).Sheets(NewSheet).Save

End With

End Sub

更新

我已经弄明白为什么我遇到这个错误 - 我指的是一个工作表和带有String类型变量的工作表,所以我改变了错误行,方法如下:

Name = ActiveSheet.Range("A2").Text

不,我没有错误9 但是我得到错误13:输入不匹配如果以下行:

Set NewSheet = Workbooks(NewBook).Sheets("Sheet1")

这里有什么问题的线索?再次感谢!

3 个答案:

答案 0 :(得分:1)

NewBook是一个工作簿对象,因此执行此分配的正确方法就像Set NewSheet = NewBook.Sheets("Sheet1")

构造Workbooks(_something_)接受一个字符串参数,作为工作簿的名称。您传递的内容而不是字符串是一个工作簿对象,它将引发错误,因为它不是预期的数据类型。

对于笑脸,你可以这样做:

... = Workbooks(NewBook.Name).Sheets("Sheet1")

但这显然是多余的,有点违背了在代码中使用对象变量的目的。

注意 Name也是一个半保留字,因为it's a type of object in Excel。虽然这可能不会给你带来任何错误,但可能会让人感到困惑,而且我个人试图避免使用与对象相同或非常相似的变量名。

答案 1 :(得分:0)

回应大卫回答的评论......

此:

DataBook = ThisWorkbook.Name
DataSheet = ActiveSheet.Name
与此相结合,

具有潜在的危险性:

Name = Workbooks(DataBook).Sheets(DataSheet).Range("A2").Text

原因?想想它一会儿。如果嵌入代码的工作簿也是当前的工作簿,它应该工作正常。但是,如果在执行代码时任何OTHER工作簿处于活动状态,则变量DataSheet将在THAT工作簿中选取工作表的名称,而不是“ThisWorkbook”对象中的工作簿。因此,您可能要求VBA找到当时在ACTIVE工作簿中确实存在的工作表名称,但可能不存在于“ThisWorkbook”中;也就是代码运行的工作簿。

这反过来会给你一个超出范围错误的下标,换句话说,“你正在寻找一张本工作簿中不存在的工作表”。 (我再次强调,“ThisWorkbook”是代码运行的书,而不是(必然)当时的活动工作簿。)

将DataBook引用更改为活动工作簿,或者激活ThisWorkbook(取决于您的意图)以确保工作表与您所指的工作簿相同。

答案 2 :(得分:0)

感谢您的帮助!当我使用不同的方法来引用工作簿时,一切都已经解决了。它看起来很奇怪,但似乎工作正常:

Set wsNewSheet = Workbooks.Open("C:\Minestar_exports\" & Pts & "")
Set wsO_Sheet = Workbooks.Open("" & OldBookName & "")

我认为如果我只对默认工作表感兴趣,我就不必参考特定的工作表,现在效果很好!