所以基本上我可能有一个蹩脚的问题。我现在已经使用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")
这里有什么问题的线索?再次感谢!
答案 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 & "")
我认为如果我只对默认工作表感兴趣,我就不必参考特定的工作表,现在效果很好!