【问题标题】:Hyperlink to an Excel Cell指向 Excel 单元格的超链接
【发布时间】:2011-01-17 10:45:45
【问题描述】:

快速总结

如何在 Excel 中创建可以在 Firefox 中工作的特定单元格的超链接,或者在 javascript 中获得相同的结果?

详细说明

我有一个 Excel 电子表格,用户可以在其中输入数据。然后使用该电子表格在 SVG 中生成一些图表。这些图表显示在 Firefox 中(尽管如果其他方法效果更好,可以将其更改为其他东西)。我希望 SVG 图表中的对象具有指向生成这些对象的 excel 单元格的超链接,以便轻松更改图表背后的数据。

我已经看到有关超链接的建议,例如 file:///C:/path/to/workbook.xls#Sheet1!A57 应该可以解决问题,但这仅适用于 IE 或 Office 应用程序。尝试在 Firefox 中或从“开始”->“运行”中使用这种超链接会在上次关闭工作簿时在最后一个活动单元格处打开工作簿。

我会非常高兴只使用 IE,当然 IE 不支持 SVG,至少不支持开箱即用。

那么有没有办法形成一个超链接(或者一些 javascript)来打开一个具有特定工作表和活动单元格的 excel 工作簿?

【问题讨论】:

  • 我不支持 SVG,但它支持 SVG 的残缺的继父,VML(矢量标记语言)。您可以绘制矢量,并且有几个用于绘制图表和图形的库。
  • 嗯。生成图表的工具甚至支持 VML - 但尝试从中单击链接会导致 IE 相当可靠地崩溃。
  • 您的用户可以运行 Excel 宏吗?您可以在用户系统上安装软件/ Excel 插件吗?
  • 是的 - 有问题的工作簿中嵌入了一个文档级插件。所以添加更多不会太重。你是说有一个用于 Excel 的 SVG-viewer 插件吗?

标签: html excel hyperlink ms-office


【解决方案1】:

这就是你可以解决这个问题的方法。

在表单中嵌入浏览器对象并导航到生成的图表文件。

由于这是您的浏览器对象,您可以捕获用户单击 SVG 超链接时生成的导航事件。

解析导航目标以获取单元格引用,例如"Sheet1!A57" 然后调用 Application.Goto "Sheet1!A57"。

示例:将 WebBrowser 和 CommandButton 添加到用户表单,然后将此代码粘贴到后面。

Private Sub UserForm_Initialize()
    Me.WebBrowser1.Navigate2 "file:///C:\Test.svg"
End Sub

Private Sub CommandButton1_Click()
    Me.WebBrowser1.Navigate2 "workbook:Sheet1!A57"
End Sub

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
    Dim pos As Integer
    pos = InStr(1, URL, "workbook:", vbTextCompare)
    If 1 <= pos Then
        Dim cref As String
        cref = Mid(URL, pos + Len("workbook:"))
        Application.Goto Range(cref)

        Cancel = True
    End If
End Sub

【讨论】:

  • 如果您已经将 svg 插件表单 adobe 加载到 IE 中,那么在我的测试中它可以工作。此外,由于您托管的是浏览器,因此用户没有安全问题。您可以尝试直接嵌入 svg 控件,但这既快速又简单,对我有用。
  • 我不确定这有什么帮助,除了安全方面。如果我很乐意安装 Adob​​e svg 插件,那么我可以在 IE 中打开它,它可以打开指向 Excel 单元格的链接。将其嵌入 Excel 只会增加一个痛苦的世界,AFAICT。
【解决方案2】:

我已经使用不同的技术在 FireFox 上实现了同样的功能。在我的例子中,Excel 为 GraphViz 生成 DOT,它为 FireFox 生成 .svg。

链接技术有点难看,因为它需要很多小文件,但运行速度非常快。您需要选择一种新的文件类型,或者劫持现有的很少使用的文件类型,例如 .xyz。您为要返回到 Excel 的不同单元格的 svg 中的每个单独的节点或边编写一个文件。文件的内容存储文件(工作簿)的名称、工作表和单元格引用。我只是把每个放在自己的线上。您创建一个 vbscript (.vbs) 作为单独的脚本文件,这将是您的应用程序。这个 vbscript 有一个参数,即文件名,它的作用是打开文件,读取工作簿名称和工作表名称以及其中的单元格引用,以向 excel 发送命令以调出该工作簿、工作表和单元格.然后,您需要将您的 vbscript 应用程序与 FireFox 中的文件类型(例如 .xyz)相关联。使用工具->选项->应用程序。这可能很棘手,因为您必须实际键入 vbs 文件的名称,而不是浏览到它(您可以浏览到文件夹,然后切换到键入)!节点和边缘链接可以通过 .svg 传递(在我的情况下,通过 URL 标签通过 DOT); svg 中的链接应使用 file:/// 形式指向适当的本地生成文件(例如 .xyz 文件之一)。

然后,当您单击 .svg 中的链接时,FireFox 将以文件名作为参数启动本地 vbscript 作为应用程序。 vbscript 读取文件的内容,定位 Excel,并向其发送命令以激活正确的位置。毕竟,脚本可以把excel放在前面。

这个vbscript的sn-p会得到命令行参数:

arg = Wscript.Arguments(0)

这个vbs的sn-p会找到Excel的运行副本:

设置 objExcel = GetObject(, "Excel.Application")

使用这些命令来读取文件:

设置 objFSO = CreateObject("Scripting.FileSystemObject")
wkbName = objFSO.ReadLine
wksName = objFSO.ReadLine

使用这些命令向 Excel 发送消息:

objExcel.Visible = True
wkb = objExcel.Workbooks(wkbName)
wkb.激活
wks = wkb.Worksheets(wksName)
wks.Activate
wks.Rows(rowNum).Select

这个 sn-p 将把 excel 带到前面(在 win 7 上测试):

设置 objWsh = CreateObject("Wscript.Shell")
objWsh.AppActivate objExcel.Name

(奇怪的是Wscript.Shell.AppActivate objExcel.Name 没有!)

【讨论】:

  • TBH,这很创新,但和我希望看到的一样丑陋。
  • 是的。丑的都出来了。你不想这样做,除非你必须并且找不到任何替代方案。仅供参考,我最新的是使用零长度文件。我将工作簿、工作表和单元格引用的名称编码到文件名中。因此,文件尽可能少,没有数据。但是,如果文件不在光盘上,Firefox 将不会启动 vbs 脚本。我当前的 vbs 脚本只是解释文件名,它甚至不打开文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
相关资源
最近更新 更多