2

我正在尝试使用超链接而不是按钮来运行基本宏。这对我来说似乎更自然,因为超链接直接连接到单元格而按钮不是。我正在使用以下公式:

=HYPERLINK("vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document";"Check")

它应该调用位于Standard.Module1下文档宏中的子例程测试,并在它写入的单元格中显示文本“检查”。

这在 libreoffice 3.6.1.2 中工作得非常好,但在 4.1.4.2 版本中根本不起作用。我看不到任何错误,它什么也没发生。我试图简单地单击超链接并按住 CTRL 并单击它。同样的结果 - 什么都没有。

当我使用按钮时,宏按预期工作。有谁知道如何解决这个问题?

4

1 回答 1

1

这似乎是 Calc 中的一个错误。协议 vnd.sun.star.script 在 Writer 的超链接 URL 中运行,仍然是 4.2 版。但在 Calc 中它不会运行。

作为一种解决方法,您可以将以下功能附加到工作表事件“双击”。然后,如果您双击带有 =HYPERLINK 公式的单元格,宏就会运行。

最后两个版本是我最初想法的结果。由于可理解性的原因,我会让他们回答。但在我看来,最后一个版本是最好的解决方法。它将最接近原始 vnd.sun.star.script: URL 的工作。

public function Doubelclicked(target) as Boolean

 if left(target.formula, 32) = "=HYPERLINK(""vnd.sun.star.script:" then
  sFormulaHyperlink = target.formula

  sMacroURLRaw = mid(sFormulaHyperlink, 13, instr(13, sFormulaHyperlink, ";") - 13)
  target.formula = "=""" & sMacroURLRaw 
  sMacroURL = target.string
  target.formula = sFormulaHyperlink

  oDisp = createUnoService("com.sun.star.frame.DispatchHelper")

  dim args(0) as new com.sun.star.beans.PropertyValue
  args(0).Name = "URL"
  args(0).Value = sMacroURL

  oFrame = ThisComponent.CurrentController.Frame
  oDisp.executeDispatch(oFrame, sMacroURL, "", 0, args)
 end if   

 Doubelclicked = false
end function

以下是以前的版本:

public function Doubelclicked(target) as Boolean
 if left(target.formula, 32) = "=HYPERLINK(""vnd.sun.star.script:" then
   sMacroURL = mid(target.formula, 13, instr(13, target.formula, chr(34))-13)
   oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
   oFrame = ThisComponent.CurrentController.Frame
   oDisp.executeDispatch(oFrame, sMacroURL, "", 0, Array())   
 end if
 Doubelclicked = false
end function

这样就无法在宏 URL 中传递参数。但是,如果目标只是获取调用宏的单元格的地址,那么这是可能的,因为我们有双击的目标。所以我更新了我的解决方法。

public function Doubelclicked(target) as Boolean
 if left(target.formula, 32) = "=HYPERLINK(""vnd.sun.star.script:" then

  lStartLocation = instr(13, target.formula,"&location=")
  if lStartLocation > 0 then
   lEndLocation = instr(lStartLocation + 1, target.formula,"&")
   if lEndLocation = 0 then lEndLocation = instr(lStartLocation + 1, target.formula,"""")

   sMacroURL = mid(target.formula, 13, lEndLocation - 13)
   'msgbox sMacroURL
   oDisp = createUnoService("com.sun.star.frame.DispatchHelper")

   dim args(2) as new com.sun.star.beans.PropertyValue
   args(0).Name = "TargetAddress"
   args(0).Value = target.AbsoluteName

   oFrame = ThisComponent.CurrentController.Frame
   oDisp.executeDispatch(oFrame, sMacroURL, "", 0, args)
  end if   
 end if
 Doubelclicked = false
end function

问候

阿克塞尔

于 2014-08-24T10:57:58.957 回答