Archive for the 'Excel 2008' Category

2009/12/22 Excel選択範囲から各種文字列長のデータをピックアップ v6

Excel上の選択範囲から、各種文字列長のデータをピックアップするAppleScriptです。

Excel上に日本人の名前が姓と名の間に半角スペースが入った状態で並んでいたとして……諸般の都合でこれを姓1文字+名1文字のパターン、姓1文字+名2文字のパターンなど……さまざまな文字長に場合分けして、それぞれの文字長に最初に合致したデータをピックアップする、というものです。

excel1.jpg

Excelからデータを取得してはいますが、実際にはリストに突っ込んでゴリゴリ回しています。処理速度の向上のためにa reference toで高速化を行っており、これによって10倍以上は高速化できています(多くて数百件ぐらいのデータを処理していたので、割とすぐに結果が返ってきます@Core 2 Duo 2.4GHz)。

これも、最初は手作業で行っていたのですが、「そのぐらい、プログラムで処理すれば一瞬だ!」とブチ切れて、すぐに最初の試作品を作成。運用しているうちに、どんどん改良を加えて、半日もたたないうちにここまで機能が追加されました。

スクリプト名:Excel選択範囲から各種文字列長のデータをピックアップ v6
set procList to {{1, 1}, {1, 2}, {2, 1}, {2, 2}, {1, 3}, {3, 1}, {2, 3}, {3, 2}, {3, 3}}
global gaList, gaList_r
global aSelection, aSelection_r
global gaaList, gaaList_r

tell application “Microsoft Excel”
  set aSelection to formula of selection
end tell
set aSelection_r to a reference to aSelection

set gaList to {}
set gaList_r to a reference to gaList

set dameList to {}

repeat with i in aSelection_r
  set j to contents of first item of i
  
set j to repChar(j, “ ”, ” “) of me –全角スペースを半角に置換しておく
  
  
if j ends with ” “ then
    set j to deleteBackSPC(j) of me
  end if
  
  
considering hyphens
    considering white space
      set j0 to offset of ” “ in j
      
if j0 is not equal to 0 then
        set j1 to text 1 thru (j0 - 1) of j
        
        
set revJ to (reverse of (characters of j)) as string
        
set j00 to offset of ” “ in revJ
        
set j2 to text ((length of j) - j00 + 2) thru -1 of j
      else
        set j0 to offset of “ ” in j
        
if j0 is not equal to 0 then
          set j1 to text 1 thru (j0 - 1) of j
          
          
set revJ to (reverse of (characters of j)) as string
          
set j00 to offset of “ ” in revJ
          
set j2 to text ((length of j) - j00 + 2) thru -1 of j
        else
          set the end of dameList to j
        end if
      end if
    end considering
  end considering
  
  
set the end of gaList_r to {j, j1, j2, {length of j1, length of j2}}
end repeat

if dameList is not equal to {} then
  choose from list dameList with prompt “だめだった名前のリスト”
end if

set gaaList to {}
set gaaList_r to a reference to gaaList
repeat with i in procList
  set j to contents of i
  
set tmpList to {}
  
  
repeat with ii in gaList_r
    set jj to contents of item 4 of ii
    
set jj2 to contents of ii
    
if jj = j then
      set the end of tmpList to jj2
      
exit repeat
    end if
  end repeat
  
  
set the end of gaaList_r to {j, tmpList}
end repeat

gaaList
–> {{{1, 1}, {{”ぴ よ”, “ぴ”, “よ”, {1, 1}}}}, {{1, 2}, {{”ぴ よ子”, “ぴ”, “よ子”, {1, 2}}}}, {{2, 1}, {{”ぴよ こ”, “ぴよ”, “こ”, {2, 1}}}}, {{2, 2}, {{”ぴよ まる”, “ぴよ”, “まる”, {2, 2}}}}, {{1, 3}, {{”ぴ よまる”, “ぴ”, “よまる”, {1, 3}}}}, {{3, 1}, {{”ぴよま る”, “ぴよま”, “る”, {3, 1}}}}, {{2, 3}, {{”ぴよ まるお”, “ぴよ”, “まるお”, {2, 3}}}}, {{3, 2}, {{”ぴよま るお”, “ぴよま”, “るお”, {3, 2}}}}, {{3, 3}, {{”ぴよま るるこ”, “ぴよま”, “るるこ”, {3, 3}}}}}

on deleteBackSPC(a)
  set aCount to 1
  
considering hyphens
    considering white space
      
      
set aList to reverse of characters of a
      
repeat with i in aList
        set j to contents of i
        
if j is not in {” “, “  ”, “ ”} then
          exit repeat
        end if
        
        
set aCount to aCount + 1
        
      end repeat
      
    end considering
  end considering
  
  
set aa to text 1 thru ((length of a) - aCount + 1) of a
  
return aa
  
end deleteBackSPC

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/20 Excel 2008でオープン中のワークブック内のワークシート名称を取得してテキストに

Microsoft Excel 2008でワークブック内にあるワークシートの各名称をまとめて、改行つきのテキストとしてまとめるAppleScriptです。

Excel書類で受け取った資料の一覧をまとめようとして、Excelのワークシート名をひととおり取得しなければならない……とかいった場合に、いちいち手でコピーしたり、Excelを見ながら各ワークシート名をキーボードから入力するというのはナンセンスです。

exc1.jpg

というわけで、その場で1分ぐらいで作りました。これは、作ってよかった! こういう派手さはないが実用的でさっさと作れるAppleScriptの御利益は大きいところ。

exc2.jpg

ここまで自動化できると、フォルダ内に入っているExcelのファイルをすべてオープンしてウィンドウの画面キャプチャをとって、ワークシート名をPowerPointなりKeynoteなりに展開して資料化するところまで自動化したいところです。

……PowerPointは実際にScriptingをやってみると「?」な挙動のオンパレードだし、Keynoteはそれほど自動化の機能がないという状況。いっそ、InDesign上にでも展開したほうが楽そうなところです。

スクリプト名:Excel 2008でオープン中のワークブック内のワークシート名称を取得してテキストに
tell application “Microsoft Excel”
  tell workbook 1
    set wList to name of every worksheet
  end tell
end tell

set aRes to retDelimedText(wList, return) of me

on retDelimedText(aList, aDelim)
  set aText to “”
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retDelimedText

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/07/26 10進数数値をExcel 2004_2008的カラム表現にエンコード

Excel 2004/2008でセルの位置を指定する際、Excel v.Xまでの「R1C1形式」ではなく「A1形式」が採用されました。数値をこのA1形式に変換するためのAppleScriptサブルーチンです。

R1C1形式は非常に扱いが簡単で、これがそのまま使えればよかったのですが……(汗)

Excelで、縦軸を表すcellオブジェクトと、横軸を表すcolumnオブジェクトを使って、

  set a to formula of cell 3 of column 2 –セル「B3」にアクセス

といったR1C1形式に近い表記は可能ですが、範囲指定をする際にはA1形式が必要になってしまいます。

A1形式は、最初のアルファベット部分がカラム(列)を、数値部分がロー(行)を示しています。

このA1形式のカラム部分の計算を行うのが本サブルーチンです。ただし、1〜1,351までの範囲を対象としています。このA1形式のカラム部分は単なる26進数ではなく、少々トリッキーな計算(というか補正)が必要になってしまい、その計算で保証できる範囲が1,351ということです。

ex1.jpg

本気で作り込めば、もうちょっと大きな数値まで対象にできそうですが、実用上1,351まで変換することはなさそうです。Excel 2008ではカラムが16,384まで持てるようになってはいるものの、そんなに大きな表を扱うのであれば、いっそFileMaker Proなどのデータベースを用いたほうが楽に処理できることでしょう。

本ルーチンについても、最善の内容ではなく表現範囲を限定した上でのいわば「次善」の内容であり、他にもっとよいものがあれば使っていきたいところ。海外でいろいろ探しまわったものの、この処理については適切なものが見つからなかったので、仕方なく作成した次第です。

そもそも、Windows版ExcelでVisualBasicから呼び出すメソッドには10進数とA1形式の相互変換を行うものがあるので、それがMac OS X版に実装されていないことが問題の根源のような気もします。

スクリプト名:10進数数値をExcel 2004_2008的カラム表現にエンコード
set aRes to aNumToExcelColumn(502) of me
> “SH”

10進数数値をExcel 2004/2008的カラム表現にエンコードするサブルーチン
1〜1351までの間であれば正しいエンコーディング結果を返す
on aNumToExcelColumn(origNum)
  if origNum > 1351 then
    display dialog エラー:Excel 2004/2008的カラム表現(A1形式)への変換ルーチンにおいて、想定範囲外(1351以上)のパラメータが指定されました buttons {”OK“} default button 1
    
return “”
  end if
  
  
set upperDigitEncTable to {”A“, B“, C“, D“, E“, F“, G“, H“, I“, J“, K“, L“, M“, N“, O“, P“, Q“, R“, S“, T“, U“, V“, W“, X“, Y“, Z“, A“}
  
set lowerDigitEncTable to {”A“, B“, C“, D“, E“, F“, G“, H“, I“, J“, K“, L“, M“, N“, O“, P“, Q“, R“, S“, T“, U“, V“, W“, X“, Y“, Z“, A“}
  
  
set oNum to origNum
  
set nTh to 26
  
set stringLength to 4
  
  
数字が1桁の場合の対応
  
if origNum < 27 then
    set aRes to (item origNum of upperDigitEncTable) as string
    
return aRes
  end if
  
  
  
if origNum > 702 then
    3桁になる場合
    
set upupNum to oNum div 676 整数除算–上の上の桁
    
set oNum to oNum - (upupNum * 676)
    
set upNum to oNum div 26 整数除算–上の桁
    
set lowNum to oNum mod 26 - 1 余剰計算–下の桁
    
    
log {origNum, upupNum, upNum, lowNum}
    
    
超つじつま合わせルーチン【強引】
    
if lowNum = -1 then
      set upNum to upNum - 1
      
set lowNum to 25
    end if
    
    
set upupChar to (item upupNum of upperDigitEncTable) as string
    
set upChar to (item upNum of upperDigitEncTable) as string
    
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
    
set resText to upupChar & upChar & lowChar
    
  else
    2桁の場合
    
set upNum to oNum div 26 整数除算–上の桁
    
set lowNum to oNum mod 26 - 1 余剰計算–下の桁
    
    
    
超つじつま合わせルーチン【強引】
    
if lowNum = -1 then
      set upNum to upNum - 1
      
set lowNum to 25
    end if
    
    
set upChar to (item upNum of upperDigitEncTable) as string
    
set lowChar to (item (lowNum + 1) of lowerDigitEncTable) as string
    
set resText to upChar & lowChar
    
  end if
  
  
return resText
  
end aNumToExcelColumn

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/07/21 Microsoft Office 2008 for Mac Service Pack 2 (12.2.0)が公開

Microsoft Office 2008 for Mac Service Pack 2 (12.2.0)が公開されました。AppleScript用語辞書の変更点はとくにありません。

また、新たに追加されたMicrosoft Document ConnectionはAppleScript非対応アプリケーションです。

2009/02/11 Excel 2008でX軸方向に右端から、データが存在しているセルをサーチ

マイクロソフトが配布しているOffice 2008のスクリプティングに関するドキュメントを参考に、Excelワークシート上にグラフを書かせてみたところ……たしかに、できることはできるのですが、サンプルスクリプトの「なまり」が強すぎて、いまひとつサンプルスクリプトとしては難解すぎるように感じられました。

ここに示したScriptはマイクロソフトのサンプルでは1行で記述されていたものですが、ここまで分解しないとサンプルとしては有用とは言いがたいことでしょう。内容自体は数多くのノウハウを含んでおり、それぞれについて理解すれば役立つものですが……

多数のアプリケーションを制御しつつ、機能を組み合わせ、高度な処理を実現する中で得られた「AppleScriptの定石」ともいえるものがあります。さまざまなリスクを回避するために、「1行にあまり命令を詰め込みすぎない」というのがAppleScriptの定石です。

excel1.jpg

本スクリプトでは、「データがワークシート内のどの範囲に入っているのか」をX軸方向にサーチする処理を行います。まずは、ワークシートの右端(X軸の終端)から、原点方向に(左向きに)サーチを行うというものです。

ワークシート上に入力されたデータを取得するために、処理前にデータ入力範囲を選択しておく……といった処理はお手軽なのでよく使う手ですが、それよりもデータ入力範囲をサーチするほうが有用でしょう。

スクリプト名:Excel 2008でX軸方向に右端から、データが存在しているセルをサーチ
tell application "Microsoft Excel"
  tell active sheet
    ワークシートの横幅を取得
    
set aC to (count columns)
    
一番右のセルを取得
    
set bC to (cell aC of row 1)
    
ワークシート右端から、左方向へデータが存在するセルをサーチする
    
set aD to get end bC direction toward the left
  end tell
end tell

> range "[ブック1]Sheet1!$E$1" of application "Microsoft Excel"

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/01/14 Excelで、現在のワークシートに貼り込まれている画像をデスクトップにPNG形式のファイルとして書き出す

Excel 2008で、現在のワークシートに貼り込んだ画像をデスクトップにPNG画像としてすべて書き出すAppleScriptです。Excel自体はAppleScriptの「save as picture」コマンドの書き出しフォーマットオプションとしてPNG、BMP、GIF、JPEG、PDFを指定できるようになっています。このため、PNG以外のお好きな形式で、(デスクトップ以外の)お好きな場所に書き出すように指定するとよいでしょう。
(more…)

2009/01/10 Excelに画像を配置

「画像を送ってください」とお願いをしたら、返信メールにExcelの書類が添付されてきて……開けてみたら画像が1枚、Excelの書類に貼り付けてあってアゴが外れそうになるほど驚いたことが………何度かあります。

なぜ、わざわざExcelの書類に貼り付けて送って来るのか……画像をそのまま送ればいいんじゃないのか? なぜ、ひと手間かけてExcelに画像を貼り付けて送るのか……何かのおまじないなのか? 画像が添付されているとスパムメールだと判断されるのか? 

とりあえず、そのような不思議な相手とメールのやりとりを行わなくてはならなくなった場合に備えて、指定フォルダに入っている画像をExcelのワークシートに貼り付けるAppleScriptを作ってみました。1つのシートに画像を1枚貼り付け、画像の枚数分だけそれを繰り返します。
(more…)

2008/12/14 Excel v.2008でウィンドウ枠の分割を固定

Excel v.2004/2008でアクティブワークシートのウィンドウ枠の分割を固定します。
(more…)

2008/12/14 Excel v.2004/2008でウィンドウの最大化

Excel v.2004/2008で表示中のワークシート(ウィンドウ)を最大化します。画面いっぱいにウィンドウを表示します。
(more…)

2008/12/11 Excel 2004/2008で新規ドキュメントを作成して任意のワークシートを作成

Excel v.2004/2008で新規ドキュメント(ワークブック)を作成し、そこにA〜Eの指定名称のワークシートを作成するAppleScriptです。
(more…)

2008/12/11 Excel 2008 v12.1.5で新規に実装されたvalue2の挙動について

Excel 2008のバージョン12.1.5のアップデータにより、AppleScript用語辞書が変更になりました。Office 2008には、割とアップデータのドキュメントに書かれていない機能追加があり……AS系の機能もちょくちょく追加されています。

v12.1.5では、rangeからvalueを取得するのと同様に、value2という属性が取得できるようになりました。これが何かといえば、データをなんでもかんでも数値として解釈して返すという属性です。日付も無理矢理数値に解釈します。formulaと挙動がそっくりですが、formulaでは文字列として値を返すので、その数値版がvalue2といえるかもしれません。
(more…)

2008/08/05 Excelで、バージョンに依存しないで選択範囲のデータ取得

Excelで最も利用するAppleScript処理は、選択範囲内のデータの取得でしょう。
(more…)

2008/07/21 書式設定したセルから情報を取り出して調べる

Excel 2008で、表中のセルに対してGUIから書式設定した内容を調べるサンプルです。
(more…)

2008/07/21 セルの文字列を取得する

Excel 2008で、valueによって値を取得するのと、string valueによって文字列(文字フォーマットに影響を受ける)を取得するのとで、結果が異なることを把握するためのサンプルです。
(more…)

2008/07/21 指定範囲の値を取得する

Excel 2008で、指定範囲(range)の値を取得します。
(more…)

2008/07/21 指定セルの値を取得/設定する

Excel 2008で、指定セルの内容(value)を取得したり設定したりするサンプルです。
(more…)

2008/07/21 条件を指定してセルを抽出する

Excel 2008で、Rangeオブジェクトの中から、条件を指定してセルを抽出します。
(more…)

2008/07/20 指定範囲のセルを選択状態にする

Excel 2008で、指定範囲のセルを選択状態にします。
(more…)

2008/07/20 複数の選択範囲(areas)を取得する

Excel 2008で、Control+Option+クリックで複数の範囲を選択できますが……それを取得するScriptです。
(more…)

2008/07/20 Unionコマンドで複数の範囲を同時に使う

Excel 2008には複数の範囲を同時に指定するためのオブジェクトとして、range1からrange30までの予約語が用意されています。30個までの範囲を一意に指定するrangeを作成して、操作することが可能です。ただ……あまりこの予約語はスマートではありませんね。
(more…)

2008/07/20 active cellが属するentire rowを取得する

Excel 2008で、現在選択中のセルが属する行全体(entire row)を取得します。
(more…)

2008/07/20 現在のactive cellを基準にしてほかの位置のセルを扱う

Excel 2008で、現在選択中のセルを基準としてほかのセルを相対的に指定するScriptです。
(more…)

2008/07/08 現在の行のセルの高さを変更する

Excel 2008で、現在の行のセルの高さを変更します。幅はcmなのに、高さはポイント数で指定します。
(more…)

2008/07/06 現在の列のセル幅を変更する

現在選択中のセルの幅を変更します。
(more…)

2008/07/06 指定rangeからの相対指定でrangeを取得する

Excel 2008で、指定したrangeからの相対指定で新たなrangeを取得するAppleScriptです。
(more…)

2008/07/06 単独のセルをA1形式で指定

Excel 2008のワークシート上の任意のセルをA1形式で指定します。
(more…)

2008/07/06 アクティブウィンドウのアクティブセルの値を取得

Excel 2008上のアクティブウィンドウ上のアクティブセルの値を取得します。
(more…)