TOP メニュー

2010年3月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
フォトアルバム

カテゴリー「一太郎マクロ初心者奮戦記Ⅱ」の42件の投稿

2007年6月23日 (土)

悪児さんの漢字書取問題挑戦7-2

 このブログの一太郎マクロ関連の記事は今までに

書きためたものを再掲示したものであった。しかし、前回の

「余計な改行文字を削除」からはリアルタイムで書いたものである。

当然、今回のものもリアルタイムの記事である。

 さてお題は久しぶりの漢字書取問題作成マクロである。

悪児さんの第7弾である。今回の売りは・・・

悪児は()の不要化で対抗することにしました。

 あらかじめ括弧で囲んだ漢字を変換するには、

対象となる漢字を括弧で囲まなくてはならない、

 どうせマクロ化するならそこまで自動化しましょうよ。ということです。

 もちろん、頭から順に指定しなくても、ちゃんと登場順に

番号が振られますよ。(^^)ゞ

・・・ということである。ということで早速、DLして試してみた。

動きも軽快でこれは面白い。くまぷーは何パターンか

試してみた。

すると・・・

 悪い児は悪児です
 悪い児は悪児です

・・・で検証したとき、下の順で( )をつけていくと

  1.悪い児は(悪児)です
    悪い児は悪児です

  2.悪い児は(悪児)です
    悪い(児)は悪児です

  3.(悪)い児は(悪児)です
    悪い(児)は悪児です

・・・つまり、1行目の「悪児」、2行目の「児」、1行目の「悪」の順に

(  )をつけていくと下のようになってしまうのだ。

 1.(①あく)い(③こ)は(②あくじ)です
  (①あく)い(③こ)は(②あくじ)です

①.悪   ②.悪児   ③.児   

悪児さんは「頭から順に指定しなくても、ちゃんと登場順に

番号が振られますよ。(^^)ゞ」と仰っているのだから

おそらくこういう結果になるはずではないのだろうか?

1.(①あく)い(②こ)は(③あくじ)です
  (①あく)い(②こ)は(③あくじ)です

①.悪   ②.児 ③.悪児 

   

2007年6月18日 (月)

簡易カレンダー作成マクロ

このサイトは「教員のための三四郎活用術」なのですがこの頃、とんと三四郎が話題に上ってきません。すっかり、三四郎から遠ざかってしまっています。

 さて一太郎Q&A掲示板を何気なく見たら、何やらくまぷーにも答えられそうな質問がありました。ここの掲示板には以前一度、回答をしました。一太郎に関する質問に回答するのは初めてだったので、ドキドキだったのですが質問者にほったらかしにされてしまい悲しかったのですが、マナーの悪い人ばかりではなかろうとついまた回答をしてしまいました。すると今度はすぐにレスが付いたのでニコニコです。

名称:簡易カレンダー作成マクロ

免責:このマクロの使用によっていかなる損害が生じようと、一切責任は負いません。あらかじめご承知の上ご使用下さい。

使用法:マクロを実行すると「範囲指定」が求められますので

平成19年2月

のような文字列を選択してください。
すると下のようにカレンダーが作られます。

Taro_macro0171 *

*

*

*

*

*

*Taro_Calendar.lzhをダウンロード

(2007/02/12)
ちなみに下が簡易カレンダー作成マクロのコードです。
プロポーショナルフォントだと数字がきちんと並ばないので最後にわざわざ範囲選択して等幅フォントに変えています。(コードNo.1)
!!(コードNo.1)

Range?()
%Str=GetString
%Nen=Mid(%Str(1) , 3 , 2)
%Tuki=Right(%Str(1),3)
If left(%Tuki,1) = "年" Or left(%Tuki,1) = " " Or left(%Tuki,1) = " "Then
        %Tuki = Mid(%Tuki,2,1)
Else
        %Tuki = Left(%Tuki,2)
End If
%Nen = %Nen + 1988

%Pos=DayOfWeek( %Nen , %Tuki, 1 )
%Cnt=7-%Pos+1


行頭
%MyRow=GetRow
%MyCol=GetColumn
%MyPage=GetPage
Insert("日 月 火 水 木 金 土",1)
%Num={" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9",10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}

!!閏年判定
%IsLeapYear=False
If %Nen Mod 4 =0 Then
        %IsLeapYear= True
End If

If %Nen Mod 100 =0 Then
        %IsLeapYear= False
End If
If %Nen Mod 400 =0 Then
        %IsLeapYear= True
End If

!!月末最終日
Select Case %Tuki
        Case 1,3,5,7,8,10,12
                %最終日        =31
        Case 4,6,9,11
                %最終日        =30
        Case 2
                If %IsLeapYear =True Then
                        %最終日        =29
                Else
                        %最終日        =28
                End If
End Select


Jump(,,(%Pos -1)* 3+1)

For %i = 1 to %最終日

        Insert(%Num(%i))
        右(1)
        If %Cnt-%i=0 Then
                Jump(,,%MyCol)
                下
                %Cnt=%Cnt+7
        End If
Next
%MyPage2=GetPage
%MyRow2=GetRow
%MyCol2=GetColumn
Jump(%MyPage,%MyRow,%MyCol)
RangeMode(1)
RangeStart
Jump(%MyPage2,%MyRow2,%MyCol2)
RangeEnd
フォント(.和文フォント名="MS ゴシック",.欧文フォント名=10)
しかし、InputCharacter()を使って予めフォントを指定すれば、コードNo.1のように後からフォントを変更する必要はありませんでした。

!!コードNo.2

Range?()
%Str=GetString
%Nen=Mid(%Str(1) , 3 , 2)
%Tuki=Right(%Str(1),3)
If left(%Tuki,1) = "年" Or left(%Tuki,1) = " " Or left(%Tuki,1) = " "Then
        %Tuki = Mid(%Tuki,2,1)
Else
        %Tuki = Left(%Tuki,2)
End If
%Nen = %Nen + 1988

%Pos=DayOfWeek( %Nen , %Tuki, 1 )
%Cnt=7-%Pos+1


行頭
%MyRow=GetRow
%MyCol=GetColumn
%MyPage=GetPage
Insert("日 月 火 水 木 金 土",1)
%Num={" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9",10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}

!!閏年判定

%IsLeapYear=False
If %Nen Mod 4 =0 Then
        %IsLeapYear= True
End If
If %Nen Mod 100 =0 Then
        %IsLeapYear= False
End If
If %Nen Mod 400 =0 Then
        %IsLeapYear= True
End If

!!月末最終日
Select Case %Tuki
        Case 1,3,5,7,8,10,12
                %最終日        =31
        Case 4,6,9,11

                %最終日        =30
        Case 2
                If %IsLeapYear =True Then
                        %最終日        =29
                Else
                        %最終日        =28
                End If
End Select


Jump(,,(%Pos -1)* 3+1)


For %i = 1 to %最終日
    InputCharacter(.和文フォント名="MS ゴシック",.欧文フォント名=10)
        Insert(%Num(%i))
        右(1)
        If %Cnt-%i=0 Then
                Jump(,,%MyCol)
                下
                %Cnt=%Cnt+7
        End If
Next
(2007/03/09 追記)

2007年6月17日 (日)

異種格闘技戦・・・表計算対ワープロ

いや~、とうとうやっちゃいました。

えっ?!不祥事じゃないですよ。

ほんとうに日経PC21の表計算大会マクロ部門に

一太郎で応募してしまいました。

応募要項に対象ソフトはExcel97~2003と

明記されているのですから、明らかに

一太郎は対象外です!!

 相手にしてもらえないことは百も承知なのですが・・・

つい手が滑ってメールを出してしまいました。

 これが三四郎や1・2・3などの

表計算ソフトで応募したのなら

シャレにも何にもなりませんが

ワープロソフトで応募したということで・・・

ご勘弁をm(__)m

ゲッ(゚゚ュ)с=(`´メ
勘弁ならん!!

関連トピック:日経PC21表計算腕自慢大会マクロ部門を一太郎で!!

問題はこちら

日経PC21表計算大会マクロ部門Q2(一太郎版)応募ファイルの

ダウンロードは下から

MQ_2.lzhをダウンロード

パスワードは「poohbear」です。

マクロを実行する前に以下の手順でパスワードを解除してください。

(1)パスワードは「poohbear」を入力しファイルを開く。

(2)メニューを「ファイル」「セキュリティ」と辿り

  「セキュリティ」ダイアログボックスを出す。

(3)「文書閲覧の制限」の「設定」をクリック。

(4))「文書閲覧の制限」ダイアログボックスの

  「開くときにパスワードを必要とする」の

  チェックを外し「OK」をクリック。

(2007/02/01)

結果はもちろん落選でした(^^ゞ

一太郎2007の新機能

 2月9日に新しい一太郎が発売された。こんどは2007になった。

もうワープロソフトというジャンルは枯れたジャンルなので、

バージョンアップといってもいつもはあまり注目すべき新機能がない。

しかし、今回は1点だけ、「むむっ、これはっ?!」というものがあった。

それは「ふりがなをテキスト形式で保存」という新機能だ。

JustSystemの説明によると

>文書をテキストデータとして保存するとき、ふりがなを親文字の後ろに()で囲って挿入できます。
>同様に、ふりがなが設定された範囲を選択してコピーした場合も、テキスト形式で貼り付けると親文字の後ろに()で囲ったふりがなを挿入できます。


ということだ。

これならふりがなを振った後、問題文をテキスト形式にして、

括弧に番号をふって親文字を削除しちゃえば

「漢字書取問題」ができちゃうじゃん!!

くまぷーは「漢字書取問題作成マクロ」を作る際、

ふりがなの取得にはいろいろ苦労していたからだった。

一太郎マクロではメニューコマンドの「全ての単語」に

対応していないのでPushKeys()を使ってキー転送してみたり、

裏でEXCELを呼び出してExcelにふりがなを取得させてみたりなどと・・・。

でも一太郎2007でふりがなを親文字の後ろに()で囲って

挿入できるならば、ふりがな取得も

マクロ対応になっていて「漢字書取問題作成マクロ」なんて

簡単にできちゃうかも!!

甘いかな?(^_^;)

一太郎の表計算機能

今回のお題は「一太郎の表計算機能」だ。

 ご存じの通り、一太郎には「罫線」-「計算」-「計算」から

呼び出す簡易計算機能がある。

これは簡単な四則演算しかすることができないが、

今回のテーマ、日経表計算大会マクロ部門の問題では

足し算と引き算しか使わないので、

この機能で十分対応できる・・・と思っていた。

ところが、少し考えが甘かったようだ。

Taro_macro0161 *

*

*

*

*

上図を見て欲しい。 D=A+B-C という計算が出来ないのだ。

 A,B,C,Dが同列または同行に存在しないとエラーになるようである。

この辺りは作業セルを使えば何とかなるであろうが、

機能的に少々貧しい。

表のレイアウトをオリジナルのままにしておきたかったので

この機能を使うのはやめることにした。

 一太郎にはこの他にもう一つ作表機能がある。

「挿入」-「表枠」から呼び出すやつだ。

しかし、これは一太郎内の機能ではない。

別のソフトで作った表を貼り付けるだけである。

いわば三四郎やExcelで作った表を

リンク貼り付けするのと同じだから問題外である。

 この部分もマクロでやらざるを得ないようだな。

一太郎はラクをさせてはくれない。

ほんとうに一太郎は楽しいな。

一太郎マクロには「文書マクロ」など存在しない(2)

前回、一太郎の「文書マクロ」はシート毎に独立していて、Sheet1の

「文書マクロ」はSheet2からは見えないということを書いた。

だから、Sheet2からSheet1のマクロを実行することが出来ない。

Sheet2からRunDocumentMacro("シートを追加")とやると

「指定したマクロがありません」というエラーになるのだ。

 では修飾詞をつけてRunDocumentMacro("Sheet1.シートを追加")、

あるいはRunDocumentMacro("Sheet1!シートを追加")としたら

どうであろうかと思い足掻いてみたのだが、結局上手く行かなかった。

(●`ε´●):ギブアップか?

【´・ω・`】:この程度で白旗を掲げるはず無いだろ!!

 一太郎マクロ初心者は何か打開策はないものかとヘルプを

いろいろ調べてみた。そして次の方法をとることにした。

1.Sheet1のマクロ「シートを追加」をいったんシステムマクロとして複写する。
2.システムマクロ「シートを追加」をSheet2の「文書マクロ」に複写する。
3.システムマクロ「シートを追加」を削除する。


下がそのコードだ。

!!シート名をデフォルトに戻す
%Str=GetSheetCount( )
CurrentSheetItem("Sheet" & %Str)

!!元シートをコピー
SelectAll()
Clip()

!!新規シート追加
PushKeys("#F{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"\\
& "{DOWN}{RIGHT}{ENTER}#N")


!! 文書マクロ "シート追加" をシステムマクロ
!! "シート追加" へコピーする

%moto_name = "シート追加"
%saki_name = "シート追加"
%saki_title = "シート追加"
DuplicateMacro( %moto_name, 2, %saki_name, \\
%saki_title, 1 )


!! システムマクロ "シート追加" を文書マクロ
!! "シート追加" へコピーする

ChangeCurrentSheet( "Sheet" & %Str )
DuplicateMacro( %moto_name, 1, %saki_name, \\
%saki_title, 2 )

!! システムマクロ "シート追加" を削除する
DeleteMacro("シート追加" , 1)

!!新規シートの名前設定
%Str=GetSheetCount( )
CurrentSheetItem("2007年" & %Str & "月")


!!元シートを新規シートに複写
Paste()

!!元のシートの名前を書き戻す
%Str=%Str-1
ChangeCurrentSheet( "Sheet" & %Str )
CurrentSheetItem("2007年" & %Str & "月")
ChangeCurrentSheet( "2007年" &(%Str+1) & "月")

いやあ、本当に一太郎は面白いなぁ!!

パズルみたいだ!!(^。^)

サンプルファイルは下からダウンロードしてください。

AddSheet3.lzhをダウンロード

一太郎マクロには「文書マクロ」など存在しない

 間に「漢字書取問題作成マクロ」の話題が入ってしまった。

話を元に戻そう。話は「日経表計算大会腕自慢マクロ部門を一太郎で!!」だ。

前回は一太郎マクロに新規シートを追加する命令がないので

PushKeys()で誤魔化したところまでであった。

 そこで次にくまぷーは元シートの内容を新規シートにコピーするために

次のコードを書いた。赤い部分が前回のコードに付け加えた部分である。

ここさえできてしまえば完成したも同じである。

!!シート名をデフォルトに戻す
%Str=GetSheetCount( )
CurrentSheetItem("Sheet" & %Str)


!!元シートをコピー
SelectAll()
Clip()


!!新規シート追加
PushKeys("#F{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"\\
& "{DOWN}{RIGHT}{ENTER}#N")


!!新規シートの名前設定
ChangeCurrentSheet( "Sheet" & %Str )
%Str=GetSheetCount( )
CurrentSheetItem("2007年" & %Str & "月")


!!新規シートに元シートをコピー
Paste()


!!元のシートの名前を書き戻す
%Str=%Str-1
ChangeCurrentSheet( "Sheet" & %Str )
CurrentSheetItem("2007年" & %Str & "月")
ChangeCurrentSheet( "2007年" &(%Str+1) & "月")

くまぷーは上のマクロを実行してみた。狙い通りに新規シートが追加され、

元シートの内容がコピーされていた。うまくいった・・・と思ってさらに

新規シートからもう一枚、新にシートを追加するためにマクロを

実行してみようとした。すると・・・。

(・_・)......ン?

な、ない!!

 文書マクロのリストに「シートを追加」マクロが登録されていないのだ。

一太郎では「文書マクロ」という言葉を使ってはいるが、その実態は

「文書マクロ」ではなく「シートマクロ」であったのだ。

「文書マクロ」というならば、文書単位、つまり同じファイルのなかならば、

どのシートからも利用できるはずなのだが、一太郎はシートにマクロが

くっついているのだ。

一太郎の複数シートシステムは内部的には複数の文書を1つのファイルに

見せかけているに過ぎないのであろう。

 話が脇に逸れるが、ひょっとしたら、悪児さんが以下のように

仰っていたことに関わっているのかも知れない。

掲示板で、くまぷーさんからまだ直っていない、というご指摘を頂きました。(^^;)(^^;)
  確認したところ、旧バージョンが残って、新バージョンが入っていなかったいたようです。
  しかし、「マクロ」-「変更から」システムマクロからコピーしようとすると、  文書マクロのウインドウに、「6-2」が・・・。しかし、「マクロ」-「編集」からマクロを開こうとすると、「6」しかなくて、開くと、旧版。うぅ~~ん。(-_-;)
  一旦別文書にコピーして、そこからコピーしたら、2つ見えるようになりました。
  一体、何だったんだろう・・・。というわけで、もう一度、差し替えました。m(_ _)m

(詳しくはこちらを。赤字にしたのはくまぷー)

 いやあ、本当に一太郎は面白いなぁ!!

サンプルファイルは下からダウンロードしてください。

TaroAddSheet2.lzhをダウンロード

2007年6月16日 (土)

くまぷー、一太郎 漢字書取問題作成マクロⅣを公開

 とうとう漢字書取問題作成マクロシリーズもVer.4となりました。

以前、くまぷー版はⅢで打ち止めだと申しましたが、

くまぷーさんのⅢに完敗です。m(_ _)m

仰っていた悪児さんがまだ攻めて来るので、再びこのテーマに

取り組むことに致しました。

 それでⅣの特徴を申しますと・・・

一切PushKeys()を使っていない

・・・ということです。PushKeys()を使っていないので、

動作は非常に安定しております。

 ところが悪児さん版ではご本人が次のように述べられているように、

不可避的に動作が不安定です。

『元々「PushKeys」をマクロで制御しようというのが「裏技」ですから、十分な動作保証などできない、という立場ですので、すべてのパソコンで正常に動作する、などということは望んでいません。  というか、通常は正常に動作していても、裏で別アプリを動かしているときなど、同じ作業でも誤動作することがありますので、それ以上は諦めています。「CPUの使用状況等によって誤動作することがあります」という注意書きで「終わり」ですね。』

(●`ε´●):くまぷー、おまえはPushKeys()を使わないことによって、

       プログラムの動作を安定させたというわけか?

【´・ω・`】:うん。

(●`ε´●):例の「一太郎とEXCELの連携」か?Excelはおまえの

       得意技だから、それもおまえらしくていいかもな!!

【´・ω・`】:いや、Excelは使っていないよ。一太郎の機能だけだよ。

(●`ε´●):えっ?!早く見せろよ!!

【´・ω・`】うん、ではアップするよ・・・

・・・とすぐに公開するつもりだったのですが、悪児さんが

一太郎Webフォーラムに「No.3585 マクロ作ってみませんか。」という投稿を

なさいました。ここでこのコーナーを紹介して、「日経PC表計算腕自慢大会

マクロ部門Q2」の競作を多くの一太郎ファンに呼びかけられました。

お祭り好きのくまぷーです。悪児さん、ありがとう (^o^)/~~~

【´・ω・`】:面白い展開になってきたな!!実は「漢字書取問題作成マクロⅣ」

  では「日経PC表計算腕自慢大会マクロ部門Q2一太郎版」用に考えた

   テクを使っているんだ。だから、「漢字書取問題作成マクロⅣ」は

   申し訳ないけど、完成していますよということを示すために

   パスワード付きでアップしておくよ。

   パスワードの公開はしばらく待ってd(^-^)ネ!

【´・ω・`】: そうそう、悪児さんからご指摘を頂いた

>くまぷーさんの、「Ⅲ」の場合、
>範囲指定して実行した場合、
>範囲外の漢字まで、
>丸数字&かなに変換されてしまいます。
>これは、「仕様」でしょうか?


     の件も当然、「漢字書取問題作成マクロⅣ」ではOKですよ。

一太郎Webフォーラムをご覧の皆様、飛び入り・野次馬大歓迎です。是非ご参加下さい。 掲示板はこちら

(2006/12/31)

※現在はパスワードなしのものを公開しています。下よりDLしてください。

Taro_Kanjikakitori4.lzhをダウンロード

2007年6月15日 (金)

悪児さん、漢字書取問題挑戦6公開

悪児さんの逆襲・・・漢字書取問題挑戦5(続)」に対して悪児さんのコメント

公開されました。くまぷーはすでに

日経PC21表計算腕自慢大会マクロ部門を一太郎で!!」というお題に

移ってしまったので、話の流れが前後してしまうのですが、

今回は以前に戻ってまた「漢字書取問題作成マクロ」扱います。(^^ゞ

 くまぷーは「漢字書取問題挑戦5」について次の2点の指摘させていただきました。

1.パソコン(環境)によっては、正常に動作しないことがある。
2.「(残業)と(残業手当)とサービス残業」が上手く変換できない。


詳しくは「悪児さんの逆襲・・・漢字書取問題挑戦5(続)」をご覧下さい。

1.については悪児さんは次のように仰っています。

『元々「PushKeys」をマクロで制御しようというのが「裏技」ですから、十分な動作保証などできない、という立場ですので、すべてのパソコンで正常に動作する、などということは望んでいません。  というか、通常は正常に動作していても、裏で別アプリを動かしているときなど、同じ作業でも誤動作することがありますので、それ以上は諦めています。「CPUの使用状況等によって誤動作することがあります」という注意書きで「終わり」ですね。』

 これについてはくまぷーも同感です。PushKeys()を使うとコードが上から順に

実行されなくなったりするなど極めて気まぐれな関数なので、PushKeys()を

使ったプログラムはどうしても気まぐれなプログラムになってしまいます。

できるならばPushKeys()は使いたくない関数です。ですから、プログラムの安定性を

考えれば今までのプログラムの中では一番実用性の高い方式は

くまぷーの「漢字書取問題作成マクロⅡ」ではないのかと思っています。

あれではExcelを一太郎マクロで呼び出し、その機能を利用するという手を

使っています。PushKeys()を使っていないので安定性は一番です。

Excelの普及度を考えるとあの方式がが一番、いいのかなと・・・(^^ゞ

2.については・・・

『ATOKが勝手に音節を区切って部分的に変換してしまうためで、実は、随分前から気づいていて(「漢字書取問題挑戦5」の登録ファイルのメモにある、 「熟語になっている漢字以外は誤動作する可能性があります」という記述がそれです)、  その改良版も出来上がっていたのですが、くまぷーさんのご指摘を待っていたのです。』

・・・ということです。

 早速、DLして試してみると漢字の読み取り部分は良くなっていたのですが、

同じ漢字については同じ番号を振ったふりがなに変換するという部分の不具合が

まだそのまま残っていました。何かの手違い?かと思いメールにてお知らせいたしました。

そのことについては悪児さんのサイトをご覧下さい。

 現在のバージョンは「きっちーさんのキー割付」を取り入れたものに差し替えたそうです。

これで今までの最強版ができあがったということになるのでしょうか。


・・・てなことを書いていた悪児さんより、下記のご指摘を頂きました。

>くまぷーさんの、「Ⅲ」の場合、
>範囲指定して実行した場合、
>範囲外の漢字まで、
>丸数字&かなに変換されてしまいます。
>これは、「仕様」でしょうか?


【´・ω・`】;「文字全置換」を使っているから、これは仕様です!!

(●`ε´●):おい、くまぷー!そんなことを言っていると悪児さんの

漢字書取問題挑戦6」が最強だということを認めてしまうことになるぞ!!

【´・ω・`】:だってあっちの方が優れているんだもん、仕方がないよ。

(●`ε´●)::なんだ負けを認めて終わりか?

【´・ω・`】:ここまで戦ったんだから、いいじゃん。相手は一太郎界の大御所なんだし・・・。

(●`ε´●):立て、立つんだジョー3さん!!(「じょー」と打ったら「ジョー3さん」に

変換されてしまいました)いや、立て、立つんだくまぷー!!

今こそ「漢字書取問題作成マクロⅣ」を出すとき時だ!!

【´・ω・`】:しかたがないなあ~。じゃちょっと待っててd(^-^)ネ!

Pushkeys()で新規シートを追加・・・

 AddSheet()は名前だけ見ると新規シートを追加する関数のようなのだが、

既存のファイルを読み込んでシートとして追加するものだということがわかった。

なんで単純にシートを追加する関数が無いんだ。それぐらいあってもいいと

おもうのだが、開発側の手抜きではないか?!それともくまぷーのヘルプの見方が

悪いだけなのか?それならば一太郎Webフォーラムにでも「教えてください」と

投稿すれば悪児さんやきっちーさんが教えてくれるかもしない(^^ゞ

 うだうだ言っていても方ないので使いたくはなかったのだがPushKeys()による

キー転送でシートを追加することにした。下がそのコードだ。

PushKeys("#F{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"\\
& "{DOWN}{RIGHT}{ENTER}#N")

これで取り敢えず新規シートは追加することが出来た。そこでくまぷーは

追加されたシートの名前が「2007年2月」になるように下のコードを書いた。

PushKeys("#F{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"\\
& "{DOWN}{RIGHT}{ENTER}#N")

ChangeCurrentSheet( "Sheet" & %Str )

%Str=GetSheetCount( )
CurrentSheetItem("2007年" & %Str & "月")

すると不思議なことに一枚目のシートの名前をデフォルトの「Sheet1」のままに

しておくと正常に動作するのだが「2007年1月」に変更してマクロを実行すると

誤動作してしまうのだ。マクロのコードを全然変更しないで「Sheet1」の名前を

ちょっといじっただけで誤動作してしまうのだ・・・(?_?)。

いったい、どういう内部構造になっているのだろう。


手強し、ジャストシステム!!

 
 そこでくまぷーは考えた。シート名がデフォルトじゃないと誤動作するならば、

マクロ実行前にデフォルトに戻しておけばいいじゃん!!

そして実行後に名前を再設定する・・・

!!シート名をデフォルトに戻す
%Str=GetSheetCount( )
CurrentSheetItem("Sheet" & %Str)

!!新規シート追加
PushKeys("#F{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"\\
& "{DOWN}{RIGHT}{ENTER}#N")

!!新規シートの名前設定
ChangeCurrentSheet( "Sheet" & %Str )
%Str=GetSheetCount( )
CurrentSheetItem("2007年" & %Str & "月")


!!元のシートの名前を書き戻す
%Str=%Str-1
ChangeCurrentSheet( "Sheet" & %Str )
CurrentSheetItem("2007年" & %Str & "月")
ChangeCurrentSheet( "2007年" &(%Str+1) & "月")

かなりドタバタしているけれど取り敢えずこれで動く・・・。

でもまたまた基本的な問題が・・・

ジャストシステムは楽しませてくれるなぁ・・・

サンプルファイルをダウンロード

2007年6月13日 (水)

一太郎マクロで新規シートを追加・・・

 いよいよ、今回から日経PC21表計算大会マクロ部門のQ2に一太郎で

挑戦する。Q2のお題は「翌月シートを作成し、今月の残高を自動転記」と

いうことである。

 一太郎はくまぷーの知る限り、複数シートに対応している唯一の

ワープロソフトである。ま、表計算ソフトではないので計算機能が

エクセルに劣っているのは当たり前なので、その辺をマクロで処理すれば、

一太郎はもともと複数シートをサポートしている

のだから、前回のお題の「漢字書取問題作成マクロ」に比べれば

お茶の子さいさい、朝飯前の屁のカッパであろうとタカをくくっていた。( ̄^ ̄)

 くまぷーは鼻歌交じりに一太郎を起動した。そしてシートを追加するには

どのようなコードを書けばよいのかと「記録マクロ」を使って調べることにした。

 やってみると・・・。

またかよ(-_-;)

 コードが生成されないのだ。ふりがな機能の「すべて単語」に続いて「シートの

追加」もかよ。確か、一太郎が複数シート対応になったのはVer.10の

ときだったはず。

ジャストシステムよ、
毎年バージョンアップしているのに
いったい何年、放置しているんだ?!
ヽ(`Д´)ノ

  くまぷーはこう見えても温厚な性格である。一太郎はなんと言っても

ジャストシステムの主力製品である。いくらなんでも、何年もの間、知らんぷりで

うっちゃられているはずがない。くまぷーの調べ方が甘いのではないかと

気を取り直してヘルプを調べてみることにした。ひょっとしたら、何か手が

あるかもしれない。「Sheet」をキーワードにしてヘルプを調べてみた。

 

お~、な~んだ、あるじゃん!!
(*^。^*)

 検索リストの中にはしっかりと「AddSheet」というマクロ関数が

載っていた。

と、ところが・・・

 よく見るとAddSheet関数は「一太郎ファイルからシートを追加します。」とある。

(・_・)......ン?、
一太郎ファイルから・・・?

 なんとこの関数は単に新規シートを追加するのではなく、既存の

一太郎ファイルをシートとして読み込むという機能なのだ。

使えねぇじゃん!!

(-_-;)
またPushKeys()で
キー転送かぁ~?

2007年6月12日 (火)

日経PC21表計算腕自慢大会マクロ部門を一太郎で!!

`ε´):
檄! 全国の一太郎マクロファンよ
ここに集え!!

 いよいよ年末!!表計算ファンには恒例、日経PCの「腕自慢大会」の季節がやってきた。今年は十周年ということで従来にはなかったマクロ部門が新設された。はっきり言ってエクセルを使って回答するのならば「瞬殺」なので、戯れに一太郎マクロを使って回答を作ってみようと思い立った。

これがその問題(Q2)だ。

http://pc.nikkeibp.co.jp/pc21/contest/2007/macro/2.shtml

なんとかなるだろうと
タカをくくっていたが、
これがナント非常に難しい!!(>_<)

え、おまえの一太郎マクロのレベルが
低すぎるからだろうって?!

それはそうなんだけど・・・(^^ゞ


 現在、悪児さんが参加してくれました。悪児さんの作品はこちらからDLできます。くまぷーのものはこちらからDLできます。ただ、二つとも現在はパスワードがかかっています。他のかたの参加を待っているので・・・


 
`ε´):
誰か挑戦してみようという勇者は
いないのか?!
※飛び入り・野次馬大歓迎です。掲示板にどうぞ。(^^ゞ
(2006/12/28)

漢字書取問題作成マクロ~PushKeys()

前回、悪児さんの漢字書取問題挑戦5にEdit()?から復帰せずに途中で

止まってしまうという不具合があるということを書いた。

これは恐らく38・39行目の

PushKeys("~^{F2}{F6}{ENTER}{ESC}[Q]")
Edit?()


が原因だと思われる。やはり、どうやってもPushKeys()は不安定だ。

くまぷーのⅢもPushKeys()を使っているので悪児さん版と同じ弱点がある。

ただくまぷー版ではPushKeys()は以下のように使っている。

PushKeys("{ENTER}")
Ruby?


仮に(くまぷーの環境でのことだが)悪児さんのものよりもくまぷーのものの方が

動作が安定しているとすれば、その理由は悪児さん版とくまぷー版とのキー転送の

数の差であろう。

ご覧の通り悪児さん版ではキー転送が6打であるがくまぷー版では1打である。

・・・というようなことを考えていると結局、PushKeys()を全く使わずにルビ設定のダ

イアログを出してしまった方が良かったのではないかと反省している次第である。

InputString()で出しているダイアログはふりがなの確認のためなのだから、

それならばルビ設定のダイアログでも支障はないはずである。

 PushKeys()・・・使わずに済むのならば、使わないで済ませたい関数である。

2007年6月11日 (月)

悪児さんの逆襲・・・漢字書取問題挑戦5(続)

 前々回の「悪児さんの逆襲・・・漢字書取問題挑戦5」に対しての悪児さんのコメントが下のものです。

くまぷーさんが、それは今後の課題と言うことで」、とおっしゃっている同一漢字の混在の件まで
 含めると・・・でも、忙しくなるからなぁ、そっちは、やっぱりもう少し先送りかなぁ。(^^)ゞ
-------------------------
 って書いたら、くまぷーさんに、
 「え、お気づきになっていない?! くまぷー版はⅢでその件にはとっくに対応していますが・・・( ̄^ ̄)えへん」
 といわれてしまった(→こちら)。そこまで、気にしていませんでした。(^^;)(^^;)
 というわけで、とりあえず、同一漢字の混在と確認のダイアログを表示するバージョンに 差し替えました。(^^)ゞ

 さて、どうも、くまぷーさんに押され気味なので、ちょっと、逆襲を。(^^)ゞ
 くまぷーさんのⅢですが、悪児の環境では、
 (悪)い(児)は(悪児)です
 悪い児は悪児です

 の2行を変換させようとすると、あとの2つのかなの取得が出来ません。
 手入力しなくてはならなくなります。(^^;)(^^;)

もちろん、悪児の5は、ちゃんと読みの候補を取得&表示しますよ~~(^_^)(^_^)/~

さて悪児さんのご指摘の件ですが、確かにくまぷーのⅢでは

(悪)い(児)は(悪児)です
 悪い児は悪児です


のふりがなの取得ができません。しかし、これはと思って試してみると「ルビ設定」を手動で実行してもやはりふりがなの取得ができないのです。ところが

(悪)い(児)は(悪児)です
 悪い児は悪児です




(良)い(子)は(良子)です
良い子は良子です


・・・にすればふりがなの取得が出来るのです。つまり、くまぷー版でできないというのは、一太郎のルビ振り機能の弱さによるものでしょう。悪児さん版がこのパターンでふりがな取得が出来るというのはルビ機能を使わずにATOKの再変換機能を使っているところによるものでしょう。確かにここの部分は悪児さん版の方が素性がいいようです。

 しかし、くまぷーが2台のパソコンで悪児さん版を検証してみたところ、まだ問題があるように思えました。

 それは・・・先程申し上げたとおり2台のPCで検証したのですが1台では問題なく動くのですがもう1台では途中で止まってしまうのです。前にあった不具合と同じでEdit?が終了しないのです。この場合は「ファイル」-「復帰」をしてもふりがなを取得することができませんでした。ちなみに不具合のあったパソコンのOSはWinXpホームエディションSP1、CPUはPEN4(2.53GHz)、メモリ512MB、一太郎2005です。恐らく悪児さんの環境では不具合はでなかったのでしょうがもう一度確認して頂ければと思います。ちなみに検証に使ったデータは次の3つです。

1.(悪)い(児)は(悪児)です
 悪い児は悪児です

2. このマクロの(使用)によってあらかじめご(承知)の上ご使用下さい。

3.免責 このマクロの(使用)によっていかなる損害が生じようと、一切責任は負いません。あらかじめご(承知)の上ご使用下さい。

もう一つの問題点は上の不具合の無かったパソコンでも見られたものです。

 (残業)と(残業手当)とサービス残業

という文字列を処理すると

 (①ざんぎょう)と(②ざんぎょう手当)とサービス残業
①残業 ②残業手当

となって「手当」のふりがなが取得されないし、「サービス残業」の
「残業」が処理されていないのです。


 最初の環境による問題はくまぷーも沢山のパソコンで検証しているわけではないのでひょっとしたら他の環境で問題が起きているのかも知れませんが

(残業)と(残業手当)とサービス残業

に関しては

もちろん、くまぷーのⅢは、ちゃんと読みの候補を取得&表示しますよ~~(^_^)(^_^)/~


悪児さんの文よりコピペ & 一部修正

きっちーさん登場・・・前門の虎、後門の狼

  悪児さんの掲示板にきっちーさん現れた。

悪児さん こんにちは

くまぷーさんとのやりとりを楽しく読ませてもらってます。
私もついつい書取問題つくってしまいました。
動作もふるおーとです(不具合が多少ならず・・・(^^;; )

きっちーさんと言えば知る人ぞ知る一太郎の達人だ。

おそらく日本で(ということは世界で)5本の指に入る一太郎の

使い手ではないであろうか。一太郎の発売元であるJust Systemが

運営しているQ&A掲示板「一太郎Webフォーラム」での活躍は素晴らしい。

その回答数(延べ148件)は悪児さん(延べ82件)の

約2倍である(2006/12/22現在)。

 その方が参戦してきた。か弱い一太郎初心者にとってはゴジラと

戦っていたところにいきなりガメラまで現れたようなものであろうか。

これはもう、一太郎の2第巨頭そろい踏みといったところだろう。

いまさらながら恐れ多いことを始めてしまったものである。

         ((((;゜Д゜)))ガクガクブルブル

さて、そのきっちーさん、早速のメガトンパンチだ。

再変換キーの割付ですが、一太郎の標準機能にありますので、
マクロコマンドでは、

AttachKey("~^{F2}", "再変換", 10 , "再変換")

ATOKで割付けなくてもいいと思いますよー (^^)

これは悪児さんの漢字書取問題挑戦5ではマクロを実行する前に

>あらかじめ、ATOKのキーカスタマイズで、 「再変換」に、
>shift-ctrl-F2 を割り付けておく必要があります。


ということでユーザに負担をかけることになるが、それを自動的にマクロで

やってしまおうということである。なるほどこれができれば悪児さんの

漢字書取問題挑戦5の弱点が克服されることになる。

このことに対しては悪児さんもご存じなかったようで次のように

コメントなさっている。

ツール・オプション
こんな所にあったんですね。知らなかった。

 ほんとうに面白い展開になってきた。竜虎相打つ激しいバトルになる

予感がする。こうなってくると一太郎マクロ初心者の出番など無くなってくる。

くまぷーも単なる一太郎マクロファンとして今後の展開が楽しみである。

 くまぷーはきっちーさんの作品が是非見たいと思い公開をお願いしたら、

快く承諾してくださった。きっちーさん、ありがとうございます。

きっちーさんの作品「漢字書取問題 試作マクロ1」はこちらから

ダウンロードできます。

 また、きっちーさん曰く

> でもあれ、カッコ外の漢字は無視してますので。(~~;;)

 確かに問題文中に出てくる同じ漢字が未処理では生徒に答えバレバレなので

実用性の点では大いに問題ありなのですが「試作マクロ」ということなので

改良版の「試作マクロ」が出てくる予感がします。(^^ゞ

 きっちーさん、参加してくれてどうも有難うございます。m(__)m

その他の方も飛び入り、野次馬大歓迎です。掲示板にご意見お待ちしています。

2007年6月10日 (日)

悪児さんの逆襲・・・漢字書取問題挑戦5

 この「一太郎マクロ初心者奮戦記」もいつの間にか回を重ねて30回を越えていた。

ほんの1ヶ月くらいの間に30回を越えたのだからかなり、いいペースだと言えよう。

 いいペースだと言えば、悪児さんもいいペースで漢字書取問題マクロのバージョンを

アップしてきた。今回の漢字書取問題挑戦5に対する悪児さんのコメントが下のものだ。

 昔、ジャストウインドウ版の一太郎5には、一太郎のマクロ関数として、 再変換(Retransfer)があって、それを使って、自動振り仮名マクロを作ったことがあります。
 今、一太郎で再変換が出来ますが、これは、ATOKの機能になってしまい、一太郎マクロでは、 直接制御できません。で、振り仮名機能を代用にしたのですが、PushKeys()の制御法が見えてきた今、 挑戦することにしました。ただし、初期値では、「再変換」は、PushKeysでは制御できないキーに 割り当てられていますので、あらかじめ、ATOKのキーカスタマイズで、 「再変換」に、shift-ctrl-F2 を割り付けておく必要があります。
 とりあえず、「再変換」にのみ注目ということで、振り仮名の確認等、 細かいことは省略したバージョンを紹介します。実行時の動作は、きれいになりました。(^^)(^^)
 
さて、かなの取得は、多分これで終わりでしょう。次は、「あらかじめ括弧で囲っておく」所まで、マクロ化したいところです。
 更には、くまぷーさんが、「それは今後の課題と言うことで」、とおっしゃっている同一漢字の混在の件まで 含めると・・・でも、忙しくなるからなぁ、そっちは、やっぱりもう少し先送りかなぁ。(^^)ゞ 

 いよいよ悪児さんの逆襲だ。Ver.5では「すべての単語」から離れてふりがなの取得に

別の手を使ってきた。流石にベテランだけあって引き出しの数が多い。

くまぷーも早速ダウンロードして試してみようと思ったのだが・・・
 
 この一太郎マクロ初心者は、一太郎歴はVer.3からなのだが普段たいしたことを

やっていないので標準機能をあまりというか・・・悲しいことにぜんぜん把握していない!!

あらかじめ、ATOKのキーカスタマイズで、 「再変換」に、shift-ctrl-F2 を

割り付けておく必要があります。

(--;)

 この辺りのやり方がよくわかりません。(^_^;)

「キーカスタマイズ」から出てくるダイアログには「再変換」が3つあって

さらにそれぞれ、「文字未入力」「入力中」「変換中」・・・とたくさん、あります。

どれをいじったら良いのでしょう?(^_^;)

Atokのこんなところをいじったことが無いもんで・・・

しばらくの間、あれこれいじってみてやっとできました。

今度のはかっこいいじゃないですか!!

それに動きもいいですね!(^。^)

 実はくまぷーもATOKを制御するというのは

ホンのチラッとだけ考えてヘルプで「ATOK」という

文字列が含まれる関数を全て調べたのですが使えそうなのが

一つもなくてあきらめたのでした。いや~、悪児さん、流石です。

 マクロって楽しいですねぇ~(^。^)

 ところで・・・悪児さんは下のように仰っているが・・・

くまぷーさんが、「それは今後の課題と言うことで」、とおっしゃっている同一漢字の混在の件まで 含めると・・・

え、お気づきになっていない?!

くまぷー版はⅢでその件にはとっくに対応していますが・・・( ̄^ ̄)えへん

2007年6月 9日 (土)

夢か?幻か?あの悪児さんがくまぷーに・・・

 「すべての単語」をPushKeys()で利用することは実際に問題作成するときには

実用的ではない!!ということを前回言った。それは「PushKeys()の怪・・・」で

述べたように「すべての単語」を実行しても全ての単語にふりがなが

振られるわけではないということだ。そしてさらにPushKeys()で「すべての単語」を

実行した場合は、さらに振り漏れが多くなるということだ。文章の長さがちょっと長めの

問題で実行した場合は、文章の後半では全くふりがなが振られない。

これでは全くダメである。

 そこでくまぷーは「全ての単語」一発でふりがなを振ろうとせず、問題文を

スキャンしてかっこの付いた漢字に対してピンポイントでふりがなを振ることにした。

こうすればまず振り漏れはない。効率がよい。

 「すべての単語」では実際には全ての単語にふりがながふられない以上、

「ルビ設定」で着実にひとつひとつふりがなを振っていった方が精度が高いに

決まっている。この出発点の違いがくまぷーの「漢字書取問題作成マクロⅢ」と

悪児さんの「漢字書取問題挑戦3」の動作安定性の差として最後まで大きく

響いてしまったと言えるだろう。

 そこで悪児さんは「漢字書取問題挑戦4」を出してきた。その時のコメントが

以下のものである。

落とし穴、それは動作確認用のデータの節約でした。 大きなデータだと

当然実行に時間がかかるし、データを復元するのも面倒。

 というわけで、漢字が2×3位しかないデータで動作確認をしたわけです。

 と、ちゃんと動くんですね。で、できた\(^o^)/ってことで、

そこでやめちゃいました。

 くまぷーさんに、「出来ましたよ」と宣言して、パスワードをつけて、

某所に置きました。 あまり簡単にできたので、多分くまぷーさんも

同じものを見つけるだろう、と思っていました。 ところが、くまぷーさんは

違う方法だった。そこで、まず失敗作を公開し、 もったいをつけた上で、

公表しようとして、ちょっと手直しをした上で、 もう一度動作確認を

したのです。

今度は、ちょっと大きめのデータで・・・(^^;)(^^;) と、ちゃんと動かない。

Edit?()が終了してくれないんです。手直しが悪かったのか、と思って、

その前のものも試しましたが、やはり同じ。 なんでぇ?

 前にやったときには、ちゃんと動いたのに・・・(-_-;)(-_-;)(-_-;)

 データ量の問題だ、ということに気づくまで、ちょっと時間がかかりました。

 で、修正したのが、4.です。これなら多分、ちゃんと動くと思います。

 一度では、振り仮名を振り残すケースがある、という、くまぷーさんご指摘の、

 一太郎のバグにも対応していると思います。

ただ、実行してみれば感じられると思いますが、いかにも挙動が大袈裟で、

全然美しくない。(^^;)(^^;) 無理矢理、やっているぜい・・・って、感じ (^^;)(^^;)

というわけで、これでは、くまぷーさんのⅢに完敗です。m(_ _)m

「くまぷーさんのⅢに完敗です。m(_ _)m」・・・夢か?幻か?あの悪児さんが

くまぷーに・・・う、うれしい・・・(; ;)ホロホロ

 で早速DLして「漢字書取問題挑戦4」を試してみた。今度のは 「すべての単語」の

ふりがな振り漏れを回避するためにループで一行々々 「すべての単語」を

実行している・・・。悪児さんも 「すべての単語」に拘るよりも「ルビ設定」で

ピンポイントでふりがなを振る方が素性がいいと(多分)思っていらっしゃるのだが

、ここで「ルビ設定」-「ピンポイント」方式にいまさら切り替えることは

できないところがつらいところだろう。ご自身でも「いかにも挙動が大袈裟で、

全然美しくない。(^^;)(^^;) 無理矢理、やっているぜい・・・って、感じ (^^;)(^^;)」と

仰っておられる。

 実際に試してみるとやはり「無理矢理」がたたっているのか、動作に「?」が

付く点がある。それは悪児さん版の1から3で試したときは成功していたはずの1行文

このマクロの(使用)によってあらかじめご(承知)の上ご使用下さい。

が上手く処理されない。この不具合はくまぷーの環境でだけのことであろうか?

ちなみに2行にして

このマクロの(使用)によってあらかじめご(承知)の上ご使用下さい。
このマクロの使用によってあらかじめご承知の上ご使用下さい。

とすると問題なく処理される。

 さて1回は自ら負けを認めた悪児さんだがこのまま終わるはずはない。

さすがは、くまぷーさん、と、シャッポ(本当は、シャポー)を

脱いでも良いのですが、 やはり、それでは芸がない、ということで、

もうひとつ、作ってみました。

ということで悪児さんは続けざまに「漢字書取問題挑戦5」を出してきた。

いったいどこまでいくんだろうか?(^。^)

2007年6月 8日 (金)

漢字書取問題作成マクロ・・・悪児さん版との比較

 悪児さんが「WORD FIND」では「悪児ならこう作る」でくまぷー版との

比較を行いその違いを解説していた。そこではJump()の落とし穴について

解説されていた。くまぷーはそれに全く気づかずに作品を公開してしまい、

結果として完敗ということになった。

ま、負けました・・・orz

 

 しか~し、今回の「漢字書取問題作成マクロ」ではけっこう

いけているんではなかろうか? まず悪児さんの「漢字書取問題挑戦1」と

「漢字書取問題挑戦2」ではマクロを連続実行できないという致命的な欠点がある。

もともと初代の 「ふりがな-すべての単語」をあらかじめ実行してから

マクロを実行しなければならないという点を自動化するということが目的なのだから、

マクロをひとつ実行したら後は最後まで手放しで行かなければならない。

悪児さんも「漢字書取問題挑戦2」は失敗作だとご自身ではっきりと仰っている。

 そこで現在公開されている最新版「漢字書取問題挑戦3」との比較であるが・・・。

これについても悪児さんは「動作確認をしたところ、とんでもない落とし穴が・・・

(14.に続く)」と仰っている。その落とし穴がどんなものかまだはっきりと

仰ってはいないのだが、くまぷーも「漢字書取問題挑戦3」の不具合を確認している。

 

 それは「14.に続く」ということなので、それを待つことにする。さて悪児さん版と

くまぷー版の基本的な違いはなんであろうか?悪児さん版ではふりがなを振るのに

「すべての単語」を利用しているがくまぷー版で利用しているのは「すべての単語」では

なく「ルビ設定」である。この違いが大きい。(^^ゞ

 くまぷーは失礼を承知で敢えて言う。「すべての単語」をPushKeys()で利用するのは

実際に問題作成するときには実用的ではない!!(^^ゞ

 その理由は?実はこの一太郎マクロ初心者奮戦記に書いてあるけど・・・

あとで言うd(^-^)ネ! 

2007年6月 7日 (木)

一太郎マクロで漢字書取問題作成競作・・・

おー悪児さんのサイトを見たら・・・

くまぷーさんの、「 ★一太郎マクロ初心者奮戦記★」に便乗して、 「悪児なら、こう作る」を始めましたが、その後、くまぷーさんに、 悪児の、「漢字書取問題作成」をネタに、「くまぷーならこう作る・・・」という、 「挑戦状」を頂戴しました。(^^)(^^)。「漢字書取問題作成」では、マクロに対応していない 「ふりがな-すべての単語」をあらかじめ実行してからマクロを実行する仕様にしていましたが、 くまぷーさんは、その「部分も自動にすること」に挑戦するとおっしゃる。
 そんな、無茶な・・・、と思わないこともなかったけど、挑戦された以上仕方がない。

マクロ作者魂に火をつけてしまったらしい・・・(^^ゞ

初代の「042漢字書取問題作成」に続いて11.漢字書取問題挑戦1、

12.漢字書取問題挑戦2、13.漢字書取問題挑戦3と3本のマクロが発表されている。

いったい、いくつまでいくんだろう(?_?)

 さて、くまぷー版と悪児さん版を比べてみて如何であろうか?

手前味噌になってしまうが、動作の安定性とかを見ると決して大御所の作に

劣るものではないとおもうのだが・・・

一太郎漢字書取問題作成マクロⅢをダウンロード

2007年6月 6日 (水)

一太郎・・・漢字書取問題作成マクロⅢ公開

  いよいよ漢字書取問題作成マクロⅢの公開です。ここでもう一度、

漢字書取問題作成マクロの流れを整理してみます。

悪児さんのバージョン(漢字書取問題作成マクロ・初代)はマクロ実行前に

『「ふりがな」-「すべての単語」を実行してから、マクロを実行』しなければなりません。

これは一太郎の標準コマンド「すべての単語」がマクロに対応していないというところから

来る制限でした。

 そこで、くまぷーは漢字書取問題作成マクロⅡを作りました。

漢字書取問題作成マクロⅡは一太郎からExcelを呼び出し、その機能を

使い悪児さんバージョンの制限を回避するというものでした。

しかし、漢字書取問題作成マクロⅡはExcelの機能を使うが故に

Excelのインストールされていない環境では使えないという制限がありました。

 漢字書取問題作成マクロⅢは悪児さんバージョンの制限と

漢字書取問題作成マクロⅡの制限をともに克服したものです。

Excel無しの環境で、かつマクロ実行前に『「ふりがな」-「すべての単語」を

実行することなく、漢字書取問題を作成することができます。

以下がその実行法です。

手順1:出題する漢字を全角の括弧で囲む。

Taro_macro0133 *

*

*

手順2:マクロ処理したい範囲を選択する。

Taro_macro0141 *

*

*

手順3:マクロ「漢字書取問題作成Ⅲ」を実行する。すると下のように出力される。

Taro_macro0151 *

*

*

メモ1:ふりがなを自動で取得できない場合、またはふりがなが正しくない場合は

           確認のダイアログから正しいふりがなを入力する。

メモ2:(    )は20個まで。

一太郎漢字書取問題作成マクロⅢをダウンロード

一太郎・・・漢字書取問題作成マクロⅡの課題

 『戯れに一太郎を使って「漢字書取問題作成マクロⅡ」を作ってみました。

できばえは如何でしょうか?』ということを掲示板に書き込んだら、

悪児さんから下記のレスを頂いた。

試してみました。

素晴らしい。(^^)(^^)
非表示で呼び出せるんですね。〆(._.)

で、ちょっと気づいたことですが・・・(^^)ゞ

あ(悪児)は、(悪)い(児)です。

のような場合の読み分けが出来ないのは仕方がないとして、

(悪)い(児)は(悪児)です。

の場合だと、後ろの「悪児」が
「悪」と「児」に分割されてかなに直され、
最後に、「見つかりません」という
エラーになってしまいます。(^^;)(^^;)

ご意見ありがとうございます。

>「悪」と「児」に分割されてかなに直され、
>最後に、「見つかりません」という
>エラーになってしまいます。(^^;)(^^;)

そうですね。

「(悪)い(児)は(悪児)です。」の場合。
1回目のループで「悪」が下のように変換され、

(① あく)い児は(① あく)児です。

2回目のループで「児」が下のように変換されます。

(① あく)い(② じ)は(① あく)(② じ)です。

その結果、3回目のループで「悪児」を変換しようとするのですが、

ご指摘の通り、すでに「悪児」は読み仮名に変換されていて

存在しないので、「見つかりません」というエラーになってしまいます。

実はこのことはすでにわかっていたことなのですが

注として書くのを忘れてしまいました。m(__)m

実は漢字書取問題作成マクロⅡは括弧穴埋め問題作成システムの

コードを元にしたものなので・・・(^^ゞ

括弧穴埋め問題作成マクロの時は

メモ
    2)「残業」「サービス残業」など共通の語句を含むことはできない。


ということを明記しておいたのですが
今回は忘れてしまいました。

http://www.geocities.jp/kuma_pooh1958/word001.htm

共通の語句を含む場合は語句の長い方から処理する

アルゴリズムに変更すればよさそうですね。それは今後の課題と言うことで・・・

P.S. 1・3マクロ館で「一太郎マクロ初心者奮戦記」を紹介していただいて

本当にありがとうございました。

2007年6月 5日 (火)

漢字書取問題作成マクロⅡ・・・コード解説(2)

前回からの続きです。

選択された文字列を変数%Sentenceに格納する。
!!第4ブロック

%Str =GetString()
%StrNum = Size(%Str)
%Sentence = ""

For %i= 1 to %StrNum
     %Sentence = %Sentence & %Str(%i)
Next

 ここでは選択範囲の文字列を一字々々チェックし、全角左括弧、全角右括弧を

検索する。括弧が見つかったら、その間にある文字列を変数%Goku()に、

そのふりがなを変数%Yomi()に格納していく。

 変数%GokuNumにはユーザが全角括弧で指定した語句数を格納する。

尚、補足であるがエクセルのふりがなはデフォルトでカタカナを指定しているので、

Zen()とHira()でひらがなでふりがなが表示されるようにしている。

!!このプログラムの心臓部(第5ブロック)

%CharCount = Len(%Sentence)
%GokuNum=1
For %i = 1 To %CharCount

  If Mid(%Sentence, %i, 1) = "(" Then
     %j = 0
     %Cnt = %Cnt + 1
     Do While Mid(%Sentence, %i + %j, 1) <> ")"
        %j = %j + 1
     Loop

     %Goku(%GokuNum) = Mid(%Sentence, %i + 1, %j - 1)
     %Yomi(%GokuNum) = Hira(Zen(%Excel.GetPhonetic(%Goku(%GokuNum))))
     %GokuNum = %GokuNum + 1

  End If
Next

WarningMode(0)で問い合わせのダイアログが表示されないようにする。

文字列全置換で全角左括弧、全角右括弧を消去する。

!!第6ブロック

WarningMode(0)
文字全置換(.検索文字列="(",.置換文字列="",.検索方向=3,.あいまい検索=1,.確認=0)
ReviveAdvancedRange( )
文字全置換(.検索文字列=")",.置換文字列="",.検索方向=3,.あいまい検索=1,.確認=0)

 setMarumojiでサブプロシージャを呼び出し、グローバルな配列変数$Marumoji()に

丸数字を格納しておく。

Forループでユーザが全角括弧で指定した漢字を丸文字付きのふりがなに置換していく。

WarningMode(1)で問い合わせのダイアログが表示されるようにしておく。

呼び出したエクセルの後始末。

カーソルを文章末に移動し、ユーザが全角括弧で指定した漢字を書き出す準備をする。

!!第7ブロック

setMarumoji
for %i = 1 to %GokuNum -1
  ReviveAdvancedRange( )
  文字全置換(.検索文字列=%Goku(%i),.置換文字列="(" & $Marumoji(%i) & %Yomi(%i) & ")",.検  索方向=3,.あいまい検索=1,.確認=0)
next
WarningMode(1)
%Excel.Quit
Set %Excel = Nothing

EndOfParagraph( 2 )
Insert("",1)
Insert("",1)

文章末にユーザが全角括弧で指定した漢字に丸数字を付けて書き出す

 以上が「漢字問題作成マクロⅡ」プログラムの主部である。

あとはサブプロシージャのsetMarumajiのコードだけだ。

!!サブプロシージャ

Sub setMarumoji

$Marumoji(1) = "① "
$Marumoji(2) = "② "
$Marumoji(3) = "③ "
$Marumoji(4) = "④ "
$Marumoji(5) = "⑤ "
$Marumoji(6) = "⑥ "
$Marumoji(7) = "⑦ "
$Marumoji(8) = "⑧ "
$Marumoji(9) = "⑨ "
$Marumoji(10) = "⑩ "
$Marumoji(11) = "⑪ "
$Marumoji(12) = "⑫ "
$Marumoji(13) = "⑬ "
$Marumoji(14) = "⑭ "
$Marumoji(15) = "⑮ "
$Marumoji(16) = "⑯ "
$Marumoji(17) = "⑰ "
$Marumoji(18) = "⑱ "
$Marumoji(19) = "⑲ "
$Marumoji(20) = "⑳ "

End Sub


単純にグローバルな配列変数$Marumoji()に丸数字を格納するだけだ。

漢字書取問題作成マクロⅡをダウンロード

漢字書取問題作成マクロⅡ・・・コード解説

 前回に書いたことだが、この「漢字書取問題作成マクロⅡ」のポイントは

一太郎マクロでExcelを操作する点である。下のコードがExcelを起動し、

ExcelのGetPhoneticを利用して「一太郎」という漢字を「イチタロウ」という

読み仮名に変換するものである。

%Kanji = "一太郎"
Set %Excel = CreateObject("Excel.Application")
%Yomi=%Excel.GetPhonetic(%kanji)
MsgBox(%Yomi)

 この手の「アプリケーションの連携」に関するサンプルコードは割と

つまらないものが多い(と思う)のだが、このコードはけっこう面白いのではないだろうか?

さて、それでは「漢字書取問題作成マクロⅡ」の全コードを?ブロックに分けて紹介しよう。

!!変数宣言部(第1ブロック)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!漢字書取問題作成マクロⅡ
!!くまぷー作
!!2006/11/21
!! http://members.jcom.home.ne.jp/kumano-pooh-san/
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!

declare variable %Goku(20)
declare variable %Yomi(20)

%Goku(20)はユーザが全角括弧で指定した漢字を、 %Yomi(20)は

そのふりがなを格納する配列。

!!第2ブロック

SelectRangeStart( )
StartOfRange()
%StartPage=GetPage()
%StartRow=GetRow()                      
%StartCol=GetColumn()
EndOfRange()
%EndPage=GetPage()
%EndRow=GetRow()
%EndCol=GetColumn()

後でJump()を使うために選択範囲開始部分と選択範囲終了部分のページ、

列、文字数を変数に格納。

!!エクセルを起動(第3ブロック)

Set %Excel = CreateObject("Excel.Application")  

エクセルをバックグラウンドで起動し、変数%Excelで一太郎マクロから

操作できるようにする。
    

                                         (続く)

2007年6月 4日 (月)

一太郎とExcelの連携・・・

  PushKeys()を使って「書式」-「ふりがな」-「すべての単語」を実行するのは

タイミング的に見てどうもうまくいかないようだ。

(●`ε´●):PushKeys()を使うのは諦めるのか?

【´・ω・`】:いや、PushKeys()を使って「書式」-「ふりがな」-「すべての単語」を

                実行するのを諦めるんだ。

(●`ε´●):なんだ、はっきりしない言い方だな。

【´・ω・`】:PushKeys()を使うのを諦めたわけではないんだが

               すでに「漢字書取問題作成マクロⅡ」を

               公開しているのでそちらを先に紹介しておこうと思って・・・

KanjiKakitori_Taro.zip(漢字書取問題作成マクロⅡ)をダウンロード

(●`ε´●):「漢字書取問題作成マクロⅡ」はあるけど「漢字書取問題作成マクロⅠ」が

                   ないようだが・・・

【´・ω・`】:悪児さんの公開している「漢字書取問題作成」が

              「漢字書取問題作成マクロⅠ」のつもりなんだ。

(●`ε´●):そういうことか。

【´・ω・`】:「漢字書取問題作成マクロⅡ」の仕様は以下の通りだ。

使用法

手順1)下のように漢字を全角の括弧で囲む。

免責 このマクロの(使用)によっていかなる損害が生じようと、一切責任は負いません。あらかじめご(承知)の上ご使用下さい。

手順2)マクロ処理したい範囲を選択する。

手順3)マクロ「漢字書取問題作成Ⅱ」を実行する。すると下のように出力される。

免責 このマクロの(① しよう)によっていかなる損害が生じようと、一切責任は負いません。あらかじめご(② しょうち)の上ご(① しよう)下さい。


① 使用, ② 承知


備考)このマクロを実行するためにはエクセルが必要です。
開発環境 WindowsXp
     一太郎2005
     エクセル2000

【´・ω・`】:ポイントは一太郎マクロでExcelをコントロールして、その機能を

      使っているところだ。Excelを使うことによって『「ふりがな」-「すべての単語」を

      実行してから、マクロを実行』しなければならないという「漢字書取問題作成」の

      制限を回避している。

(●`ε´●):ではこの「漢字書取問題作成マクロⅡ」が悪児さんの「漢字書取問題作成」に

       対する「くまぷーならこう作る」の回答と考えていいのか?

【´・ω・`】:いや、悪児さんの掲示板でこう言われているし・・・

Excelがないと・・・
というのが、(^^;)(^^;) ですが、
一太郎マクロでExcelを動かす、
など、素晴らしい業が入っています。

【´・ω・`】:いちおう「素晴らしい業」と褒めて頂いてはいるのだが

     「Excelがないと・・・というのが、(^^;)(^^;) ですが」ということで手放しで、

     というわけではない。「くまぷーならこう作る」ということで公開するのだから、

     当然、このあたりはクリアーしているものにしなければ芸が無いと

     いうことになるだろう。

(●`ε´●):それではExcelなしのバージョンを期待していいんだな?!

【´・ω・`】:うん、もう完成している。この「漢字書取問題作成マクロⅡ」の

      解説を少ししてから近日中に「漢字書取問題作成マクロⅢ」として

      公開するから待っててd(^-^)ネ!

一太郎マクロ・・・Jump()の落とし穴

  今回はPushKeys()はちょっと棚の上に乗せておいてJump()についてだ。

この関数はページ、行、列を指定してカーソルを移動させる便利な関数だ。

記録マクロを使って文字を書き込むとすぐに出てくるアレだ。

わりと便利そうなので使っていたのだが、悪児さんから以下のような指摘を

受けてしまった。

一太郎マクロでは、Jump()は、ちょっと怖いのです。

  予期せぬ誤動作の元になることがあります。

  文字数で位置を指定するのですが、

  プロポーショナルフォントが導入されて以来、

  フォントに左右されるようになってしまいました。

  特に罫線表では、1つのセルに入る文字数が、

  フォントによって変わってしまうので、

  入る文字によって、ジャンプ位置が微妙にずれ、

  それが誤動作につながる可能性があるのです。

_| ̄|○うっ・・・

 言われてみれば至極当然のことなのだが、くまぷーはまったく気づ

いていなかった。くまぷーの参考にしている一太郎マクロ入門が等幅

フォント全盛時のDOS版Ver.5用だったと言っても単なる言い訳に

しかならない・・・やはり、一太郎マクロのキモはカーソルを如何に

巧みに操るかだな・・・。

悪児さん、勉強になりましたたぜい!!サンクスです。m(__)m

2007年6月 3日 (日)

一太郎マクロ・・・PushKeys()の怪(3)

 一太郎マクロのPushKeys()の動作にはどうも妙なクセがあるようだ。

そこでくまぷーはヘルプを見てみた。そこには「PushKeys関数は入力待ちに

なってはじめて呼び出されます。」とある。そこでくまぷーは以下のコードを

使って検証してみることにした。

For %i = 1 to 5
     PushKeys("1{ENTER}2{ENTER}")
Next

Wait(3)

Insert("BEBE",1)

Wait()はマクロの実行を停止し、指定した時間後に再開しするという命令だ。

こうすればPushKeys()を実行した後に3秒おいてInsert()が実行されるのでは

ないかと期待したが、結果は下図のとおりで、結局はPushKeys()よりも

Insert()が先に実行されてしまった。

Taro_macro0121_2 *

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

そこで次に試したのがtry文を利用した例外処理だ。

try
      gonnyo
exception
       Hoge
end try

tryとexceptionの間に記述したコードgonnyoでエラーが起きると

exception以下のHogeが実行される。この条件分岐を使えば

ひょっとしたら何とかなるかも知れないと根拠はないのだが足掻いてみた。

try
  For %i = 1 to 5
     PushKeys("1{ENTER}2{ENTER}")
  Next
  %x=0
  %x=9/%x !!ゼロ除算
exception
   case "searcherror"

   case else
       Insert("BEBE",1)
end try

しかし、結果は先程と同じでPushKeys()よりもInsert()が先に

実行されてしまった。とほほ・・・。(-_-;)

一太郎マクロ・・・PushKeys()の怪(2)

  一太郎マクロのPushKeys()の動作にはどうも妙なクセがあるようだ。

そこでくまぷーはヘルプを見てみた。そこには「PushKeys関数は入力待ちに

なってはじめて呼び出されます。」とある。

そこでくまぷーは以下のコードを使って検証してみることにした。

For %i = 1 to 5
     PushKeys("1{ENTER}2{ENTER}")
Next

Insert("BEBE",1)

  コードが上から下に逐次実行されるのならば実行結果は

下の通りになるはずである。

Taro_macro0111 *

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

ところが実際にはそうはならず、下のような結果になってしまう・・・。

Taro_macro0121 *

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

*

Insert("BEBE",1) ・・・・・の方が

For %i = 1 to 5
     PushKeys("1{ENTER}2{ENTER}")
Next

・・・・・よりも先に実行されてしまうのだ!!

`ε´):


なんだ、上から順に実行されないじゃん!!

 ヘルプに「PushKeys関数は入力待ちになってはじめて呼び出されま

す。」とあるのはこういうことか・・・。

一太郎マクロ・・・PushKeys()の怪

 前回のPushKeys()で「すべての単語」を実行することはできる。

しかし、実行結果をよく見ると、ふりがなが振られていない語句が

あることがわかる。そもそもPushKeys()から「すべての単語」を

実行するのではなく、直接メニューからPushKeys()を実行しても

ふりがなの振り漏れがあるようだ。このあたりも一太郎の機能上の

不備と言えるだろう。

 振り漏れがある場合、何度か繰り返して「すべての単語」を

実行すると少しずつ振り漏れが少なくなっていき、やがて全ての

語句に漏れなくふりがなが振られるようだ。

 PushKeys()から「すべての単語」を実行するのと直接メニューから

「すべての単語」を実行するのとを比較してみるとPushKeys()の方が

振り漏れが多いのだが、繰り返しPushKeys()を手動で繰り返し実行するうちに

徐々に振り漏れが少なくなっていくのは同じであるようだ。

 そうであるならばPushKeys()をFor~Loopで適当な回数だけ繰り返せば

振り漏れはほとんど無くなるはずである。そこで考えたのが以下のコードである。

For %i = 1 to 100
    PushKeys("#O{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
    & "}{DOWN}{DOWN}{RIGHT}{DOWN}{DOWN"\\
    & "}{ENTER}{ENTER}")
Next

このようにしてやればPushKeys()が100回繰り返されるはず・・・。

ところが実行してみると、どうも100回も繰り返されているようには

思えない。たった1回しか実行されていないような感じがする。(?_?)

これはいったい・・・???。

2007年6月 2日 (土)

一太郎マクロの不備・・・

 前回、「一太郎マクロの制限により」と言った。

それは具体的には何のことかというと、記録マクロを使って、

「書式」-「ふりがな」-「すべての単語」を実行しようとしても、

肝心の「すべての単語」がグレイアウトされてしまい実行不能なのだ。

こういうようなマクロ未対応のコマンドが度重なるバージョンアップにも

かかわらず、放置されている。このあたりがJUST SYSTEMの

やる気を疑ってしまうところである。

 話が横に逸れてしまうが三四郎で言えばセルの結合・解除が

マクロ未対応のまま放置されている。これでは三四郎よりもただで手に入る

OpenOffice.orgのCalcの方が優れていると言わざるを得ない。

これでは、いくら安くてもわざわざカネを払ってまで三四郎を

手に入れる理由はあまりない。

 三四郎はこのままでは朽ち果てて消えていくしかない・・・。

是非、次回のバージョンではなんとかして欲しい物である。


 さて、「すべての単語」を直接実行する命令が、なければキー転送で

誤魔化すことができるであろうか。一太郎には記録マクロの他に

「キー記録」という機能が装備されている。

 「キー記録」と「記録マクロ」の機能はとても似ている。違いは「記録マクロ」では

マウスとキーボードの操作を記録してコード化するのに対し、

「キー記録」は文字通り、キーボードの打鍵のみをコード化する。

そこで「キー記録」を使って「すべての単語」を実行してみることにする。

作られたコードは以下の通りだ。

PushKeys("#O{DOWN}{DOWN}{DOWN}{DOWN}{DOWN"\\
& "}{DOWN}{DOWN}{RIGHT}{DOWN}{DOWN"\\
& "}{ENTER}{ENTER}")

これを実行するとどうやら「すべての単語」を実行したのと同じ結果になる。

だからこのコードを悪児さんの「漢字書取問題作成」マクロの頭にくっつければ

OKのはずなのだが・・・

 これで上手くいくほど甘くはあるまい・・・

一太郎マクロ・・・くまぷーならこう作る

 さてWORD FINDを作り終えてしまったので次のお題を考えているのだが

、何がいいだろうか?一太郎の大御所がせっかく「悪児ならこう作る」なんていう

コーナーを作ってくれているのだから、それを意識して「くまぷーならこう作る」と

いうお題はどうだろうか。

 一太郎の大御所である悪児さんが作ったものに対してくまぷー版を提示する。

神をも恐れぬ不遜な考えとお叱りを受け、あるいは失笑されそうだが、

面白そうなので敢えて挑戦してみよう。

 具体的には悪児さんの「漢字書取問題作成」マクロを扱うことにしようか・・・。

これは以前に、くまぷーが悪児さんに作ってもらったマクロである。

せっかく作ってもらったマクロなのだが、一太郎マクロの制限により、

一部満足できないところがある。それをなんとかしてみたい。

 このマクロの仕様を見て欲しい。マクロファイルの説明から引用すると

以下のようになっている。

マクロ名 「漢字書取問題作成」

機能  問題文の中()で囲まれた語句を順に(丸数字+ひらがな)に

置換し、解答(元の漢字)を文末に挿入する。

実行法 対象となる文書を開き、範囲指定して、「ふりがな」-「すべての単語」を

実行してから、マクロを実行する。

メモ  ()数は20まで。
    括弧は、全角の()を使う。
    「すべての単語」実行時に読みを確認する必要はありません。
   平仮名置換時に確認します。
    一太郎2005では「すべての単語」はマクロに対応していないので
   事前に実行しなければなりません。
    なお、マクロ実行中にふりがなはすべて削除されます。

上に書いた「一部満足できない部分」とは『「ふりがな」-「すべての単語」を

実行してから、マクロを実行』しなければならないというところである。

せっかくマクロで自動処理をするのだから、この部分も自動にすることは

できないであろうか?

 大御所が敢えてこの仕様でこのマクロを公開したのだから尋常な

手段でこの部分をどうにかすることはできないであろう。
 
 しかし、盲蛇に怖じずと言われても一太郎マクロ初心者はものが

見えていない故に突き進むのであった・・・。

「漢字書取問題作成」は悪児さんのサイトからダウンロードできます。

番号は042です。

一太郎マクロ・・・悪児ならこう作る

 さて前に一太郎マクロの大御所悪児さんからメールを

頂いたということを書いた。あちらのサイトを覗いてみると

12月5日現在で以下の3つのマクロが登録されている。

1.アルファベットアトランダム入力
2.文字列取得
3.リスト単語降順ソート

 さすがに大御所だけのことはある。手慣れたものだ。

学ぶところは多々あるのだがその中でも特に注目したいのは

カーソルの移動である。前回書いたことだがワープロマクロを

自由に操るのに一番大切なことは文字の書き込みと

文字の読み取りである。

 文字の書き込みにはInsert()、読み取りにはGetCharacter()、

またはGetString()なのだが、一太郎マクロではカーソル位置に

文字を書き込み、カーソル位置の文字を読み取る仕様なのであるから

カーソルの移動が一太郎マクロを操る際のポイントとなる。

 そういうわけで一太郎マクロの極意はカーソルの移動にあると言っても

差し支えあるまい。

 悪児さんのコードからカーソルの移動のノウハウを頂くとしよう・・・。

2007年6月 1日 (金)

一太郎マクロ・・・WORD FIND公開

 いよいよ、WORD FIND完成版の公開だ。実はいよいよ、と言っているが

とうの昔に出来上がっていたのだ。だから、今コードを見直してみると

気持ちの悪い部分もあるのだが、一太郎マクロ処女作ということで

敢えて手直しせずに公開することにした。下がそのキャプチャー画面である。

Taro_macro0101 *

*

*

*

*

*

*

*

*

*

*

免責: このマクロの使用によっていかなる損害が生じようと、一切責任は負いません。あらかじめご承知の上ご使用下さい。
マクロ名: 「WORD FIND」
機能: リストに入力した単語を12×12のマス目にランダムに配置する。
詳細: 単語は20個まで。
単語配置は右から左、左から右、上から下、下から上、右下から左上、左上から右下、左下から右上、右上から左下の8方向にランダムに配置する。
ブランクのマスにはオプションでランダムにアルファベットを配置する。
実行法: 右上の「★実 行★」ボタンをクリックする。

以下がそのコードだ。

declare variable $MyCell(1 To 12, 1 To 12)
%TopWall = 1
%BottomWall = 12
%LeftWall = 1
%RightWall = 12
%LoopCountMax=100

!!単語の長さを取得する
SetLength


!!単語を長い順にソートする
For %i = 1 to 20-1
    For %j = %i + 1 To 20
       If $Length(%i) < $Length(%j) Then
            %Temp =$MyWord(%i)
            $MyWord(%i) = $MyWord(%j)
            $MyWord(%j) = %Temp
            %TempNum =$Length(%i)
            $Length(%i) = $Length(%j)
            $Length(%j) = %TempNum

        End If
     Next
Next

!!単語、既データ消去
ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)
For %i = 1 To 20
    削除(.回数=12)
    Insert($MyWord(%i))
    DownCell
Next

!!単語の長さ、既データ消去
ジャンプ(.ページ番号=1,.行番号=5,.文字位置=69)
For %i= 1 to 20
    削除(.回数=2)
    Insert($Length(%i))
    DownCell()
Next

!!単語をメモリ上のセル%MyCellに書き込む
%LoopCount=1
Do

   %WordNum = 1

    For %i = 1 To 30000
       If %WordNum = 20+1 Then !!20はwordの最大数
          Exit Do
       End if

!!%LoopCountMaxに達しても回答例が見つからないときの処理--開始--
       If %LoopCount = %LoopCountMax Then
          %para = {.Title = "回答例が見つかりません。", .Icon = 3, .Button = 5}
          %Ans = MsgBox("処理を続けますか?", %para)



          If %Ans = 6 Then !! 6は「はい」
             %LoopCount = 0
          Else
             Stop
          End If
       End If
!!%LoopCountMaxに達しても回答例が見つからないときの処理--終了--

%Str = $MyWord(%WordNum)

Randomize(ThisTime())

%X = Int(Rand() * 12) + 1
%Y = Int(Rand() * 12) + 1
Randomize(ThisTime()) !!8方向
%Dir = Int(Rand() * 12)+1
%Length = Len(%Str)
%CanPlace = True
Select Case %Dir
   Case 1 !!Bottom to Top
      If %Y - %Length + 1 >= %TopWall Then
         For %DY = %Length To 1 Step -1

          If $MyCell(%Y - %DY + 1, %X) <> "" And $MyCell(%Y - %DY + 1, %X) <> Mid(%Str, %DY, 1) Then
             %CanPlace = False


             Exit For
           End If
          Next

        If %CanPlace = True Then
             For %DY = %Length To 1 Step -1
                $MyCell(%Y - %DY + 1, %X) = Mid(%Str, %DY, 1)

             Next
             %WordNum = %WordNum + 1

        End If
End If

    Case 2 To 3 !!LeftBottom to RightTop
       If %Y - %Length + 1 >= %TopWall Then
          If %X + %Length - 1 <= %RightWall Then
            For %DY = %Length To 1 Step -1
              For %DX = 1 To %Length
                 If $MyCell(%Y - %DY + 1, %X + %DX - 1) <> "" And $MyCell(%Y - %DY + 1, %X + %DX - 1) <> Mid(%Str, %DY, 1) Then


                   %CanPlace = False
                   Exit For
                 End If
              Next
            Next

       If %CanPlace = True Then
           For %DY = %Length To 1 Step -1

             $MyCell(%Y - %DY + 1, %X + %DY - 1) = Mid(%Str, %DY, 1)

           Next
             %WordNum = %WordNum + 1

       End If
   End If
End If
    Case 4 !! Left to Right
                                                                                                                       If %X + %Length - 1 <= %RightWall Then
For %DX = 1 To %Length

If $MyCell(%Y, %X + %DX - 1) <> "" And $MyCell(%Y, %X + %DX - 1) <> Mid(%Str, %DX, 1) Then
%CanPlace = False
Exit For
End If
Next

If %CanPlace = True Then
For %DX = 1 To %Length
$MyCell(%Y, %X + %DX - 1) = Mid(%Str, %DX, 1)

Next

%WordNum = %WordNum + 1

End If
End If
Case 5 To 6 !!LeftTop to RightBottom
If %X + %Length - 1 <= %RightWall Then
If %Y + %Length - 1 <= %BottomWall Then
For %DX = 1 To %Length
For %DY = 1 To %Length
If $MyCell(%Y + %DY - 1, %X + %DX - 1) <> "" And $MyCell(%Y + %DY - 1, %X + %DX - 1) <> Mid(%Str, %DY, 1) Then
%CanPlace = False
Exit For
End If
Next
Next

If %CanPlace = True Then
For %DX = 1 To %Length
$MyCell(%Y + %DX - 1, %X + %DX - 1) = Mid(%Str, %DX, 1)


Next
%WordNum = %WordNum + 1

End If
End If
End If
Case 7 !! Top To Bottom
If %Y + %Length - 1 <= %BottomWall Then

For %DY = 1 To %Length

If $MyCell(%Y + %DY - 1, %X) <> "" And $MyCell(%Y + %DY - 1, %X) <> Mid(%Str, %DY, 1) Then
%CanPlace = False
Exit For
End If
Next

If %CanPlace = True Then
For %DY = 1 To %Length
$MyCell(%Y + %DY - 1, %X) = Mid(%Str, %DY, 1)

Next
%WordNum = %WordNum + 1

End If
End If


Case 8 To 9 !!RightTop to LeftBottom
If %X - %Length + 1 >= %LeftWall Then
If %Y + %Length - 1 <= %BottomWall Then
For %DX = %Length To 1 Step -1

For %DY = 1 To %Length

If $MyCell(%Y + %DY - 1, %X - %DX + 1) <> "" And $MyCell(%Y + %DY - 1, %X - %DX + 1) <> Mid(%Str, %DX, 1) Then
%CanPlace = False
Exit For
End If
Next
Next

If %CanPlace = True Then
For %DX = %Length To 1 Step -1
$MyCell(%Y + %DX - 1, %X - %DX + 1) = Mid(%Str, %DX, 1)

Next
%WordNum = %WordNum + 1

End If
End If
End If

Case 10 !! Right to Left
If %X - %Length + 1 >= %LeftWall Then
For %DX = %Length To 1 Step -1

If $MyCell(%Y, %X - %DX + 1) <> "" And $MyCell(%Y, %X - %DX + 1) <> Mid(%Str, %DX, 1) Then
%CanPlace = False
Exit For
End If
Next


If %CanPlace = True Then
For %DX = %Length To 1 Step -1
$MyCell(%Y, %X - %DX + 1) = Mid(%Str, %DX, 1)

Next
%WordNum = %WordNum + 1

End If
End If
Case 11 To 12 !! RightBottom to LeftTop
If %X - %Length + 1 >= %LeftWall Then
If %Y - %Length + 1 >= %TopWall Then
For %DX = %Length To 1 Step -1
For %DY = %Length To 1 Step -1
If $MyCell(%Y - %DY + 1, %X - %DX + 1) <> "" And $MyCell(%Y - %DY + 1, %X - %DX + 1) <> Mid(%Str, %DX, 1) Then
%CanPlace = False
Exit For
End If
Next
Next


If %CanPlace = True Then
For %DX = %Length To 1 Step -1
$MyCell(%Y - %DX + 1, %X - %DX + 1) = Mid(%Str, %DX, 1)

Next
%WordNum = %WordNum + 1


End If
End If
End If
End Select
Next



%LoopCount = %LoopCount + 1

Loop
%para = {.Title = "回答例が見つかりました。", .Icon = 3, .Button = 5}
%Ans = MsgBox("空白をアルファベットで埋めますか?", %para)
!!SlamIt
If %Ans=6 Then
FillBlank
End If
SlamIt


Sub SetLength
ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)

For %y = 1 to 20
%Str=""
For %x = 1 to 12
%S = GetCharacter()
If %S= " " Or %S = " " Then
Exit For
End If

%Str = %Str & %S
Next
$MyWord(%y)=%Str
$Length(%y) = Len(%Str)
ジャンプ(.ページ番号=1,.行番号=(5+%y),.文字位置=44)
Next

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=68)
For %i= 1 to 20
削除(.回数=2)
Insert($Length(%i))
DownCell()
Next

End Sub


sub FillBlank
ジャンプ(.ページ番号=1,.行番号=4,.文字位置=2)
範囲選択開始(.単位=1)
範囲選択単位(.単位=7)
ジャンプ(.ページ番号=1,.行番号=15,.文字位置=73)
削除(.回数=1)


For %Y = 1 To 12
  For %X = 1 To 12
    Randomize(ThisTime())
    %num = Int(Rand() * 26) + 97
    If $MyCell(%Y, %X)="" then
      $MyCell(%Y, %X)= Char(%num)
    End If


  Next
Next
end sub

sub SlamIt
ジャンプ(.ページ番号=1,.行番号=4,.文字位置=2)
範囲選択開始(.単位=1)
範囲選択単位(.単位=7)
ジャンプ(.ページ番号=1,.行番号=15,.文字位置=73)
削除(.回数=1)


For %Y = 1 To 12
  For %X = 1 To 12
    Randomize(ThisTime())
    %num = $MyCell(%Y, %X)
    Insert(%num)
    if %X < 12 Then
      RightCell()

    End If
  Next
  DownCell
  LeftCell(11)
Next
end sub

WORD_FIND06.lzhをダウンロード

2007年5月31日 (木)

一太郎マクロ・・・ユーザの入力を受け取る

 WORD FINDはオプションで空白のマス目に無作為にアルファベットを

書き込むかどうかをユーザが決められるという仕様である。

このことはこの「★一太郎マクロ初心者奮戦記★」の始めに明記してある。

 エクセルやワードならばシートにチェックボックスをちょちょいと配置できるのだが

一太郎にはそのような機能は無いようだ。仕方がないのでメッセージボックスを

使うことにした。ヘルプでメッセージボックスの使い方を調べてみると

けっこう使えそうだということがわかった。一番簡単な使い方は以下の書式である。

            MsgBox("世界よ、こんにちは!!")

これを実行すると下のようなウインドウが表示される。

Taro_macro0071 *

*

*

*

*

これでは単にメッセージを表示するだけなのでもうひと手間かけて

以下のようなコードにする。

%para = {.Title = "回答例が見つかりました。", .Icon = 3, .Button = 5}
%Ans = MsgBox("空白をアルファベットで埋めますか?", %para)
If %Ans=6 Then
   
 !!ここに空欄をランダムな
    !!アルファベットで
    !!埋める処理を記述する

End If

上のコードを実行すると下のようなウインドウが表示される。

Taro_macro0081 *

*

*

*

これでユーザに選択させればよいだろう。

ちなみに.Icon = 3は「問い合わせ」を、.Button = 5は「はい」、「いいえ」ボタンを

表示させる。フラグである。そして%Ans=6は「はい」ボタンが選択されたことを示し、

%Ans=7は「いいえ」ボタンが選択されたことを示している。

2007年5月30日 (水)

一太郎マクロの大御所からメールが・・・(゚゚;)エエッ

一太郎マクロと言えばあの方・・・そう1.3マクロ館の悪児さんからメールが来てしまいました。この方は一太郎の発売元であるJUSTSYSTEMから一太郎キングの称号を得ているほどの大物です。とても一太郎初心者の及ぶような方ではございません。

 以下が悪児さんからのメールです。


こんばんは。
WORD FIND&一太郎マクロ初心者奮戦記ですが、
とても面白いですね。(いろんな意味で (^^;)(^^;))

で、うまく、コラボレートできたら、
より面白くなりそうです。

例えば、
13マクロ館で、悪児なら、こうする、
というコーナーを作って、
悪児版を紹介させていただく。
とか。

また、逆に、
マクロ館で悪児が、Excelマクロを作って、
それをくまぷーさんが、くまぷー版を作って、
くまぷーのエクセル道場で紹介する、
というのも、平行してやったら、
面白そうですが・・・(^^)ゞ


悪児

 悪児さん登場となると一太郎マクロ初心者の拙さが目立ってしまうけど面白そうなので、是非やってくださいと返事をしました。

下が悪児さんの1.3マクロ館のアドレスです。
「悪児ならこう作る」のコーナーをみなさん、是非ご覧下さい。
くまぷーも勉強させてもらいます。(^。^)

http://homepage3.nifty.com/r-watanabe/index.htm

そして一太郎マクロファンの方、掲示板にご意見等を頂けたら幸いです。

2007年5月29日 (火)

一太郎マクロ・・・マス目に単語をランダムに並べる(4)

  単語をマス目に配置するときのもう一つの問題は上書きの問題だ。

前にも書いたが、例えばkumapoohという単語がすでに配置されていて、

その後にbebechanという単語を書き込むとする。

bebechanがkumapoohに重なるとkumapoohの一部、または

ぜんぶbebechanという単語が上書きしてしまう。

こういう事態をさけて単語を配置しなければならない。

 単語を書き込めるか否かの判定基準を整理すると以下のようになるだろう。

(1)マスが空白の場合は文字を書きこめる。

(2)マスが空白でない場合は、既に書かれている文字が

     これから書き込む文字と同じならば文字を書き込める。

具体的なコードは以下のようになるだろう。書き込み8方向のうち、

左下から右上に単語を書き込む場合を例示することにした。

残りのの7方向についても本質的には変わるものではない。

注:%Star:書き込もうとする単語の文字列
   %CanPlace:単語を書き込めるか否かを示すフラグ。Trueなら書き込める。
   %WordNum:書き込んだ単語の数。

%CanPlace = True

!!書き込めるか否かを調べる。書き込めなければ
!!フラグ%CanPLaceをFalseにする。


For %DY = %Length To 1 Step -1
   For %DX = 1 To %Length
       If $MyCell(%Y - %DY + 1, %X + %DX - 1) <> "" And $MyCell(%Y - %DY + 1, %X + %DX - 1) <> Mid(%Str, %DY, 1) Then

         %CanPlace = False
         Exit For
       End If
   Next
Next



!!フラグ%CanPlaceがTrueなら実際に書き込む。
If %CanPlace = True Then
   For %DY = %Length To 1 Step -1
      $MyCell(%Y - %DY + 1, %X + %DY - 1) = Mid(%Str, %DY, 1)

   Next
   !!単語を書き込んだら%WordNumに1を加算する。
   %WordNum = %WordNum + 1

End If

2007年5月28日 (月)

一太郎マクロ・・・マス目に単語をランダムに並べる(3)

単語をマス目の中に書き込んでいくために、まずマス目を表す変数を用意する。それが下だ。

declare variable $MyCell(1 To 12, 1 To 12)

 「12×12のマスにランダムにアルファベットを表示する・・・」のときは直接、一太郎ファイル上のマス目に書き込んだのだが、今回はメモリ上にマス目$MyCellを作ってそこに書き込むことにする。「12×12のマスにランダムにアルファベットを表示する・・・」のときはランダムにアルファベットを書き込むだけだったが、今回はそれだけでは済まない。いろいろ、チェックしなければならないことがあるのだ。一太郎上のマス目に書き込んだり、消去したりを繰り返すのは時間がかかって効率が悪い。場合によっては書き込んだり消したりを見えるようにすると、いかにもコンピュータが単語の配置を考えているようで面白いので、メモリ上で操作しないでその作業をユーザに見せることもするのだが、どうもくまぷーの許容範囲を超えるほど一太郎マクロは遅いようだ。

 それはきっと変数が基本的にはグローバルとローカルの2種類しかない、プログラマはプログラム作成時に変数の型を全く考える必要がない、という一太郎マクロの仕様によるものだろう。他の言語ではプログラマが負担している部分をマクロ言語が負担しているのだから遅いのも仕方がないのかもしれない。

 さてそれでは実際にコードを考えてみよう。単語をマス目の中に書き込んでいくために、まず乱数で始点を決める。これは下のように座標を決めてやればよいだろう。

Randomize(ThisTime())

%X = Int(Rand() * 12) + 1
%Y = Int(Rand() * 12) + 1

しかし、これだけだけでは十分ではない。単語はマス目からはみ出さないように配置しなければならない。単語配置時にはまず、その判定をしなければならない。

さらにもう一つ面倒なことがある。何も考えずに配置してしまうと後に配置する単語が、その前に配置されていた単語を上書きしてしまうということだ。例えばkumapoohという単語がすでに配置されていて、その後にbebechanという単語を書き込むとする。bebechanがkumapoohに重なるとkumapoohの一部、またはぜんぶbebechanという単語が上書きしてしまう。こういう事態をさけて単語を配置しなければならない。

まずははみ出しの判定から。はみ出しの判定は8通りあるのだが、ほとんど同じになる。下は単語を左下から右上に配置するコードだ。

%TopWall = 1
%BottomWall = 12
%LeftWall = 1
%RightWall = 12


If %Y - %Length + 1 >= %TopWall Then  !!%Lengthは単語の長さ
     If %X + %Length - 1 <= %RightWall Then
          
 !!ここで重なりを判定して、
           !!単語を左下から右上に配置する処理

     End If
End If

次回は重なりを判定して単語を書き込む処理を考えることにする。

2007年5月27日 (日)

一太郎マクロ・・・マス目に単語をランダムに並べる(2)

前回、12×12のマスに12文字の単語をランダムに並べる場合、

水平・垂直方向には48通りの並べ方があるのに対し、斜め方向には

たったの4通りしか並べ方がないということを指摘した。もちろん、それでも

構わないというのならば、前回の方針を変える必要はない。しかし、ここでは

もう少し、斜め方向に単語が並ぶ可能性を増やすために少しばかり

コードを弄ってみることにした。それが下記のコードである。

Randomize(ThisTime())
%Dir = Int(Rand() * 12)+1 !!8方向

Select Case %Dir
     Case 1
          !!下から上方向に単語を配置する処理を記述
     Case 2 To 3
          !!下から上方向に単語を配置する処理を記述
     Case 4
          !!下から上方向に単語を配置する処理を記述
     Case 5 To 6
          !!下から上方向に単語を配置する処理を記述
     Case 7 !!
          !!下から上方向に単語を配置する処理を記述
     Case 8 To 9
          !!下から上方向に単語を配置する処理を記述
     Case 10
          !!下から上方向に単語を配置する処理を記述
     Case 11 To 12
          !!下から上方向に単語を配置する処理を記述
End Select

 さて次回は実際に単語を配置する記述です。

この辺りはちょっと面倒かもしれませんが、けっこう面白いところだと思います。

(●`ε´●):適当なところを単語配置の始点にすると単語が

       マス目からはみ出しちゃうし・・・

【´・ω・`】:面倒なのはそれだけじゃないよ・・・でも、どうやってやれば良いかを

      考えるのが楽しいんだよね。

2007年5月25日 (金)

一太郎マクロ・・・マス目に単語をランダムに並べる

 プログラム的には山場がやってきたようだ。単語配置は右から左、

左から右、上から下、下から上、右下から左上、左上から右下、

左下から右上、右上から左下の8方向にランダムに配置する。

 そのためには大雑把に言うと1~8までの乱数を生成し、

Select Case文で処理を分岐すればよいだろう。以下が大雑把では

そのコードだ。

!!変数%Dirにより単語の配置方向をランダムに変化させる

Randomize(ThisTime())
%Dir = Int(Rand() * 8)+1 !!8方向

Select Case %Dir
     Case 1
          !!下から上方向に単語を配置する処理を記述
     Case 2
          !!左下から右上方向に単語を配置する処理を記述
     Case 3
          !!左から右方向に単語を配置する処理を記述
     Case 4
          !!左上から右下方向に単語を配置する処理を記述
     Case 5
          !!上から下方向に単語を配置する処理を記述
     Case 6
          !!右上から左下方向に単語を配置する処理を記述
     Case 7
          !!右から左方向に単語を配置する処理を記述
     Case 8
          !!右下から左上方向に単語を配置する処理を記述
End Select

 単純にいえば単語の配置方向をランダムに変化させることについては

これでいいのだが、上記のコードでは単語が斜めに配置される確率が、

水平・垂直に配置される確率に比べて極端に小さくなってしまう。

 例えばFrankenstein(12文字)という単語をを12×12のマス目に配置する場合。

水平方向
   右から左:12通り
   左から右:12通り

垂直方向
   上から下:12通り
   下から上:12通り

なのに対して

斜め方向
   右上から左下:1通り
   右下から左上:1通り
   左上から右下:1通り
   左下から右上:1通り

ということで48通り対4通りになってしまう。垂直方向、水平方向が48通り

なのに対して斜め方向ではたったの4通りしかないのだ。

次回はこの辺りを改善したい。

2007年5月21日 (月)

一太郎マクロ初心者奮戦記Ⅱ・・・リストの単語を降順にソートする(2)

★コード解説(コード全体は「リストの単語を降順にソートする(2)」を

参照)

 まず1行目のSetLengthでサブプローシージャSetLength(下記)を呼び出している。

Sub SetLength
ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)

For %y = 1 to 20
    %Str=""
    For %x = 1 to 12
        %S = GetCharacter()
        If %S= " " Or %S = " " Then
            Exit For
        End If
        右
        %Str = %Str & %S
    Next
    $MyWord(%y)=%Str
    $Length(%y) = Len(%Str)
    ジャンプ(.ページ番号=1,.行番号=(5+%y),.文字位置=44)
Next

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=68)
For %i= 1 to 20
    削除(.回数=2)
    Insert($Length(%i))
    !!ジャンプ(.ページ番号=1,.行番号=(5+%i),.文字位置=69)
    DownCell()
Next

End Sub

これは前々回の「カーソル位置の文字を取得するには(2)」で

紹介したものと基本的に同じである。

 やっていることは

(1)グローバル変数$MyWord()にリストの単語を格納する。
(2)各単語の長さを列「Length」に書き込む。

の2点である。この前処理のあとメインルーチンの2行目に戻る。

以下の部分がソートの心臓となる部分だ。

For %i = 1 to 20-1
    For %j = %i + 1 To 20
        If $Length(%i) < $Length(%j) Then
            %Temp =$MyWord(%i)
            $MyWord(%i) = $MyWord(%j)
            $MyWord(%j) = %Temp
            %TempNum =$Length(%i)
            $Length(%i) = $Length(%j)
            $Length(%j) = %TempNum
        End If
    Next
Next

やっていることは至極単純だ。1つめの単語の長さと2つめの単語の長さを

比べて、もしも1つめの単語のよりもと2つめの単語の方が長ければ

その位置を入れ替える、ということを繰り返してやっているに過ぎない。

 冒頭ににも書いたがこの辺りは一太郎マクロに特有の考えではない。

従ってこの辺りのことを詳しく知りたければ参考資料はいくらでも簡単に

手に入る。よくわからなければ各自で研究して欲しい。

 さて、ここまでできてしまえばソートした結果を所定の位置に

出力するだけである。まず、下記のコードでソートした単語を「WORD LIST」の

列に書き込み・・・、

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)
For %i = 1 To 20
    削除(.回数=12)
    Insert($MyWord(%i))
    DownCell
Next

次のコードで「Length」の列に単語の長さを書き込んでプログラムは終了となる。

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=69)
For %i= 1 to 20
    削除(.回数=2)
    Insert($Length(%i))
    DownCell()
Next

上記のコードはサンプルファイルのなかに「Main」という名前の

マクロとして登録されている。

WORD_FIND03_1.lzhをダウンロード

2007年5月20日 (日)

一太郎マクロ初心者奮戦記Ⅱ・・・リストの単語を降順にソートする(1)

 カーソル位置を取得するには(1)~(4)でリストに載っている単語の長さを取得するプログラムを作成した。

 なぜ、このようなことをしたかというと、単語を長い順にソートするためである。リスト上の単語をマス目に並べる際に長い単語から先に並べていった方が効率がよい。

 こういうことは、多少プログラム作成をしたことがある方なら経験的にもすぐにわかるであろう。したがって今回はリスト上の単語を降順にソートするプログラムを作ることにする。

 よって今回は特に一太郎マクロに特有の知識は何も必要としない。ありきたりのソートのアルゴリズムを使うだけである。

 それではプログラムの全体像を始めにお見せしよう。

SetLength
For %i = 1 to 20-1
    For %j = %i + 1 To 20
        If $Length(%i) < $Length(%j) Then
            %Temp =$MyWord(%i)
            $MyWord(%i) = $MyWord(%j)
            $MyWord(%j) = %Temp
            %TempNum =$Length(%i)
            $Length(%i) = $Length(%j)
            $Length(%j) = %TempNum
        End If
    Next
Next

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)
For %i = 1 To 20
    削除(.回数=12)
    Insert($MyWord(%i))
    DownCell
Next

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=69)
For %i= 1 to 20
    削除(.回数=2)
    Insert($Length(%i))
    DownCell()
Next

Sub SetLength
ジャンプ(.ページ番号=1,.行番号=5,.文字位置=44)

For %y = 1 to 20
    %Str=""
    For %x = 1 to 12
        %S = GetCharacter()
        If %S= " " Or %S = " " Then
            Exit For
        End If
        右
        %Str = %Str & %S
    Next
    $MyWord(%y)=%Str
    $Length(%y) = Len(%Str)
    ジャンプ(.ページ番号=1,.行番号=(5+%y),.文字位置=44)
Next

ジャンプ(.ページ番号=1,.行番号=5,.文字位置=68)
For %i= 1 to 20
    削除(.回数=2)
    Insert($Length(%i))
    !!ジャンプ(.ページ番号=1,.行番号=(5+%i),.文字位置=69)
    DownCell()
Next

End Sub

解説は次回にします。まずは

サンプルファイルをダウンロードしてマクロを

動かしてみてください。

WORD_FIND03_1.lzhをダウンロード

2007年5月17日 (木)

一太郎マクロ初心者奮戦記Ⅱ・・・Word Find作成編開始

 一太郎マクロ初心者奮戦記Ⅱ・・・始まった。テーマは一太郎マクロを

使って何かまとまったものを作ろう、ということだ。具体的に言えば

以下の仕様で「Word Find」なるものを作る。

    名前:WORD FIND

    機能:リストに入力した単語を12×12のマス目に

        ランダムに配置する。

    詳細:単語は20個まで。

       :単語配置は右から左、左から右、上から下、下から上、

       右下から左上、左上から右下、左下から右上、右上から

       左下の8方向にランダムに配置する。

       :ブランクのマスにはオプションでランダムにアルファベットを配置する。

   使用ソフト:一太郎2005

とりあえず、12×12のマスと単語リストを作ってみた。

罫線機能を使っただけだけど・・・イメージはこんなかんじかな...

Word_find0001_2   

2007年5月16日 (水)

一太郎マクロ初心者奮戦記Ⅱ・・・一太郎マクロを学ぶメリットは?

 「一太郎マクロを勉強したいのだが、何か参考となる書籍があれば教えて欲しい」というような書き込みを他の掲示板でたまに見かける。一太郎そのものに関する書籍でさえ、ほとんど市販されていないのだからマクロに関する書籍など皆無である。需要もほとんど無いだろうからJUST SYSTEMもこれから、新しく発行する気などさらさら無いであろう。

 そもそも多くの教員がワープロを使っているような場面ではマクロによる処理がどうしても必要になるような事態はほとんど考えられない。その昔はマクロに頼らなければならなかったようなことも標準機能が充実してきているので、いちいちマクロを組まなくても済んでしまう・・・。

 例えば文書の中からある文字を検索して書体を変えたいとする。
そんなことは手作業でもできる!!
 たとえその作業に数時間かかったとしても新にマクロを勉強して、そのマクロが正しく動作するか検証する時間までを考えれば、多くの場合
手作業の方が遙かに効率が良い!!
 というのが本当のところなのではないだろうか?くまぷーは敢えてここで断言する!
多くの教員にとって
一太郎マクロを新に学ぶメリット
は何一つ無い!!
 
 それではくまぷーが今回、一太郎マクロに費やした時間は全くの無駄だったのか?実を言えば無駄どころか、一太郎マクロのお蔭で非常に楽しい時間を過ごすことができた。それは未知の言語を学ぶことは知らない町を旅するような気分にさせてくれるからだ。それも一太郎マクロの場合はガイドブックには書かれていない町を・・・。
 Excel VBAじゃ本屋に行けばガイドブックが山のように売っていて簡単に手に入る。一太郎マクロではそうは行きません。
 一太郎マクロが
楽しくないわけないじゃありませんか?!
(^。^)