忍者ブログ
おかげさまでspamコメントが増えてきましたので、一応コメントを承認制にしました。基本的には承認します。
[368] [367] [366] [365] [364] [360] [363] [361] [359] [358] [357]
×

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

もともと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

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


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