【发布时间】:2020-06-25 07:06:26
【问题描述】:
大图
- 浏览一个列表并为列表中的每个项目创建一个选项卡(工作)
- 在列表中创建一个超链接,链接到相关工作表 (Working)
- 在每个工作表上创建基本标题信息并超链接回索引表(工作)
- 为索引表中相应单元格中列出的每个参考文献插入一个按钮,并超链接到该 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 Next和On Error GoTo 0之间。 -
请问是哪一行代码导致了错误?是在函数
Insertbutton的头部还是里面? -
如果您实际上不喜欢在工作表上使用按钮(我不喜欢),请考虑一下 - 您可以添加超链接而不是按钮?无论如何,您都在使用按钮作为链接,那么为什么不坚持使用超链接呢?如果您需要执行代码,请使用 worksheet_followhyperlink 事件。
-
啊,我明白了,这很有意义。您总是可以使用通用超链接作为按钮,然后使用
followHyperlink事件来执行指向正确链接等的代码。它实际上是一个按钮,我只是讨厌使用实际的命令按钮,特别是动态创建它们, 在工作表上 - 他们很容易调整问题等。