- ベストアンサー
OpenOffice,Basic,Mid()関数にて「無効なプロシージャの呼び出し」のエラー?
- OpenOffice Basicの初心者です.
- 「指定ユーザ数の、指定文字数のランダム文字列(a-z,A-Z,0-9)を生成するプログラム」を作成したのですが、以下のスクリプトを実行すると、「アクションは支援されません。無効なプロシージャーの呼び出し。」というエラーが出力されます。色々と自分で原因究明してみましたが、原因が分かりません。
- どなたか、ご教授頂けませんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 余分な回答の削除依頼は出して頂いたものとして回答します。 確かに、&でも+でも良いようです。失礼しました。 本当の原因はrnd()関数についての誤認識だと思います。 つまり >rand = int(maxRand * Rnd()) ' 乱数の生成 がError行です。 詳しく説明しますとRnd()関数とは 「0~1の間の乱数を生成する」 ものです。 また質問者さんは大文字、小文字、数字が混ざった文字列を作りたいために smallString = "abcdefghijklmnopqrstuvwxyz" largeString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" numberString = "0123456789" の合計文字数+1の26*2+10+1=63を用いていると思います。 少し、寄り道をしましたが要は rand=0 の場合がある事を忘れているのではありませんか? rand=0の場合 pw = pw + Mid(rootString, 0, 1) となり、 「0文字目から1文字取得」 とう事になります。 従い *********[ 修正コード ]********** rand = int(maxRand * Rnd()) ' 乱数の生成 if rand <> 0 then pw = pw + Mid(rootString, rand, 1) else j = j-1 end if *********************************** とすれば解決します。 ps. くれぐれも3~8の回答削除依頼をお願いします。
その他の回答 (2)
- new-OKWave
- ベストアンサー率68% (60/87)
こんばんわ。 正解は以下です。 ******** [ code ] ******** Sub Main dim doc as object dim sheet as object dim cell as object dim i, j as integer ' for文制御用 dim m, n as integer ' m:何人分か, n:何文字分か dim rand, maxRand as integer dim pw as string '文字列格納用変数 ' 初期化 rand = 0 maxRand = 63 ' 63未満の乱数生成する m= 20 ' 何人分の文字列か n = 15 ' 何文字分の文字列か doc = thiscomponent sheet = doc.sheets (0) smallString = "abcdefghijklmnopqrstuvwxyz" largeString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" numberString = "0123456789" rootString = smallString & largeString & numberString '<= 文字列の結合は「&」です。JavaScriptでは「+」ですが・・・・。 cell = sheet.getcellbyposition(0,0) cell.string = "生成した文字列" for i = 0 to m pw = "" for j=1 to n rand = int(maxRand * Rnd()) ' 乱数の生成 pw = pw + Mid(rootString, rand, 1) print pw next cell = sheet.getCellByPosition(0,i) cell.string = pw next End Sub ****************************** 単純な凡ミスだと思いますが原因は上述の通り「&」と「+」の間違です。 VBAでも多分文字列の結合は「&」の筈と思いますが。 老婆心ながらOpenOffice.org Basicを学習されるならば一度以下のサイトを参照される事をお薦めします。 OpenOffice.orgのMaro全般が非常に親切・丁寧・的確に記されています。 「OpenOffice.org3」(翔泳社)という参考書でも紹介されているサイとです。 <<<<「はにゃ?」さんの個人サイト >>>> URL : http://hermione.s41.xrea.com/pukiwiki/index.php?FrontPage また、蛇足とは思いますが上記サイトのレベルが高いと感じられたら以下のサイトの「4.Macroの杜」を参照される事をお薦めします。 Free Softwareでいこう!! 「 OpenOffice.orgを使おう編 」 URL : http://openoffice3.web.fc2.com/
- new-OKWave
- ベストアンサー率68% (60/87)
こんばんわ。 正解は以下です。 ******** [ code ] ******** Sub Main dim doc as object dim sheet as object dim cell as object dim i, j as integer ' for文制御用 dim m, n as integer ' m:何人分か, n:何文字分か dim rand, maxRand as integer dim pw as string '文字列格納用変数 ' 初期化 rand = 0 maxRand = 63 ' 63未満の乱数生成する m= 20 ' 何人分の文字列か n = 15 ' 何文字分の文字列か doc = thiscomponent sheet = doc.sheets (0) smallString = "abcdefghijklmnopqrstuvwxyz" largeString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" numberString = "0123456789" rootString = smallString & largeString & numberString '<= 文字列の結合は「&」です。JavaScriptでは「+」ですが・・・・。 cell = sheet.getcellbyposition(0,0) cell.string = "生成した文字列" for i = 0 to m pw = "" for j=1 to n rand = int(maxRand * Rnd()) ' 乱数の生成 pw = pw + Mid(rootString, rand, 1) print pw next cell = sheet.getCellByPosition(0,i) cell.string = pw next End Sub ****************************** 単純な凡ミスだと思いますが原因は上述の通り「&」と「+」の間違です。 VBAでも多分文字列の結合は「&」の筈と思いますが。
お礼
ご回答ありがとうございます. ですが,「+」を「&」にしても結果は同じでした. 因みに, 以下サイトにて 文字列結合に「+」が使われているように見えるのですが, 「+」でも文字列結合できるのではないのでしょうか? http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Strings_(Runtime_Library)
お礼
おっしゃるとおりです. rnd()関数のこと,ちゃんと理解できていませんでした. 凡ミスでした. お恥ずかしいです. また,教えて頂いた改修法もあるかと思いますが, 単純に +1 しても解決できました. <改修箇所> maxRand = 62 ' 63未満の乱数生成する for j = 1 to n rand = int(maxRand * Rnd()) + 1 ' 乱数の生成 pw = pw + Mid(rootString, rand, 1) next ご回答,ありがとうございました.