2010-02-16 51 views
4

快速摘要超链接到Excel单元格

如何创建超链接到Excel中的一个特定的细胞,将在Firefox正常工作,或实现在javascript同样的结果?

详细说明

我有用户输入数据到Excel电子表格。这个电子表格然后用于在SVG中生成一些图表。这些图表显示在Firefox中(尽管如果别的东西可以更好地工作,可以将其更改为其他内容)。我希望SVG图中的对象将超链接返回到生成这些对象的Excel单元格,以便更改图表背后的数据。

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

我会非常高兴使用IE浏览器,当然除了IE不支持SVG,至少不是开箱即用的。

那么有没有办法形成一个超链接(或可能是一些JavaScript),将打开一个特定的工作表和细胞活动的Excel工作簿?

+0

我不支持SVG,但它支持SVG的瘫痪的继父,VML(矢量标记语言)。您可以绘制矢量,并且有几个库用于绘制图表和图形。 –

+0

嗯。生成图表的工具甚至支持VML - 但尝试单击链接从而导致IE相当可靠地崩溃。 – Tom

+0

您的用户可以运行Excel宏吗? 您可以在用户系统上安装软件/ Excel插件吗? – Andrew

回答

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 
+0

这不会给我一个表单上的IE浏览器吗?其中不能显示SVG ... – Tom

+1

如果你有svg插件形式的Adobe已经加载到IE然后在我的测试它的工作。另外,因为您正在托管浏览器,所以用户没有任何安全问题。你可以尝试直接嵌入svg控件,但这很快且简单,并为我工作。 – Andrew

+0

我不确定除了安全方面外,这有什么用处。如果我很高兴安装Adobe svg插件,那么我可以在IE中打开它,它可以打开指向Excel单元格的链接。将它嵌入Excel只会增加一个痛苦的世界,AFAICT。 – Tom

0

我已经得到了同样的东西,使用不同的技术与FireFox一起工作。在我的情况下,Excel为GraphViz生成DOT,它为FireFox生成.svg。

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

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

VBScript中的这个片段将得到命令行参数:

ARG = Wscript.Arguments(0)

VBS的这个片段会发现Excel的运行副本:

Set objExcel = GetObject(,“Excel.Application”)

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

设置objFSO =的CreateObject( “Scripting.FileSystemObject的”)
wkbName = objFSO.ReadLine
WKSNAME = objFSO.ReadLine

使用这些类型的命令来消息发送到Excel中:

objExcel.Visible =真
WKB = objExcel.Workbooks(wkbName)
wkb.Activate
周= wkb.Worksheets(WKSNAME)
wks.Activate
wks.Rows(的rowNum)。选择

这个片段将带来练成到前(上取胜7测试):

组objWsh =的CreateObject( “Wscript.Shell”)
objWsh.AppActivate objExcel.Name

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

+0

TBH,这是创新的,但像我希望看到的那样丑陋。 – Tom

+0

是的。所有人都出去丑陋。你不想这样做,除非你必须和不能找到任何替代方案。 仅供参考,我的最新使用零长度文件。我将工作簿&工作表&单元格引用的名称编码到文件名中。因此,这些文件尽可能少,没有数据。但是,如果文件不在光盘上,Firefox将无法启动vbs脚本。我当前的vbs脚本只是解释文件名,它甚至不打开文件。 –