我无法弄清楚为什么这给了我一个运行时错误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
现在我们知道ColumnNumber
和Check
是在同一个范围内声明的局部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))
如果你的代码运行到了这一点,你的问题就解决了一半 – 你在这里也遇到了同样的问题,而且你再次获取相同的Workbook
和Worksheet
对象,而是分解它们 ,分配本地对象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
。
如果您发现自己使用不合格的Range
, Cells
, Rows
, Columns
或Names
调用,则隐式引用活动工作表。 将它们replace为显式限定的成员调用,使用您要引用的工作表对象。 没有魔法,Excel(实际上VBA)不能猜测你的意图; 它不会“把数据放在错误的工作簿上” – 它把数据放在你告诉它放置的地方。 隐藏工作簿只是一个非常糟糕的解决方法:你还没有明确地告诉它你的意思。
我一直在看这个太久了。
FileName1是“Orignial Datasheet.xlsx”而不是“Original Datasheet.xlsx”
这就是为什么它没有连接。 我的错误,抱歉打扰所有人。