2016-06-23 100 views
1

我正在使用创建并填充一系列“路线”工作簿并在此过程中填充主“摘要”工作簿的漫长过程。Excel VBA-未将对象引用设置为对象的实例

简而言之,只要尝试在摘要中使用相关工作表,就会立即在从路由工作簿导入数据时立即发生错误。

wshRoute.Cells(2, 3).Value = RNum 
:在以下两行中的一个发生

 ' Get Route Number 
    RNum = wshCtrl.Cells(2, 2 + i).Value ' Number for routes being processed (blank if not processed) 
    RawRNum = wshCtrl.Cells(4, 2 + i).Value ' Raw Number 
    ' Get Route Direction 
    RDir = wshCtrl.Cells(9, 2 + i).Value 
    ' Get Name of Worksheet 
    NamewshRoute = "Route " & RawRNum & " - " & RDir 
    ' Check if Route Worksheet exists 
    Set wshRoute = Nothing 
    On Error Resume Next 
    Set wshRoute = Sheets(NamewshRoute) 
    On Error GoTo 0 

    ' If Route Worksheet doesn't exist and Route being processed 
    If wshRoute Is Nothing And RNum <> "" Then 
     ' Create Route Worksheet 
     ' Copy Template 
     wshTemplate.Copy After:=wshTemplate 
     ' Rename Copied Template 
     Worksheets("Template (2)").Name = NamewshRoute 
     ' Set as Route Worksheet 
     Set wshRoute = Sheets(NamewshRoute) 
     ' Enter Route Number and Direction 
     wshRoute.Cells(2, 3).Value = RNum 
     wshRoute.Cells(2, 4).Value = RDir 

    ' If Route Worksheet doesn't exist and Route isn't being processes 
    ElseIf wshRoute Is Nothing Then 
     ' Do Nothing 

    ' Else Route Worksheet already exists and Route being processed 
    Else 

     ' Update Progress Bar 
     Percent = j/(NumRoutes + 0.5) - (1/(NumRoutes + 1) * 8/8) 
     RefreshStatusBar Percent, "Processing " & NamewshRoute, "Initialising Route" 

     ' Update Date 
     wshRoute.Range("AW9").Value = Month & Year 

错误:

虽然引用整个代码将是不切实际的,我已经从那里我觉得是“相关”在这里复制

wshRoute.Range("AW9").Value = Month & Year 

取决于工作表是否存在。

注意的是:

  1. Explicit选项是存在于代码的顶部。
  2. 据我所知,所有变量都被定义和适当地设置。
  3. 我已经使用了调试过程,并使用“添加监视”已确认wshRoute设置得当,RNum,Month和Year也是如此。
  4. wshRoute.Cells(2,3).Value返回正确的值,wshRoute.Range(“AW9”)。Value也是如此。
  5. 我可以看到的唯一不一致是,当我进一步查看wshRoute的属性时,属性'OnCalculate'到'OnSheetDeactivate'都具有值。不确定这是否相关。

此代码工作正常(我已使用大约一年),直到我在开始时添加了另一个宏。新的宏将打开一个不同的工作簿并创建“数据”文件。它不以任何方式与“摘要”工作簿交互。如果我运行的代码没有额外的新宏,它再次运行良好。

任何建议请解雇他们。这对我来说是重中之重,所以我会尽快进行测试。

谢谢,卡梅伦

+1

'打开一个不同的工作簿'时间来限定工作簿的工作表:'Set wshRoute = Sheets(NamewshRoute)'。 – findwindow

+0

等一下,有什么可疑的。你在'If wshRoute Is Nothing'之后立即设置了'wshRoute'。 – findwindow

+0

使用'Set wshRoute = WorkSheets(NamewshRoute)'而不是'Set wshRoute = Sheets(NamewshRoute)'。 – PaichengWu

回答

-1

有点来回后...感谢所有谁贡献。

问题是我试着将Application.DisplayAlerts = False前行导致错误修改保护片

,我发现这一点。发生这种情况时,原始'未将对象引用设置为对象'错误的实例替换为'您试图更改的单元格或图表受保护,因此为只读。错误。

我修正了这个问题,确保所有的工作表都在宏运行时不受保护。

在旁注中 - 我被抓出来不符合我的工作簿。

再次感谢您的所有建议。

+0

我仍然认为你的真正问题被一个加载项所掩盖:“正常”(不禁用事件),你会看到有关受保护工作表的错误消息,但加载项首先触发该错误并给你取而代之的是(非VBA)“对象引用”消息。 –

2

尝试增加这些调试语句,看看你会得到什么:

Set wshRoute = Sheets(NamewshRoute) 

Debug.Print wshRoute Is Nothing 
Debug.Print wshRoute.Name & " is in workbook " & wshRoute.Parent.Name 
Debug.Print wshRoute.Cells(2, 3) Is Nothing 
Debug.Print "RNum is type " & TypeName(RNum) 

wshRoute.Cells(2, 3).Value = RNum 
+0

你好。结果:** Debug.Print wshRoute Nothing ** =“False” ** Debug.Print wshRoute.Name&“is in workbook”&wshRoute.Parent.Name ** =“路由1 - AtoB在工作簿中2016年2月PT Summary.xlsm“ ** Debug.Print wshRoute.Cells(2,3)Nothing ** =”False“ **调试。打印“RNum是类型”和类型名称(RNum)** =“RNum是类型字符串” –

+0

而且在最后一行仍然出现错误?尝试在该行之前添加'Application.EnableEvents = False'(之后设置为True),以防万一由更新工作表而触发的事件触发事件。 –

+0

啊哈!我这样做,并得到一个新的错误,告诉我该工作表已被保护或只读。虽然我不明白为什么,因为在宏的那个阶段,所有工作表都没有保护,所以我可以修改它们......我得到的错误是:“运行时错误'1004':您的单元格或图表试图改变是受保护的,因此是只读的。要修改受保护的单元格...“ –

相关问题