質問する
0

CodeObject.escape()が動かない

質問日 2018-12-02 19:24:04 +0200

amada のGravatar画像

updated 2018-12-05 02:30:19 +0200

nogajun のGravatar画像

エクセル(32bit)で使用していた自作関数のマクロを、リブレオフィス(32bit)で使用しようとしていて、壁にあたっています。完全な初心者です。JavaScriptな

ども書けません。(会社が一斉にリブレオフィスに移行したから)

ネットで何処を探しても該当する情報が得られずヤフー知恵袋でも質問していますが解決に至りません。情報を探しているうちにこのページと出会いました。

3つ悩んでいるのですが、別々のスレッドで質問させていただきます。
ここでは「URLエンコード」に関する質問です。

以下の自作関数が、エクセルでは問題なく動いていました。
エクセル内の指定セル内の文字列を含んだURLを作成するためのものです。

目的は地図上(GoogleMapではありません)でのポインティングです。
地図上の座標や、社名や、電話番号などを含んだURLを作成します。
これが動かないのです。

 '最初の2行はリブレ側で追加
Rem Attribute VBA_ModuleType=VBADocumentModule
Option VBASupport 1
Option Explicit

Function URL_住所(情報 As Variant) As String

 '「変換箱」を宣言。
 '「変換箱」はオブジェクト。
 '「変換箱」は「ScriptControl」を格納する。

Dim 変換箱 As Object

 '「変換箱」を生成する。

Set 変換箱 = CreateObject("ScriptControl")

 '「変換箱」は「JavaScript」を理解する。

変換箱.Language = "JavaScript"

 '「URL_住所」は「変換箱」に「情報」を格納する。
 '「escape」により「URL」を吐き出す。

URL_住所 = 変換箱.CodeObject.escape(情報)

 '「URL」を吐き出したら「変換箱」を終了する。

Set 変換箱 = Nothing

End Function
ところがリブレでは、
URL_住所 = 変換箱.CodeObject.escape(情報)
のところで、

 BASIC ランタイムエラー.
 '449'
 引数は省略できません
と出てしまいます。

この引数が、何のことなのか、
そして、コードをどう書けばよいのか調べてもさっぱりわかりません。

どうかよろしくご指導の程をお願いします。

edit retag flag offensive close merge delete

Comments

ドキュメント側ではなくマイマクロ側のモジュールに「URL_住所」関数を書き、その関数内にカーソルを置いた状態でF8した、とかしか、再現方法が思いつかない。この場合、escapeで問題が発生しているのではなく、「URL_住所」を呼び出す際「情報」に実引数を与えずに呼び出した形になるからそりゃそうだよね、としか言えなくなる。エラーが出る通知される場所は、「仮引数が最初に使われた場所」になっているんだと思う。

まぁURL_住所に引数を与えて呼び出しても、”[automation bridge] The object does not have a functionor readable property”と表示されるという新たな問題が発生するけれども。

himajin100000 のGravatar画像himajin100000 ( 2018-12-10 09:11:46 +0200 )edit

暫定的な予想。COMにおいて通常呼び出せなきゃいけないのはIDispatch::InvokeやIDispatch::GetIDsOfNamesによってサポートされているだけで良いところ、StarBasicでは、呼び出し時の「メソッドやプロパティの有無の判断」を存在しなくとも良いタイプライブラリから取得しているバグがある?

himajin100000 のGravatar画像himajin100000 ( 2018-12-17 20:08:25 +0200 )edit

1 Answer

0

回答日 2018-12-04 18:24:15 +0200

amada のGravatar画像

updated 2018-12-04 18:26:30 +0200

この件。自己解決とは言い難いのですが、ヤフー知恵袋での質問(別件での質問ですが)に対して頂いた回答を見て気がついたことがあります。本当に初心者なので、以下は書くのも恥ずかしいのですが、お許しください。

気がついたのは、こんなあたりまえのことでした。
でも私みたいな初心者の多くは、同じ所で嵌ってしまう事があると思います。

Function を使用して独自関数を作る場合、
VBA画面でデバッグすることそのものがナンセンスである。

引数に関するエラーが出るのは当然である。

私は上記の事が理解できていなかったわけではなく。
理解していたのにも関わらず嵌ってしまいました。

Function で記載する独自関数なんだから、
引数なんて書きようがないのに、なんでエラーが出るの??

このエラーを回避する書き方ってどうすればいいの??

で、、ネットで調べまくっていました。
でも何処にもそれが書いてなくて、、嵌っていたのです。

おそらく誰も、こんなとこで躓く初心者がいるとは、
考えもしないのだと思います。

ヤフー知恵袋で頂いた回答を見て、
標準画面に戻ってやってみたら、、普通に動くではありませんか。。

自分はいったい、何をしていたのだと。。
しばらく自己嫌悪に襲われました。

冷静に振り返ってみて気がついたのですが、
エクセルでは、 Function で独自関数を書いた時は、
最初からデバッグできない仕様になっていた気がします。。

対してリブレでは、Function でもデバッグできちゃうので、
何も考えずに、そのままデバッグして悩んでいたわけです。

馬鹿です。私。

さらにもうひとつ。
自己嫌悪に追いやられる、唖然とすることがありました。

この式で私がしたかった事。というか、
エクセル2007の32bit版でやってた事は「文字列のURL化」です。

もともとエクセル2007には、そのような機能が無かったので、
VBAで独自関数を書いて使っていました。

ところが。。先程。。

リブレの関数には、
その為の関数が、最初から用意されていたことに気が付きました。

見てなかったのです。
やっぱり馬鹿です。私。

そもそも今回は、最初から壁にぶつかり続けてきました。
まず最初に、このコードの中にある、

Set 変換箱 = CreateObject("ScriptControl")
の中の
"ScriptControl"

でデバッグが止まってしまい、
何をやっても動いてくれなくて、ずぅ~っと悩んでいました。

そもそもエラーコードに記載されている文章の意味がわかりません。
ネットで調べても、何処にもわかりやすい説明がありません。

その原因が、最初に何も考えずにインストールした、
リブレの64bit版にあることに気がついたのは、2日後でした。

リブレの情報を探すのに疲れ果ててしまい、
何気なくエクセルの情報を眺めていたら以下が出てきたのです。

32bit版のエクセルで多用されている "ScriptControl"は、
64bit版のエクセルでは使えない。。

これを見た時、頭の中が凍りつきました。

そして、おそらくリブレもそうなんだろうと。。判断し、
32bit版をダウンロードして、入れ替えたのです。

いとも簡単に、デバッグはここを通過しました。
そして次に出てきたのが、

URL_住所 = 変換箱.CodeObject.escape(情報) *
のところで、

 
BASIC ランタイムエラー.
 
449'
 
引数は省略できません*
だったので、もう冷静さを失っていました。。

以上。報告でした。
ご迷惑を、おかけしました。

edit flag offensive delete link もっと
ログイン/サインアップして回答する

質問ツール

2 followers

Stats

Asked: 2018-12-02 19:24:04 +0200

Seen: 53 times

Last updated: Dec 04 '18