VBA usedrange运行时错误438对象不支持这个属性或方法

我正在处理一个涉及usedrange的macros。 基本上我的子试图打开一个带有opentext的文本文件,并复制文本文件中的公式,并粘贴到我的目标工作簿的工作表“SOE摘要”。 但是,当我尝试将我的工作表“SOE摘要”的公式设置为等于文本文件中的公式时,会发生运行时错误438。 任何有识之士将不胜感激。

Sub Sample() Application.ScreenUpdating = False Dim WB As Workbook Set WB = ActiveWorkbook Dim fileToOpen As Variant 'Txt file that contains formulas Dim fileName As String _ 'Name of the temporary workbook that contains formulas from fileToOpen Dim sheetName As String _ 'Name of the worksheet of the temporary workbook that contains formulas from fileToOpen fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") _ 'User selects the txt file that contains formulas If fileToOpen <> False Then 'Make sure the user selects a txt file Workbooks.OpenText fileName:=fileToOpen, _ DataType:=xlDelimited, Tab:=True 'Transport formulas into a temporary workbook End If fileName = Mid(fileToOpen, InStrRev(fileToOpen, "\") + 1) _ 'Name of the temporary workbook sheetName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) _ 'Name of the temporary worksheet Application.DisplayAlerts = False 'Disable any popup windows WB.Sheets("SOE Summary").UsedRange.Value = Workbooks(fileName).Sheets(sheetName).UsedRange.Formula_ '[ERROR 438 OCCURRED] Paste formulas into "SOE Summary" worksheet Application.DisplayAlerts = True 'Enable popup windows after the previous line of code Workbooks(fileName).Close savechanges:=False 'Close the temporary workbook and discard any changes WB.Sheets("SOE Summary").UsedRange.Value = WB.Sheets("SOE Summary").UsedRange.Value _ 'Replace all formulas in the "SOE Summary" worksheet with values Application.ScreenUpdating = True End Sub 

在VBA中,一条指令可以用新行结束,也可以用一个指令分隔符(即冒号: – 不是你通常需要在单一行上指定多条指令)在单行上执行多条指令。

VBA中的一行代码可以被看作逻辑代码行物理代码行 。 当代码行太长/太长时,可以使用行连续标记(一个空格,后跟一个下划线_ ),在代码的下一行代码中继续一行逻辑代码。

正如已经指出的那样 ,大部分这些行不需要继续 – 事实上,你的代码只能编译,因为继续的行会“继续”到一个注释中,这隐含地终止了这个指令:

 fileName = Mid(fileToOpen, InStrRev(fileToOpen, "\") + 1) _ 'Name of the temporary workbook sheetName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) _ 

删除这些注释,您的代码停止编译:

 fileName = Mid(fileToOpen, InStrRev(fileToOpen, "\") + 1) _ sheetName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) _ 

…因为在同一指令中不能有两个任务。

所以是的,删除多余的线路延续,并解决问题。


你得到的具体错误是相当混乱的,因为UsedRange返回一个实际的Range对象引用,这给你所有权利期待一个编译时错误,而不是运行时 。 这里指的是Range COM接口是可扩展的 – 也就是说,虽然大多数成员调用在编译时是早期绑定/parsing的,但是VBA可以让你在Range对象上进行任何时髦的成员调用,并将validation延迟到运行时。 certificate:

 Sub Foo() Dim bar As Range bar.Whatever = 42 ' happily compiles End Sub 

这意味着在执行Range成员调用时,您需要特别小心input错误,因为即使Option Explicit也不会帮助您 – 换句话说,每次引用已知成员时都使用IntelliSense /自动完成,以避免出现此类错误。

因为在VBA中,标识符可以很好地以下划线(例如Formula_ )结束,所以只有在运行时,VBA才能查询Range接口并发现没有像Formula_这样的事情,并且出现错误438。

一些东西:

  • _用于指示单行语句将在下一行继续。 这是很less需要的,你会在下面看到,实际上在你的子程序中没有必要
  • 在这种情况下, 您的实际问题是您的错误行上有UsedRange.Formula_而不是UsedRange.Formula _ 。 注意缺less的空间
  • 你的评论有点混乱你的代码。 尝试仅对解释代码的不太明显特征的事情发表评论。 您的variables名称很好,因此您不需要评论该fileName就是'Name of the temporary workbook ,例如。

 Sub Sample() Application.ScreenUpdating = False Dim WB As Workbook Set WB = ActiveWorkbook Dim fileToOpen As Variant Dim fileName As String, sheetName As String fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") If fileToOpen <> False Then Workbooks.OpenText fileName:=fileToOpen, DataType:=xlDelimited, Tab:=True End If fileName = Mid(fileToOpen, InStrRev(fileToOpen, "\") + 1) sheetName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) Application.DisplayAlerts = False WB.Sheets("SOE Summary").UsedRange.Value = Workbooks(fileName).Sheets(sheetName).UsedRange.Formula Application.DisplayAlerts = True Workbooks(fileName).Close savechanges:=False WB.Sheets("SOE Summary").UsedRange.Value = WB.Sheets("SOE Summary").UsedRange.Value Application.ScreenUpdating = True End Sub