【问题标题】:hyperlinks(1).address only returning a partial addresshyperlinks(1).address 仅返回部分地址
【发布时间】:2017-12-27 15:20:25
【问题描述】:

我正在编写以下代码,它将根据单击链接时链接是否有效来重新格式化包含链接的单元格:

Private Sub worksheet_followhyperlink(ByVal HL As HYPERLINK)
Dim linkReq As Object
Dim linkStatus As Integer

Application.ScreenUpdating = False
On Error GoTo linkError
Set linkReq = New MSXML2.XMLHTTP60
With linkReq
    .Open "GET", HL.address, False
    .Send
End With
linkStatus = linkReq.Status

If linkStatus = 404 Then HL.Parent.Interior.Color = rgbPink
If linkStatus <> 404 Then HL.Parent.Interior.Pattern = xlNone

If HL.Parent.Interior.Pattern = xlNone Then GoTo exitSub
Application.ScreenUpdating = True
MsgBox("Link is broken")

exitSub:
Application.ScreenUpdating = True
Exit Sub

linkError:
linkStatus = 404
Resume Next
End Sub

代码昨天运行良好!但是现在,它会将所有内容都返回为“404”并将单元格标记为粉红色,即使链接有效。调试显示 HL.address 的值是“folder/Document.pdf”而不是“https://website/folder/Document.pdf”。此 Excel 文档通过共享点托管在“https://website”上。

由于截断,代码无法正常工作。

有没有办法从 excel 超链接中提取完整的 url,而不用截断,而不管 url 的大小?

【问题讨论】:

  • 重新添加超链接可以解决问题。我目前的解决方法是创建一个重新加载所有超链接的 workbook_open 宏...
  • 此解决方法已停止工作。在某些情况下,超链接增长得足够长,以至于即使是新填充的超链接也会返回格式为“../../folder/Document.pdf”的地址
  • 我当前的解决方法是使用 UDF 将完整的超链接存储为单元格中的字符串,并使用它在工作簿打开时重新应用超链接以及在错误检查期间作为参考。这带来了单独的优化问题,这些问题已得到解决。不能使用=HYPERLINK函数,因为点击这样的超链接不会触发followHyperlink事件。
  • CurDir() 的值有什么用?
  • Debug.Print CurDir() = C:\Users\matt2103\Desktop

标签: excel sharepoint hyperlink vba


【解决方案1】:

似乎 Excel 正在将您的超链接地址从绝对地址更改为相对地址。

您可以尝试通过更改所谓的“超链接库”来强制使用绝对地址。为此,请转到:文件>信息>显示所有属性>超链接基础(在屏幕右侧)并将其更改为“x”。

来自 Microsoft 支持网站的参考:

https://support.microsoft.com/en-us/help/903163/how-to-create-absolute-hyperlinks-and-relative-hyperlinks-in-word-docu

(文章介绍了 MS Word 的解决方案,但它也适用于 MS Excel)

希望对您有所帮助。

【讨论】:

  • 这似乎有效!此外,它还让我了解了更多 MS Office 的内部工作原理!谢谢,欢迎来到 stackoverflow :) 我将在 24 小时内再提出问题,以防万一有更优雅的答案(不太可能,但你永远不知道),然后你就会得到赏金。再次感谢!
  • 我很高兴它对你有用!我长期以来一直是stackoverflow 潜伏者,并决定是时候创建一个帐户并尝试解决一些有趣的问题了:)
  • 除了 Tom 的回答之外,您可以使用 ActiveWorkbook.BuiltinDocumentProperties("Hyperlink Base") 以编程方式读取/写入超链接库 - (可以使用其他方法来引用您的工作簿 ;-)
  • 这对我在 excel 中不起作用。我做了一些进一步的挖掘,发现了有帮助的 Subaddress 属性。
【解决方案2】:

excel 中的范围对象有第二个属性“子地址”。 使用子地址功能获取地址的其余部分,如下所示

range.Hyperlinks(1).Address + range.Hyperlinks(1).SubAddress

就我而言,我必须在地址和子地址之间添加额外的字符。请务必检查如何使用地址和子地址形成完整的 URL

【讨论】:

  • 这个答案对我解决另一个问题非常有帮助。我确实想指出,Excel 似乎使用“#”字符作为子地址中的分隔符,并且在 .Address 或 .SubAddress 中都不包含该字符,因此如果您想要完整地址,它应该是 @987654322 @ ...这是假设它没有使用其他分隔符。我不知道,因为 MS 文档没有谈论它。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多