2

ボタンの代わりにハイパーリンクを使用して Basic マクロを実行しようとしています。ハイパーリンクはセルに直接接続され、ボタンは接続されていないため、私にはより自然に思えます。次の式を使用しています。

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

Standard.Module1の下のドキュメントのマクロに配置された Subroutine Testを呼び出し、それが書き込まれたセルに Text 'Check' を表示する必要があります。

これは、libreoffice 3.6.1.2 では問題なく動作しますが、バージョン 4.1.4.2 ではまったく動作しません。エラーは表示されません。何も起こらないだけです。ハイパーリンクをクリックするだけでなく、CTRL を押したままクリックしようとしました。同じ結果 - 何もありません。

ボタンを使用すると、マクロは期待どおりに機能します。この問題を解決する方法を知っている人はいますか?

4

1 に答える 1

1

これは Calc のバグのようです。プロトコル vnd.sun.star.script は、まだバージョン 4.2 の Writer のハイパーリンク URL で実行されます。しかし、Calc では実行されません。

回避策として、シート イベント「ダブルクリック」に次の関数を関連付けることができます。=HYPERLINK 数式を含むセルをダブルクリックすると、マクロが実行されます。

最後の 2 つのバージョンは、私の最初のアイデアの結果です。わかりやすさの理由から、回答させていただきます。しかし、私の意見では、この最後のバージョンが最善の回避策です。これは元の 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 に答える