Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 带超链接的Libreoffice计算运行宏_Macros_Hyperlink_Libreoffice_Calc - Fatal编程技术网

Macros 带超链接的Libreoffice计算运行宏

Macros 带超链接的Libreoffice计算运行宏,macros,hyperlink,libreoffice,calc,Macros,Hyperlink,Libreoffice,Calc,我尝试使用超链接而不是按钮来运行基本宏。这对我来说似乎更自然,因为超链接直接连接到单元格,而按钮则不是。 我使用以下公式: =HYPERLINK(“vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document”;“Check”) 它应该调用位于Standard.Module1下文档宏中的子例程测试,并在编写的单元格中显示文本“Check” 这在libreoffice 3.6.1.2中完全可以使用,但在版本4.

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

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

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

这在libreoffice 3.6.1.2中完全可以使用,但在版本4.1.4.2中根本不起作用。我看不出有什么差错,只是什么也没发生。我试着简单地点击超链接,同时按住CTRL键并点击它。同样的结果——什么都没有

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

这似乎是Calc中的一个bug。协议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
问候


阿克塞尔

谢谢!这几乎就是我想要的。但是,如果我尝试使用如下URL传递参数,则此解决方法不起作用:
=HYPERLINK(“vnd.sun.star.script:Standard.Module1.Test?language=Basic&location=document&R=“&ROW()&”&C=“&COLUMN()&&S=“&SHEET();”Check”)
使用您建议的方法,不会对内置函数进行求值,只需将其名称传递给调用宏即可。这个扩展问题有没有一个简单的技巧?第二个问题:这个解决方案(当然)改变了任何单元格双击(跳入该单元格编辑)的默认行为。对于不包含超链接的每个单元格,是否有一种方法可以使用上面的else案例退回到默认行为?第二个问题很容易解决。函数只需返回false。然后双击事件继续,双击的默认行为将重新出现。但第一个问题对我来说是无法修复的。主要的问题是,我解析公式,而不是公式的计算结果。因此,在解析公式时,ROW()、COLUMN()和SHEET()函数的结果不存在。我不知道简单地用宏计算工作表公式的可能性。幸运的是,我现在不需要其他参数。你的解决方案非常适合我的需要。我会接受的。虽然我希望这个错误在将来会被修复…非常感谢!