忍者ブログ
おかげさまでspamコメントが増えてきましたので、一応コメントを承認制にしました。基本的には承認します。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ちょっと褒めて終わりましょう、ということで一日二回更新。極端。

内省報告でもなんでもいいんですが、何かしらテキストで回答したものを、エクセルに自動的にはっつけるスクリプトです。これは多分、うまく使えば結構便利だと思います。

set questionList to {"本日の体調は?", "本日の実験に対する感想は?", "次に参加する際の連絡先は?"}
--質問のリスト。{}内に、要素をコンマで区切って並べると、リスト内要素になります。
set answerList to {}
--回答のリストを入れるための変数を作っておく
repeat with i from 1 to number of questionList
--質問リストの個数分繰り返す
display dialog item i of questionList default answer "" buttons {"Answer", "Cancel"} with icon 1 default button 1 with title "内省報告" cancel button "cancel"
--質問リストのi個目を、dialogに出す。default answerは空。[Answer]と[Cancel]ボタンを入れる。ひとつめ(Answerの方)のボタンをデフォルトにする。タイトルは"内省報告"。"cencel"の方は、cancelボタンにする。
set end of answerList to text returned of the result as Unicode text
--結果として、テキストに入力したものを、answerListの最後に入れる(Unicode textとして)
end repeat
--繰り返しおわり

tell application "Finder"
--Finderを呼び出す
open application "Microsoft Excel"
--Excelを開く
tell application "Microsoft Excel"
--Excelをactivate
make new workbook
--新しいworkbookを開く
repeat with i from 1 to number of answerList
--answerListの個数分繰り返し
set formula of column 1 of row i to item i of answerList
--answerListのi個目のアイテムを、excelの開いたシートの1列目のi行目に入れる
end repeat
--繰り返し終わり
end tell
--Excelのactivate終わり
end tell
--Finderのactivate終わり
ボタンをあれこれ弄ると、五件法で回答させたりもできるかも。あと、たとえばこっちでsubject numberとかを入れておくと、記録するシートを開いて、subjectnumberに対応するセルにデータをだーっと入れて行く、ということも可能かも。

もう多分applescript記事は当分書きません。

拍手[0回]

PR

もともとVBAが使えていたんですか,というと使えていなかったんですが,ともあれexcel2008ではVBAが使えない(んですよね?),ということで,ちょっとapplescriptを試してみたので覚え書きです。参考にしたのは,microsoftの Offcie 2008 Developersとか,excel applescript (PDF)とか。後者の元のページがどこかが良くわからないです…

さて,まずは"tell"。

tell application "Microsoft Excel"

なんのアプリケーションに対して以下のスクリプトを実施するのか?ということを,tell x で明示する必要があるようです。まずはExcelを使うのでこういう形ですが,Excelそのものの中でも,

tell sheet "sheetname" of active workbook
などとして使います(この場合は,どのワークシートを使うか,ということで,こっちの方が有用ですね)。あ,"active"というのは,今動かせるやつ,的な意味ですね(たとえば,複数のワークブックを開いていれば,一般的には「最後の奴」だったり,「今クリックした奴」だったりするアレです)。

次に,"set x to y"。

set name of active sheet to "50ms"
のように使います。基本的には,いわゆる「変数」でして,xにyを代入する,ということなのですが,Excelのセルやシートの名前にも適用できることになります。新しいファイルを開くと,"sheet1"があると思いますが,上記スクリプトによって,sheet1の名前が50msに変わる,というわけですね。たとえば。まだ試しては無いのですが,set X to {a,b,c,d,e}とすれば,Xの中にリストの形で変数を設定することができます。1 of Xとかにすると,aを呼び出せるということのようですね。

また,これはこのまんま覚えていただくとして,

make new worksheet at active workbook with properties ¬
{name:"(150ms)", display page breaks:false}
というので新しいシートを作成することができます。¬←これは読み方が良くわからないのですが,alt+Lで出ると思います。{}内にもう少し色々なプロパティが設定できるようですが,とりあえず name:"sheetname"で,ダブルクオーテーション内の名前が新しいシートの名前になります。

コピーについては,いくつかのやり方があり,最もシンプルなやり方は,

copy X to Y
で,Xをコピーし,Yにペーストするというものです。ここで,X(あるいはY)の設定は,
column A of row b
のように,セルの位置を左上を基点として呼び出す方法と,
range "An:Xm"

というように,セル名をrangeで呼び出す方法があるようです。この場合は,copy range (rangeを指定)というコマンドになるので,実際は
copy range (range "A1:A10")
のようになります。更に,より詳細にどこからコピーするかを明白にすることもできます。たとえば,
copy range (range "A1:A10" of sheet "sheetname" of active workbook)
のように。rangeの場合,コピー先は,多分頭のセルだけを設定すれば良いように思います。

とりあえずコピーだけしておいて,ペーストは別にする,ということも可能です。この場合は,

paste worksheet destination range "A3"
とすれば,A3を基点として,コピーしておいたレンジを張り付けることができます。別のシート等にペーストをする場合は,その前に,
tell sheet "sheetname" of active workbook
として,ペースト先のシートを明示しておきましょう。

ある式を特定のセルに入れるためには,次のようにします。

set formula of range "A1" of active sheet to "-199.795"
"formula"というのが良くわからないのですが,これがないと,range "A1" of active sheetという「変数」に"-199.795"という値を書き込むよ,という話になってしまい,セルに記入してもらえません。

また,この値に1000/600を足し続ける,だとか,ある列のセルを加算したものを下に並べていく,というときには,もっと良い解があるかもしれませんが,とりあえずrepeat処理を使うのが便利です。まず例を出しますと

repeat with i from 1 to 422
set formula of column 1 of row (i + 1) of active sheet to "=A" & i & "+1000/600"
end repeat
とすれば,さっき設定したA1の値に,1000/600を延々と足し続けるということが可能です。具体的に説明しますと,
repeat with i from 1 to 422
というのは,iという変数に,1から422の数字を入れます,ということですね。これは別に1から始まらなくても良いようです。次の,
set formula of columun 1 of row(i+1) of active sheet to
までをまず説明すると,今のシート(active sheet)の一列目,(i+1)行目に,to以下のものを入れていきますよ,ということになりますよね。iは1から422でしたから,2から423の値が入りますよ,ということになります。次に,
"=A"&i&"+1000/600"
というのは,かなり苦肉の策なんですが…。やりたいことは,ひとつ上のセルの値に1000/600を足したいということです。つまり,A1セル(-199.795)以下は,A2セルに=A1+1000/600,A3セルに=A2+1000/600…といれていきたいんですね。普通にエクセルシート上であれば,$なしでコピペしていけばできるわけですが,applescriptでそれを実装するためにどうしたか,ということですね。ダブルクオーテーションで囲むと「文字列」として認識され,囲まないと変数(設定していれば)として認識されるはず,さらに文字列と変数を,&で繋ぐことができますよ,ということだったので,結局入れたい式のうち変わっているのはAの後にくる数字だけということなので,
"=A"にi(数字)を入れて,その後に,"+1000/600"をつなげますよ
ということになるわけです。うーん,うまく説明できない…。最後の
end repeat
というのは,ここまでで「repeat」が終わりですよ,ということで,まあこれはおまじないですね。

特定の行のデータを平均した,新たな行を作りたい,とかいう場合は,おそらく

repeat with i from 1 to 100
set formula of column 10 of row i to "=average(A"&i&",B"&i&",D"&i&",E"…&i&")"
end repeat
とかになるでしょうか。とりあえず使えるようになったところはこんなところです。誤解もあるかもしれませんので,詳しい方で気が向いたらいろいろ教えていただければと思います。

今日の結論:matlabを使った方が早いよ

拍手[1回]



忍者ブログ [PR]
カレンダー
04 2017/05 06
S M T W T F S
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
メールはこちらから
プロフィール
HN:
渡辺隼人
性別:
男性
ブログ内検索
カウンター
コガネモチ