工作簿VBA的每个方法/属性中的下标超出范围错误消息

工作簿VBA的每个方法/属性中的下标超出范围错误消息,vba,Vba,我在工作簿的每个属性/方法中都收到“下标超出范围”错误消息。下面是代码 Sub comparator() Dim CFileName, DFileName, FileName1, FileName2 As String Dim sh As Worksheet, wb As Workbook CFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to b

我在工作簿的每个属性/方法中都收到“下标超出范围”错误消息。下面是代码

Sub comparator()

Dim CFileName, DFileName, FileName1, FileName2 As String
Dim sh As Worksheet, wb As Workbook

CFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName1 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

DFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName2 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

Workbooks("FileName1").Worksheets.Copy After:=Workbooks("FileName2").Worksheets(1)

End sub
下面的代码行也给出了相同的错误。所以它看起来像是一个下标“FileName”的问题。我花了将近12年的时间才发现这个问题,但现在已经受够了

Msgbox Workbooks("FileName1").Worksheets.Count


对于所有这些小错误,很抱歉,这是我在浏览器中键入的代码。下面是我的Excel VBA编辑器中的代码

Sub comparator()

Dim PreFileName As String Dim CFileName As String Dim DFileName As String Dim FileName1 As String Dim FileName2 As String Dim XLApp, XLDoc, DestObject As Object

Set XLApp = CreateObject("excel.Application")

CFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed") Set XLDoc = XLApp.Workbooks.Open(CFileName) FileName1 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99) XLApp.Visible = True

DFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed") Set XLDoc = XLApp.Workbooks.Open(DFileName) FileName2 = Mid(DFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99) XLApp.Visible = True

Workbooks("FileName1").Worksheets.Copy After:=Workbooks("FileName2").Worksheets(1)

End Sub
99是个问题。每当
CFileName
短于99个字符时,此操作将失败,并出现下标超出范围错误

为什么不直接删除那个可选参数呢

InStrRev(CFileName, Application.PathSeparator) + 1)

根据我评论中的注释,必须删除引号才能使用变量

Sub comparator()
On Error GoTo errHandler
Dim CFileName, DFileName, FileName1, FileName2 As String
Dim sh As Worksheet, wb As Workbook

CFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName1 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

DFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName2 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

Workbooks(FileName1).Worksheets.Copy After:=Workbooks(FileName2).Worksheets(1)

errHandler:
If Err.Number <> 0 Then
    MsgBox Err.Description
End If

End Sub
子比较器()
关于错误转到错误处理程序
Dim CFileName、DFileName、FileName1、FileName2作为字符串
将sh作为工作表,wb作为工作簿
CFileName=Application.GetOpenFilename(文件过滤器:=“excel文件,*.xlsx”,标题:=“选择要处理的文件”)
FileName1=Mid(CFileName,InStrRev(CFileName,Application.PathSeparator)+1,99)
DFileName=Application.GetOpenFilename(文件过滤器:=“excel文件,*.xlsx”,标题:=“选择要处理的文件”)
FileName2=Mid(CFileName,InStrRev(CFileName,Application.PathSeparator)+1,99)
工作簿(文件名1).工作表.Copy After:=工作簿(文件名2).工作表(1)
错误处理程序:
如果错误号为0,则
MsgBox错误说明
如果结束
端接头

您意识到
CFileName
DFileName
FileName1
都是
变量,对吗?只有
FileName2
被声明为
String
——虽然与您的错误无关,但我只是想指出它。我已经做了更改,并将上面提到的所有变量声明为String。但由于这与我的问题无关,因此错误仍然存在。请删除引号,您可能没有名为FileName1的工作簿。我猜您正在尝试使用变量FileName1,所以当您在其周围加上引号时,它现在只会变成一个值为FileName1的字符串。对filename2执行同样的操作。对于所有这些小错误,请注意,这是我在浏览器中键入的代码。下面是我的Excel VBA编辑器中的代码。“不工作”是相当模糊的。您是否尝试过设置断点并单步执行代码?有几个地方你的代码可能会因为你指定的错误而崩溃。我做了所有的研究,但没有发现问题。问题仅在工作手册(“下标”)上发布。我尝试了Msgbox工作簿(“FileName1”).Worksheets.Count的一行代码,这也给出了相同的错误消息。感谢大家的快速回复。但是这个问题仍然没有解决。@Sorceri的回答确实解决了
MsgBox工作簿(“FileName1”)
问题-除非工作簿实际上被称为“FileName1”,否则它会爆炸。此外,您的代码没有打开提示文件名的工作簿。。。分配一个
Workbook
对象变量,类似于
Set myworkbook=Workbooks。打开(FileName1)
,然后只访问该对象的工作表集合。@akashbondre您需要提供一些更详细的信息,否则问题仍然没有解决或无法解决。你是不是有更多的错误,同样的错误,什么是不起作用的?!?!?!帮助我们,帮助你!
Sub comparator()
On Error GoTo errHandler
Dim CFileName, DFileName, FileName1, FileName2 As String
Dim sh As Worksheet, wb As Workbook

CFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName1 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

DFileName = Application.GetOpenFilename(Filefilter:="excel Files,*.xlsx", Title:="Select the File to be processed")
FileName2 = Mid(CFileName, InStrRev(CFileName, Application.PathSeparator) + 1, 99)

Workbooks(FileName1).Worksheets.Copy After:=Workbooks(FileName2).Worksheets(1)

errHandler:
If Err.Number <> 0 Then
    MsgBox Err.Description
End If

End Sub