2021年7月14日水曜日
力技_03:Webビューアの開発にVS Codeを活用
2021年6月24日木曜日
力技_02:FileMakerからExcelワークブックをつくる(その5)
まずは想定する背景を整理しながらダミーデータ作成

これをもとに支店ごとの月間売上集計と全体の集計を出していきます。
#月刊集計(支店別)をつくる
レイアウト切り替え [ 「売上DB」 (売上DB) ]
変数を設定 [ $支店リスト; 値:"銀座¶仙台一番町¶名古屋栄¶心斎橋¶渋谷¶表参道¶福岡天神" ]
変数を設定 [ $開始日; 値://指定された月の1日
Date ( G::G_月設定フィールド ; 1 ; G::G_年設定フィールド ) ]
変数を設定 [ $終了日; 値://開始日の月の末日
$開始日 + 31 - Day ( $開始日 + 31 ) ]
フィールド設定 [ G::G_Excelへ送るデータ; //支店数分のワークシートを含む新規ワークブックを作成listToTAB ( List ( "newBook" ; ValueCount ( $支店リスト ) ) ) ]
#支店でループ
変数を設定 [ $i; 値:1 ]
Loop
変数を設定 [ $支店; 値:GetValue ( $支店リスト ; $i ) ]
フィールド設定 [ G::G_Excelへ送るデータ;
//ヘッダと全体の書式
List ( G::G_Excelへ送るデータ ;
listToTAB ( List ( "selectSheet" ; $i ) ) ;
listToTAB ( List ( "nameSheet" ; Year ( $開始日 )&Right ( Month ( $開始日 )+100 ; 2 )&GetValue ( $支店リスト ; $i ) ) ) ;
listToTAB ( "width¶1¶8.71¶10.57¶10.57¶1¶1¶8.71¶10.57¶10.57" ) ;
//タイトル
listToTAB ( "write¶1¶1¶1¶1¶月間売上集計表(支店別)" ) ; listToTAB ( "merge¶1¶1¶1¶8" ) ;
listToTAB ( "height¶1¶36" ) ;
listToTAB ( "vAlign¶1¶1¶1¶1¶xlCenter" ) ; listToTAB ( "hAlign¶1¶1¶1¶1¶xlCenter" ) ;
//ヘッダ
listToTAB ( "merge¶3¶1¶3¶2" ) ; listToTAB ( "merge¶4¶1¶4¶2" ) ; listToTAB ( "merge¶5¶1¶5¶2" ) ; listToTAB ( "merge¶3¶6¶3¶7" ) ; listToTAB ( "merge¶4¶6¶4¶7" ) ; listToTAB ( "merge¶5¶6¶5¶7" ) ;
listToTAB ( "borders¶3¶1¶5¶3¶xlContinuous" ) ; listToTAB ( "borders¶3¶6¶5¶8¶xlContinuous" ) ; listToTAB ( "hAlign¶3¶1¶5¶7¶xlCenter" ) ;
listToTAB ( "write¶3¶1¶5¶1¶対象店舗¶対象期間¶作成日" ) ;
listToTAB ( List ( "write";3;3;5;3;GetValue ( $支店リスト ; $i );"'"&Year ( $開始日 ) & "年"&Month ( $開始日 ) &"月" ; "'"&Get ( 日付 ) ) ) ;
listToTAB ( "write¶3¶6¶5¶6¶月間客数¶月間売上¶客単価" ) ;
//表
listToTAB ( "borders¶7¶1¶22¶3¶xlContinuous" ) ;
listToTAB ( List ( "borders";7;6;Day ( $終了日 )-15+7;8;"xlContinuous" ) ) ; listToTAB ( "write¶7¶1¶7¶8¶月日¶客数¶売上¶¶¶月日¶客数¶売上" ) ; listToTAB ( "hAlign¶7¶1¶7¶8¶xlCenter" ) ;
listToTAB ( "numberFormat¶8¶1¶22¶1¶m\"月\"d\"日\"" ) ; listToTAB ( "numberFormat¶8¶6¶23¶6¶m\"月\"d\"日\"" ) ; listToTAB ( "numberFormat¶8¶3¶22¶3¶#,##0" ) ; listToTAB ( "numberFormat¶3¶8¶23¶8¶#,##0" ) ;
"" ) ]
#日付でループ
変数を設定 [ $date; 値:$開始日 ] 変数を設定 [ $月間客数; 値:0 ] 変数を設定 [ $月間売上; 値:0 ]
Loop
エラー処理 [ オン ]
検索実行 [ 指定された検索条件: レコードの検索; 条件: 売上DB::売上日: 「$date」 AND 売上DB::本支店: 「$支店」 ] [ 記憶する ]
エラー処理 [ オフ ]
変数を設定 [ $月間客数; 値:$月間客数 + Get ( 対象レコード数 ) ]
変数を設定 [ $月間売上; 値:$月間売上 + 売上DB::集計_売上金額 ]
フィールド設定 [ G::G_Excelへ送るデータ;
//1日分の客数と売上を書き込む
Let ([
day = Day ( $date ) ;
x = If ( day ≤ 15 ; 1 ; 6 ) ;
y = If ( day ≤ 15 ; day+7 ; day-15+7)
] ;
List ( G::G_Excelへ送るデータ ;
listToTAB ( List ( "write" ;y;x;y;x+2;$date;Get ( 対象レコード数 );0+売上DB::集計_売上金額 ) ) ; "" )
) ]
変数を設定 [ $date; 値:$date+1 ]
Exit Loop If [ $date > $終了日 ]
End Loop
フィールド設定 [ G::G_Excelへ送るデータ;
//ヘッダ集計値
List ( G::G_Excelへ送るデータ ;
listToTAB ( List ( "write" ;3;8;5;8;$月間客数;$月間売上 ; Round ( $月間売上 / $月間客数 ; 0 ) ) ) ;
"" ) ]
変数を設定 [ $i; 値:$i + 1 ]
Exit Loop If [ $i > ValueCount ( $支店リスト ) ]
End Loop
フィールド設定 [ G::G_Excelへ送るデータ;
//1枚目のシートに移動
List ( G::G_Excelへ送るデータ ;
listToTAB ( "selectSheet¶1" ) ; "" ) ]
レイアウト切り替え [ 「月間集計を生成する」 (G) ]
2017年7月31日月曜日
力技_02:FileMakerからExcelワークブックをつくる(その4)
FileMakerからスクリプトを出力する
Excelの方でスクリプトからワークシートを生成できるようになったので、今度はFileMakerからのスクリプト出力を作っていきます。
カスタム関数を定義する
力技EMLではひとつのコマンドと複数のパラメータでひとつの命令セットとなります。FileMakerでは複数の値のまとまりはList(値一覧)=改行区切りテキストで扱うようになっていて※1、そのためのList関数も用意されているのでこれを使わない手はありません。
ただ、これをExcelに持って行くときにはListをscriptワークシート上の1行に水平方向に並べていく必要があるため、改行区切りではなくタブ区切りの方が扱いやすくなります。
この改行区切り→タブ区切りの変換を行う手順が度々でてくるので、カスタム関数を作ってスッキリさせましょう。
※1 少なくともバージョン15までは。バージョン16からJSONがサポートされたので、今後はこちらが使われてくると思われる。…というか個人的には使っていきたい。

listToTABという名前でこのような関数を作りました。改行コードをタブに置き換えるためにSubstitute関数の置換条件指定を省略できるようにしただけの単純なものです。
FileMaker Pro Advancedをお持ちでない方は、カスタム関数の定義ができないので、以下の説明を見て自作されるときはSubstituteを使うか、ダウンロードしたサンプルファイルをベースに作ってみてください。(定義済みのカスタム関数はAdvancedでなくても利用可能です)
これを使って早速EML作成。一つの計算式でドドっと記述してしまうとこんな感じ。

基本的には
listToTAB ( List ( コマンド ; パラメータ1 [ ; パラメータ2 ; … ] ) )
で1命令を構成し、複数の命令はList ()で囲います。
出来上がった文字列はタブ区切りテキストの形式になります。

このテキストフィールドをコピーして、前回作成したExcelマクロを組み込んだファイルの「script」ワークシートのA1セルを始点にペーストします。Mac版Excelの場合は「形式を選択してペースト」しないとタブが無視されてしまうようです。
![]() |
| FileMakerで作成したEMLスクリプトをExcelにはり込む。 手順例:消去ボタン→A1セルを右クリックし「形式を選択してペースト」 |

実行してみると新規エクセルファイルが作られます。
セル結合や書式設定がされた表ができています。
この力技もいよいよ佳境に。次回はFileMakerでデータ処理してExcel出力です。
2017年7月22日土曜日
力技_02:FileMakerからExcelワークブックをつくる(その3)
いよいよ作っていきますよ
Excel VBAの知識がないと、この章を読むのはつまらないかもしれませんね。そんな方は下のファイルダウンロードだけゲットして、ここは読み飛ばしてもOKです。
メイン
タイトルコメントと、モジュール(≒グローバル)変数宣言のあと早速メインルーチンですが、めっちゃシンプルです。
ここに新しくCase文と処理を書いていけば、お好きなコマンドを追加することができますよ。
pick関数群
定数定義
たったこれだけ
あとは、これにかけるスクリプトをFileMakerで生成すればOKですね。次回はこれに挑戦します。
つづく。
サンプルダウンロード
・今回作成したサンプルファイル "ExcelMaker.xlsm"
サンプルコード(Excel VBA)
力技_02:FileMakerからExcelワークブックをつくる(その2)
サンプルの概要
Excelとの連携部分にフォーカスするため、極力シンプルに設計します。
テーブル「売上DB」
・売上日(日付)
・本支店(テキスト)
・売上金額(数字)
以上、フィールド3つのみ。
小売店を想定し、1レコードがレシート1枚、「本支店」は売った店名、「売上金額」はそのレシートの合計金額です。
実際は売上票コードをキーにしてぶら下がった「細目」テーブルに個々の商品の情報があったり、「商品マスタ」や「顧客マスタ」と連携しているなど、各自想像してください。
これに乱数を使ったスクリプトを回し、2017/1/1〜2017/1/31を対象期間として3万レコードぐらいのダミーデータを作成しました。
作戦会議
Excelの処理を自動化といえば、やっぱマクロ(Excel VBA)ですよね。
FileMakerでVBA言語のコードをテキスト形式で書いたり、FileMakerからExcelへ出力したいデータを渡して、作表整形する部分をExcel VBAで書くとか、いくつか方法があると思います。それもありっちゃありですが、作るソリューションごとにその都度専用の設計開発をしなければなりません。
そこで、FileMakerからはもっとシンプルな形でワークシートの作成手順を記述することにして、Excel VBA側でそれを解釈して動作するようなものを作ったら、いろいろ使い回しも効きそうだし、これはいけるんじゃないかと。
つまりは
Excelマークアップ言語を開発じゃ!
力技EML 言語仕様
・EML(Excel Markup Language)スクリプトはExcelのワークシート上に展開される(FileMakerからはタブ区切りテキストとして生成)
・1行で1命令
・左端(A列)が命令、B列以降右方向にパラメータを並べる
・パラメータは水平位置固定(コマンドによりどの列が何の値か決まっている)
・変数、条件分岐、ループなどもちろん一切ナシ
・エラー処理もナシ
どうせExcelだし、ワークシート上にスクリプトを書いちゃえという素敵仕様です。このブログのサンプルとしても、開発や処理の過程を見える化できていいですね。さらに、セルで区切る形で情報が並ぶとExcel VBAからの解析もラクに書けそうです。
コマンド一覧
| コマンド | パラメータ (スラッシュはセル区切り) | 説明 |
| // | 注釈(NOP) | |
| newBook | ブック名/シート数 | 新規ワークブック |
| width | 開始列番号/幅1/[幅2]/... | セル幅指定、開始位置から右方向へ任意の数設定可能 |
| height | 開始行番号/高さ1/[高さ2]/... | セル高さ指定、開始位置から下方向へ任意の数設定可能 |
| selectSheet | シート番号 | シートを選択 |
| nameSheet | シート名 | シート名を設定 |
| merge | SY/SX/EY/EX | セルを結合 |
| write | SY/SX/EY/EX/値1/[値2]... | セルに値を書き込む※1 |
| fontSize | SY/SX/EY/EX/サイズ | フォントサイズ設定 |
| hAlign | SY/SX/EY/EX/位置 | セル内水平位置設定※2 |
| vAlign | SY/SX/EY/EX/位置 | セル内垂直位置設定※2 |
| borders | SY/SX/EY/EX/線スタイル | 枠線を引く(外枠・縦・横すべて)※2 |
| numberFormat | SY/SX/EY/EX/スタイル | データの書式設定※3 |
| shrinkToFit | SY/SX/EY/EX/TRUE or FALSE | セルに合わせて文字を縮小 |
| wrapText | SY/SX/EY/EX/TRUE or FALSE | セル内テキスト折り返し |
| addIndent | SY/SX/EY/EX/TRUE or FALSE | セル内文字の前後にスペース |
※2 サイズ・位置・スタイルはxl定数名で指定(詳しくは(その3)参照)
※3 (#,###などセル書式で指定する形式)
言語と呼ぶにはあまりに少ない命令数ですが、ワークシート生成に必要な手順を一つずつコマンドにしていったらこんな具合になりました。これぐらいでもちゃんと表が作れます。
次回はExcel VBAで実際にこの力技EMLを実行できるようプログラムしていきます。
つづく。
2017年7月20日木曜日
力技_02:FileMakerからExcelワークブックをつくる(その1)
Excel VS FileMaker
「その仕事、まだExcelでやってるの?」
「FileMakerはもともとExcelにエクスポートできるよ」とおっしゃるそこのあなた。確かにおっしゃる通り。FileMaker上のデータを標準機能でExcelにエクスポートすると、こんな感じのファイルが出力される。

でも、さっきも言ったように「最強の文書作成ソフト」であるExcel様にこのエクスポート機能はあまりにも力不足。1行目をラベル行にできるぐらいしか設定項目もなく、上部中央にタイトル入れてくれるとか、罫線つけてくれるとか、なんにもなし。
ただ、FileMakerの方にも肩入れしておくと、FileMakerのエクスポート機能はデータ交換のための機能なので、これはこれで「清く正しいデータベース」のあるべき姿なのです。ただただデータだけシンプルに並べるのが大事なことで、余計な体裁づけはインポート先で手間を取らせることにもなりかねません。
こうしてみるとFileMakerとExcelはそれぞれの根底にあるポリシーは全く違うのだなと改めて考えさせられます。まあ、Excelの方はポリシーというにはだいぶ節操ないですが、その強大無比なシェアのせいで極度の一般化を求められた結果、ノンポリシーというポリシーを背負わされたとも言えそうです。(これはMicrosoftがいい悪いとかじゃなくて、これだけ広く普及したものが世の中からどう捉えられ、どう使われたかという結果の問題だと思う)
なんだかんだExcel様は偉い
さて、すっかり御託が長くなってしまいましたが、実務場面におけるFileMakerとExcelはというと…
Excelで一般的にやられている事務作業って大概FileMakerでも実現できるし、印刷レイアウトなんかはむしろExcelより凝ったものが作れたりするのがFileMakerです。FileMaker関係のセミナーなどを受講しても「今までExcelでやってたのをFileMakerに移行して便利で楽にしようよ」なんて言われてその気になったりするわけですが…
「そこそこ体裁が整えられていて、編集もできるファイルが欲しいなあ」
なんて誰かに言われると、途端に困ってしまいます。
世の中、".fmp12"なんて相手が見たこともないであろう拡張子のファイルを送っても、おそらく「何これ?」としか返ってこない。ならばと渾身のレイアウトできれいなPDFを作成しても「編集できねぇよ」と言われる始末。こういう時はやはり安心と実績の".xlsx"ですよね。
そんなわけで、「FileMakerからそこそこ体裁の整ったExcelファイル」ってそこそこ需要あるんじゃないかなと思うのです。
標準機能でエクスポートしてから、手作業で罫線引いたり先頭に行挿入してタイトルつけたり…なんてのもいいですが、ここは一発、力技でなんとかしてしまいましょう。
次回へ続く
2017年7月18日火曜日
力技_01:のび〜る帳票をつくる(その2)
【前回】からのつづき
まずはヨコ線
前回のガタガタレイアウト。上図を見ると「空行の削除」を指定したフィールドはデータが入っていないとき枠線も表示されないことがわかります。
ならば、フィールドの枠線は使用せずに縦線・横線をそれぞれ引いた方がよさそうです。
1)項目名は上辺・左辺・右辺を設定し、下辺はナシに(上図緑線)
2)ボディパート、フッタパートの最上部に直線ツールで横線を引く(上図赤線)
3)表の各フィールドは枠線ナシ、塗りつぶしナシに
問題はタテ線

サンプルダウンロード
-
【前回】 からのつづき まずはヨコ線 前回のガタガタレイアウト。 上図を見ると「空行の削除」を指定したフィールドはデータが入っていないとき枠線も表示されないことがわかります。 ならば、フィールドの枠線は使用せずに縦線・横線をそれぞれ引いた方がよさそ...
-
可変長テキストを含むデータのリスト表示に悩む たとえばこんなデータがあったとする。 月日 天気 参加者 記事 06/01(木) 晴れ 鈴木 特になし 06/02(金) くもり 鈴木 田中 このぐらい長いテキストを入力するとFileMakerのフィールドの...
-
サンプルの概要 Excelとの連携部分にフォーカスするため、極力シンプルに設計します。 テーブル「売上DB」 ・売上日(日付) ・本支店(テキスト) ・売上金額(数字) 以上、フィールド3つのみ。 小売店を想定し、1レコードがレシート1枚、「本支店...




