Microsoft Excelでオープン中の書類の指定名称のワークシート内の全データを文字列リストで取り出すAppleScriptです。
Microsoft Excel v14.7.7(Office 2011)、Excel v16.22(Office 2019)で動作確認しています。
Excelは表計算ソフトであり、表形式の構造データのセル内に文字列/数値のデータを保持するようにできています。
AppleScriptからExcelのデータにアクセスすることは容易ですが、数値データの場合にはExcelが保持できる数値の桁数のほうがAppleScriptの数値型変数よりも有効桁数が多いために、データの扱いが問題になります。
そのまま取り出すと指数表示の数値データになってしまうため、何らかの対策が必要です。
そこで、指定ワークシートの書式を文字書式に設定し、データを取得することでデータが欠損することを防ぐことが可能です。事実、この手段は割と他のOSプラットフォーム(Windowsとか)でも利用されているようです。
ただ、作業対象のワークシートのセル書式を書き換えてしまうと、繰り返しテストやプログラム作成を行ううえで問題が出る(めんどくさい)ので、元データを破壊しないでセル書式を書き換える必要に迫られます。
そこで、
(1)作業対象Excel書類の末尾に作業対象シートのコピーを作成し、セル書式を書き換えてデータ取得。終了後にコピーしたシートを削除
(2)新規Excel書類を作成し、作業対象Excel書類の作業対象シートのコピーを新規作成書類に作成。新規Excel書類のセル書式を書き換えてデータ取得。終了後に未保存のExcel書類を破棄
の2通りを実験。元データを一切改変しない(2)の方法を採用したものが本Scriptです。
一応、
(3)作業対象Excel書類をまるごとファイルコピーして、セル書式を改変してデータ取得して破棄してファイル削除
という方法もあり、こちらも「アリ」でしょう。
AppleScript名:指定名称のワークシートを新規ワークブックにコピーしてセル形式を文字形式に変更して全データを取得 |
— – Created by: Takaaki Naganoya – Created on: 2019/02/01 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.5" use scripting additions use framework "Foundation" tell application id "com.microsoft.excel" set wCount to count every workbook if wCount = 0 then return –コピー元のWorksheetを特定 tell active workbook set aNameList to name of every sheet set origSheetName to contents of first item of (choose from list aNameList) end tell end tell set aList to getASheetDatAsStringFormat(origSheetName) of me –現在オープン中のExcel Workbook(書類)中の指定名称のワークシートの内容を新規ワークブックにコピーし、全セルの内容をテキスト形式に変更して内容を取得 on getASheetDatAsStringFormat(origSheetName) tell application id "com.microsoft.excel" –コピー元のWorksheetを特定 tell active workbook –コピー元のワークブック set wbName to name of it end tell set origSheet to sheet origSheetName of workbook wbName –コピー先の新規ワークブックを作成してそこに指定ワークシートのデータをフルコピー set distSheet to (worksheet 1 of (make new workbook)) (copy worksheet origSheet before distSheet) –ここでのbefore/after指定に意味はないが、指定しないと構文確認をパスしないので指定 –コピーしたWorksheetのセルのフォーマットをstring valueに変更してデータ取得 tell active workbook –新規作成してデータをコピーした未保存ワークブック tell active sheet set number format of used range to "@" set aList to string value of used range –データ取得 end tell close without saving –新規作成したワークブックを保存せずに破棄 end tell end tell return aList end getASheetDatAsStringFormat |