【问题标题】:Error when calling sub Run-Time Error '424': Object Required调用子运行时错误“424”时出错:需要对象
【发布时间】:2020-06-25 07:06:26
【问题描述】:

大图

  1. 浏览一个列表并为列表中的每个项目创建一个选项卡(工作)
  2. 在列表中创建一个超链接,链接到相关工作表 (Working)
  3. 在每个工作表上创建基本标题信息并超链接回索引表(工作)
  4. 为索引表中相应单元格中列出的每个参考文献插入一个按钮,并超链接到该 pdf、doc 或 docx 文件(不工作,正在进行中)

当前问题

当调用将插入按钮的 sub 时,我收到 Object Required 错误(见最后的图片)。

主要部分代码如下:

Sub CreateTabs()

Dim ws As Worksheet
Dim NameArray As Variant
Dim LastRow As Long
Dim x As Long
Dim y As Long
Dim z As Long
Dim ReferenceCount As Long
Dim RefSplit() As Variant

    LastRow = FindLastRow
    Set ws = ThisWorkbook.Sheets(1)
    NameArray = ws.Range(ws.Cells(2, 1), ws.Cells(LastRow, 1)).Value
    For x = LBound(NameArray) To UBound(NameArray)
        ThisWorkbook.Sheets.Add(after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = NameArray(x, 1)
        'ws.Hyperlinks.Add ws.Cells(x + 1, 1), "", ThisWorkbook.Sheets(NameArray(x, 1)).Cells(1, 1).Address(External:=True), NameArray(x, 1), NameArray(x, 1)
        With ThisWorkbook.Sheets(NameArray(x, 1))
            ws.Hyperlinks.Add ws.Cells(x + 1, 1), "", .Cells(1, 1).Address(External:=True), .Name, .Name
            .Hyperlinks.Add .Cells(1, 1), "", ws.Cells(1, 1).Address(External:=True), "Item List", "ITEM LIST"
            .Cells(2, 1) = "Item"
            .Cells(3, 1) = "Description"
            .Cells(4, 1) = "U.O.M."
            .Cells(6, 1) = "Specifications"
            .Cells(2, 2).Formula = "=RIGHT(CELL(""filename"",$B$2),LEN(CELL(""filename"",$B$2))-FIND(""]"",CELL(""filename"",$B$2)))"
            .Cells(3, 2).Formula = "=VLOOKUP($B$2,Sheet1!$A$2:$D$" & LastRow & ",2,0)"
            .Cells(4, 2).Formula = "=VLOOKUP($B$2,Sheet1!$A$2:$D$" & LastRow & ",4,0)"
            
            ReferenceCount = Num_Characters_In_String(ws.Cells(x + 1, 3).Value, ", ") + 1
            ReDim RefSplit(1 To ReferenceCount,1)
            If ReferenceCount > 1 Then
                RefSplit = ReferenceSplit(ws.Cells(x + 1, 3).Value)
            Else
                RefSplit(1,1) = ws.Cells(x + 1, 3).Value
            End If
            
            z = 1
            
            For y = 1 To ReferenceCount
                If y > z * 5 Then z = z + 1
'*************************************************************
                Call Insertbutton(z, y - (z - 1) * 5, RefSplit(y, 1).Value, ThisWorkbook.Sheets(NameArray(x, 1)))
'*************************************************************
            Next y
                
        End With
    Next x
End Sub

被调用的子现在看起来如下:

Sub Insertbutton(btnrow As Long, btncol As Long, btnName As String, ws As Worksheet)

Dim btn As Button
Dim rng As Range

    Application.ScreenUpdating = False
    ws.Buttons.Delete 'probably do not need as it is fresh sheet

    Set rng = ws.Cells(btnrow + 6, btncol + 1)
    Set btn = ws.Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    With btn
        If Left(btnName, 1) = "F" Then
            If Num_Characters_In_String(btnName, "-") = 2 Then
                .OnAction = "P:\2019\1234-name space\08. Working\Specifications\Section F" & btnName & "*.doc*"
            Else
                .OnAction = "P:\2019\1234-name space\10. Construction\01. Tender\F\" & btnName & ".pdf"
            End If
        Else
            .OnAction = "P:\2019\1234-name space\10. Construction\01. Tender\OPSS\OPSS*" & btnName & "*.pdf"
        End If
        .Caption = btnName
        .Name = btnName
    End With
    Application.ScreenUpdating = True

End Sub

问题

丢失的对象是什么?我在通话中做错了什么?

(我预见到链接到文件时会出现一些问题,但我在调试中还没有到那个地步,这将是一个不同的问题。可以这么说,尽量不要弄脏水)

我确实阅读了this question,所以我相信调用 () 的格式是正确的,但我可能是错误的

【问题讨论】:

  • 如果程序调用发生崩溃,罪魁祸首应该是ThisWorkbook.Sheets(NameArray(x, 1))。在调用之前将其分配给一个变量,并查看工作表是否实际存在。其他 3 个参数不应该导致您遇到的错误,但我会将它们传递给 ByVal 而不是 ByRef(默认值,因为您什么也没提及)。
  • 如果崩溃发生在通话之后,请查看ws.Buttons.Delete。如果您删除的按钮不存在,这肯定会导致您遇到的错误。将命令夹在On Error Resume NextOn Error GoTo 0 之间。
  • 请问是哪一行代码导致了错误?是在函数Insertbutton的头部还是里面?
  • 如果您实际上不喜欢在工作表上使用按钮(我不喜欢),请考虑一下 - 您可以添加超链接而不是按钮?无论如何,您都在使用按钮作为链接,那么为什么不坚持使用超链接呢?如果您需要执行代码,请使用 worksheet_followhyperlink 事件。
  • 啊,我明白了,这很有意义。您总是可以使用通用超链接作为按钮,然后使用followHyperlink 事件来执行指向正确链接等的代码。它实际上是一个按钮,我只是讨厌使用实际的命令按钮,特别是动态创建它们, 在工作表上 - 他们很容易调整问题等。

标签: excel vba


【解决方案1】:

RefSplit(y, 1).Value 会导致错误。 RefSplit(y, 1) 是正确的。

不要将 .value 用于数组。因为是用于范围对象,所以会发生对象错误。

Call Insertbutton(z, y - (z - 1) * 5, RefSplit(y, 1).Value, ThisWorkbook.Sheets(NameArray(x, 1)))

但是,还有一个错误,无法匹配参数的类型。应该使用字符串变量。

Dim myString As String
myString = RefSplit(y, 1)
Call Insertbutton(Z, y - (Z - 1) * 5, myString, ThisWorkbook.Sheets(NameArray(x, 1)))

【讨论】:

  • 那么如何将包含字符串的数组条目转换为字符串?
  • 我删除了 .value,并将子标题更改为 byval,现在它似乎可以工作了
  • @ForwardEd 您可以使用CStr(myArray(y,x)) 将数组值转换为字符串
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多