0

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

我已经处理了编译错误,但现在当我尝试编译项目时,我得到一个“运行时错误 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

更新

我已经弄清楚为什么会出现此错误-我指的是具有字符串类型变量的工作簿和工作表,因此我通过以下方式更改了错误行:

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

不,我没有收到错误 9,但我收到错误 13:如果出现以下行,则键入不匹配:

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

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

4

3 回答 3

1

NewBook已经是一个工作簿对象,因此执行此任务的正确方法是Set NewSheet = NewBook.Sheets("Sheet1")

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

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

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

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

NOTE Name也是一个半保留词,因为它是 Excel 中的一种对象。虽然这可能不会给您带来任何错误,但它可能会令人困惑,并且我个人会尽量避免使用与对象相同或非常相似的变量名。

于 2013-09-28T03:54:41.210 回答
0

回应您在大卫回答下的评论......

这个:

DataBook = ThisWorkbook.Name
DataSheet = ActiveSheet.Name

与此结合使用时具有潜在危险:

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

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

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

将 DataBook 引用更改为 Active 工作簿,或激活 ThisWorkbook(取决于您的意图)以确保工作表位于您所引用的同一工作簿中。

于 2013-09-28T11:47:28.283 回答
0

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

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

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

于 2013-10-09T09:25:16.860 回答