超链接到一个Excel单元格

4

快速概述

如何在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(矢量标记语言)。你可以绘制矢量图形,并且有几个库可用于绘制图表和图形。 - Andy E
嗯。生成图表的工具甚至支持VML,但尝试从中点击链接会相当可靠地导致IE崩溃。 - Tom
您的用户能否运行Excel宏? 您能在用户系统上安装软件/Excel插件吗? - Andrew
是的 - 相关的工作簿中嵌入了一个文档级别的插件。因此,添加更多插件不会太重。你要说Excel有一个SVG查看器插件吗?(希望涌现...) - Tom
2个回答

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

1
如果您已经在IE中加载了Adobe的SVG插件,则在我的测试中它很有效。另外,因为您是托管浏览器,所以用户不需要进行任何安全验证。您可以尝试直接嵌入SVG控件,但这种方法快速简单,对我来说非常有效。 - Andrew
我不确定这有什么帮助,除了安全方面。如果我愿意安装Adobe svg插件,那么我只需在IE中打开该文件,它就可以打开指向Excel单元格的链接。据我所知,在Excel中嵌入它只会增加很多麻烦。 - Tom

0

我已经使用不同的技术使得这个在 FireFox 上工作了。在我的情况下,Excel 生成 DOT 文件用于 GraphViz,然后生成 .svg 文件用于 FireFox。

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

当你在.svg中点击链接时,FireFox将启动本地vbscript作为应用程序,并将文件名作为参数。vbscript读取文件内容,定位Excel,并发送命令以激活正确的位置。完成所有这些操作后,脚本可以将Excel置于前台。

以下是获取命令行参数的vbscript代码片段:

arg = Wscript.Arguments(0)

以下是查找正在运行的Excel副本的vbscript代码片段:

Set objExcel = GetObject(, "Excel.Application")

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

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

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

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

这段代码将使 Excel 前置(在 win 7 上测试通过):

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

(奇怪的是,Wscript.Shell.AppActivate objExcel.Name 却不行!)


说实话,这很创新,但是我希望永远不要看到这么丑的东西。 - Tom
嗯,这个看起来真的很丑陋。除非你必须这样做并且找不到任何替代方案,否则最好不要这样做。顺便说一下,我的最新方法是使用零长度文件。我将工作簿、工作表和单元格引用的名称编码到文件名中。因此,这些文件尽可能地精简,没有数据。但是,如果这些文件不在磁盘上,Firefox 将无法启动 vbs 脚本。我的当前 vbs 脚本只是解释文件名,甚至不打开文件。 - Erik Eidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接