我无法弄清楚为什么这给了我一个运行时错误9(是的,文件存在和加载)

Sub CopyColumnWidths(FileName1, SheetName1, FileName2, SheetName2) ColumnNumber = 1 Check = WorksheetFunction.CountA(Workbooks(FileName1).Sheets(SheetName1).Columns(ColumnNumber)) Do While Check > 0 ColumnLetter = LastColumnLetter(ColumnNumber) Workbooks(FileName2).Sheets(SheetName2).Columns(ColumnNumber).ColumnWidth = Workbooks(FileName1).Sheets(SheetName1).Columns(ColumnNumber).ColumnWidth ColumnNumber = ColumnNumber + 1 Check = WorksheetFunction.CountA(Workbooks(FileName1).Sheets(SheetName1).Range(ColumnLetter & ":" & ColumnLetter)) Loop End Sub 

好吧,这是我的代码。 我已经validation了所有的文件名和表名都存在,并且在Excel的同一个实例中占了。 我检查了拼写错误,多余的字符和“隐形”字符,而且都不存在。

我试过,为了排除故障的目的,把工作簿(FileName1).Activate,它也不会工作。 在不同的代码中,特定的文件是隐藏的,但是在执行代码时,工作簿是可见的并且存在。

对于我的生活,我不知道为什么这是打破,可以用一只手。

这是在Excel 2013上运行的,如果是64位的话。

– – – – 更多信息

FileName1 is“Original Datasheet.xlsx”FileName2 is“Split Datasheet.xlsx”SheetName1(and SheetName2)are“1a。Contents”

当我尝试激活FileName2时,它工作。 当我尝试激活FileName1时,它失败。 工作表名称无关紧要,它不会“看到”FileName1,即使它存在,我也可以在“切换Windows”下拉列表中select它。

对于那些第一次没有阅读标题的人再次重复:是的,所有文件都加载在Excel的同一个实例中。 所有文件都存在。

我没有你的答案,但运行时错误9听起来很像这些值其中之一是不是你所想的那样 – 并且你有代码,很难确切地知道它在哪里爆炸。

开始转向这个:

 Sub CopyColumnWidths(FileName1, SheetName1, FileName2, SheetName2) 

(假设程序是从同一个模块中调用的 – 如果它是从另一个模块调用的,则使其成为Public Sub ):

 Private Sub CopyColumnWidths(ByVal FileName1 As String, ByVal SheetName1 As String, ByVal FileName2 As String, ByVal SheetName2 As String) 

更改签名以使用通过值传递 String参数不应该以任何方式破坏您的代码,但使事情更加明确,从而提高可读性,使您的意图更清晰。

继续。

 ColumnNumber = 1 

那来自哪里? 申报。 Stick Option Explicit位于模块顶部,然后声明每个variables,直到代码再次编译(Option Explicit将使VBA拒绝编译使用未声明的variables的代码)。

 Dim ColumnNumber As Long ColumnNumber = 1 

现在我们知道ColumnNumberCheck是在同一个范围内声明的局部variables(对吧?),我们继续:

 Dim Check As Long Check = WorksheetFunction.CountA(Workbooks(FileName1).Sheets(SheetName1).Columns(ColumnNumber)) 

这条线做了太多的事情:我们不知道Workbooks(FileName1)是否成功,我们不知道它的Sheets(SheetName1)是否成功 – 但我们不pipe它是否是Columns成员,假设蓝天和阳光。

不要假设蓝天和阳光。

分解。

 Dim sourceBook As Workbook Set sourceBook = Workbooks(FileName1) Dim sourceSheet As Worksheet Set sourceSheet = sourceBook.Worksheets(SheetName1) Check = WorksheetFunction.CountA(sourceSheet.Columns(ColumnNumber)) 

如果你的代码运行到了这一点,你的问题就解决了一半 – 你在这里也遇到了同样的问题,而且你再次获取相同的WorkbookWorksheet对象而是分解它们 ,分配本地对象variables, 并重用它们

 Workbooks(FileName2).Sheets(SheetName2).Columns(ColumnNumber).ColumnWidth = Workbooks(FileName1).Sheets(SheetName1).Columns(ColumnNumber).ColumnWidth 
 Dim destinationBook As Workbook Set destinationBook = Workbooks(FileName2) Dim destinationSheet As Worksheet Set destinationSheet = destinationBook(SheetName2) destinationSheet.Columns(ColumnNumber).ColumnWidth = sourceSheet.Columns(ColumnNumber).ColumnWidth ColumnNumber = ColumnNumber + 1 Check = WorksheetFunction.CountA(sourceSheet.Range(ColumnLetter & ":" & ColumnLetter)) 

逐行执行( F8 )这段代码,就可以知道哪个指令正在被炸毁。 把所有东西都压缩成尽可能less的代码行,并假设 2,3,4个成员访问会“正常工作” ,这使得几乎不可能知道这一点。


先前的代码隐藏窗口的FIleName1但后来取消隐藏它可能会搞砸了吗? 我必须这样做,因为Excel不会把数据放在错误的工作簿上,除非我把它藏起来

这听起来像你有代码(其他地方),隐式地显式或(更可能?)closuresActiveSheet ,或ActiveWorkbook

如果您发现自己使用不合格的RangeCellsRowsColumnsNames调用,则隐式引用活动工作表。 将它们replace为显式限定的成员调用,使用您要引用的工作表对象。 没有魔法,Excel(实际上VBA)不能猜测你的意图; 它不会“把数据放在错误的工作簿上” – 它把数据放在你告诉它放置的地方。 隐藏工作簿只是一个非常糟糕的解决方法:你还没有明确地告诉它你的意思。

我一直在看这个太久了。

FileName1是“Orignial Datasheet.xlsx”而不是“Original Datasheet.xlsx”

这就是为什么它没有连接。 我的错误,抱歉打扰所有人。