WordでPDFエクスポートをするVBAを書いた
Wordを最近使う機会があって、毎回同じ名前を入力してエクスポートするのが面倒だったので書いてみた。
エクスポートのやり方
Sub ExportToPDF() ActiveDocument.ExportAsFixedFormat OutputFileName:="output.pdf", ExportFormat:=wdExportFormatPDF End Sub
これを実行すればWordでPDFのエクスポートができるようになる。
任意の名前にするのは、OutputFileName:="output.pdf" の 「"output.pdf"」自分の出力したい名前にしておけばいい。
勉強用のメモ
勉強用に、参照オブジェクトのオブジェクト変数への代入処理をメモしておく。
Sub ExportToPDF() Dim wordDoc As Word.Document Set wordDoc = ActiveDocument wordDoc.ExportAsFixedFormat OutputFileName:="output.pdf", ExportFormat:=wdExportFormatPDF Set wordDoc = Nothing End Sub
定義した変数への代入は、Setですることができる。これがよく分からなくてVBAは敬遠してたけどやっとわかった。Visual Basic Editorのヘルプにドキュメントがあったのでそれをちゃんと見ないといけない。
VBAで開発で覚えたほうがいいこと
デバッグはDibug.Printを使って、Visual Basic Editorの[表示]->イミディエイトウィンドウに出力するとデバッグがちゃんとできるようになる。
F8でできるステップ実行、[表示]→[オブジェクトブラウザー]の使い方も覚えるとちゃんとVBAの開発ができるようになる。
VBAで気を付けたほうがいいこと
- どうもメソッドなどに()をつけるとエラーの原因になるので付けないほうがいい。
- 付属のヘルプを見よう。ヘルプは
Visual Basic Editor→
ヘルプ→
Microsoft Visual Basic for Application ヘルプ
で、豊富な情報を見ることができる。
auto-insert-modeでなぜか書き込めなくなる問題について
どうも設定が悪さをしていた。
http://d.hatena.ne.jp/higepon/20080731/1217491155
この設定では、
(add-hook 'find-file-not-found-hooks 'auto-insert)
こうなっている。
これが入ると何故か
File exists, but cannot be read
となってファイルがread-onlyになってテンプレートを挿入できない。
なので上の設定を消して、
(add-hook 'find-file-hook 'auto-insert)
これを入れておくだけでいい。設定を入れ替えたら再起動すれば直ると思う。
この謎が一年越しぐらいに解決してうれしい。
汚いけれど自分のauto-insertの設定はこちら。
https://github.com/pogin503/dot-emacs/blob/master/site-start.d/30_init-auto-insert.el
Doctestのスニペット
Emacsのyanippetで使える定義しておくと便利なスニペットをメモしとく。
# -*- mode: snippet -*- # name: doctest # -- {-| ${1:func-name} Test >>> $0 -}
これを snippet_dir/haskell-mode/doctest に保存して C-c C-c で読み込んでおけば、テストを書くのがちょっと楽になる。
-- addTes.hs add :: Int -> Int -> Int add a b = a + b -- doctest {trigger-key: タブキーとか} or -- yas-insert-snippetのキーバインドで挿入 {-| add Test >>> add 2 3 5 -}
doctestを読み込むときは M-! doctest addTest.hs とやっていつも読み込んでる。頑張ればもっと楽な読み込み方がありそう。
30秒ドローイングのソフトメモ
ニコ生徘徊してたら、こういうの紹介してもらった。
https://sites.google.com/site/fpaintnagato/paint/halfamindrawing
トップページ:
https://sites.google.com/site/fpaintnagato/home
F#で作っててすごいなーと思う。
さっそくベルセルクの画像検索してやってみたけどさっぱりですね、はい。
一時期30秒ドローイングやってたので再開してみようかなと。
MacターミナルのEmacsが古かった根本的な原因
根本的な原因は.zshrcのPATH設定が悪かったからだった。
自分は
export PATH=/usr/bin:/usr/local/bin
という風に/usr/binの後に/usr/local/binを配置してたのが問題だった。brew doctorをしてみて原因がわかった。
brew doctorをすると
Error: /usr/bin occurs before /usr/local/bin This means that system-provided programs will be used instead of those provided by Homebrew. The following tools exist at both paths: ... ... ... Consider amending your PATH so that /usr/local/bin is ahead of /usr/bin in your PATH.
こんな感じのが出たはず。
参考: YOMiTOKU: brew doctorの /usr/bin occurs before /usr/local/binにはまったときの解決法
なのでbashの人は .bash_profile or .bashrc のPATHを、zshの人は.zshrc or .zshenvのPATHにある /usr/local/bin が /usr/bin や /usr/local/sbin より先になるように順番を入れ代える。
export="/usr/local/bin:/usr/bin:/usr/local/sbin:$PATH"
これでターミナルで $ emacs とやって新しいバージョンが使えるようになる。
自己紹介ページを少し作った
簡単だけどWikiの方で自己紹介っぽいもの書いてみた。
あとでまた充実させたい。
http://www18244ue.sakura.ne.jp/
http://www.pogi-pogi.net
ドメインも取らないとなぁ。
取って変更した。
2014/01/21 追記
どうもうまくいってないので今度直す。
EmacsLispで最小構成(っぽい)テストをする方法
ERTでテストをするやり方が気になったので、Githubでテストしているリポジトリをいくつか見ていった。
いくつかのリポジトリを見て、これぐらいなら後々応用が利くかなと程度のものができたので記事にしてみようと思う。
テストはEmacs24でついてくるようになったERTをMakefileでテストするやつになる。
https://github.com/pogin503/emacs-test-sample
ここに作ったやつが置いてあるので
$ git clone git://github.com/pogin503/emacs-test-sample.git $ cd emacs-test-sample $ make test
で実行出来ます。
実行例
$ make test /Applications/Emacs.app/Contents/MacOS/Emacs --batch -Q -L . --eval \ "(progn \ (setq byte-compile-error-on-warn t) \ (batch-byte-compile))" *.el Wrote /Users/username/repo/emacs-test-sample/myfile.elc /Applications/Emacs.app/Contents/MacOS/Emacs --batch -Q -L . -l test/run-test.el Running tests on Emacs 24.3.1 Loading /Users/username/repo/emacs-test-sample/test/myfile-test.el (source)... Running 1 tests (2013-06-18 01:57:09+0900) passed 1/1 myfile:addition-test Ran 1 tests, 1 results as expected (2013-06-18 01:57:09+0900)
中身について
フォルダ構成
フォルダ構成はこんなふうにしている。
. ├── Makefile ├── myfile.el └── test ├── lib #テスト用のライブラリディレクトリ(必要があれば作る) │ ├── cl-lib.el │ └── ert.el ├── myfile-test.el #実行されるテスト └── run-test.el #実行用の設定をしてテストを走らせるファイル
バッチ処理
Emacsのバッチ処理は-batch または--batchをオプションに入れて実行します。
$ emacs --batch -L . --eval "(message \"Running tests on Emacs %s\" emacs-version)"
バッチ処理でよく使うオプションはこんなの
オプション | 効果 | |
-Q | .emacsや、.emacs.d/init.elを読み込まないようにする、かつ最小の設定で起動する | |
-L directory | directoryをload-pathに追加する | |
-f function | functionを引数なしで読み込む | |
-l file | ファイル名をloadする | |
--batch | バッチモードを動かす | |
--eval expression | --evalの後に続くLispプログラムを評価する |
Makefile
Makefileはこんな風にすればいいんじゃないかと思う。
# Makefile UNAME:=$(shell uname -s) #多分動くと思う ifeq ($(UNAME),Darwin) EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs else EMACS=emacs endif .PHONY : build test build : $(EMACS) --batch -Q -L . --eval \ "(progn \ (setq byte-compile-error-on-warn t) \ (batch-byte-compile))" *.el test: build $(EMACS) --batch -Q -L . -l test/run-test.el
Macを使っていると/usr/binにある古いEmacsが使われるので
ifeq ($(UNAME),Darwin) EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs else EMACS=emacs endif
ifeq普段使うEmacsを設定しておかないといけない。
- build部分ではバイトコンパイルをしています。ロードするファイルが多くなれば多分体感できるぐらいまで早くなるのかも。別になくてもいい気がする。
だいたいこんな風にすれば最小限の設定で動かすことができてテストをすることができます。
myfile.el
ERTで実行する用に用意する。
;; myfile.el (defun myfile:addition (a b) (+ a b)) (provide 'myfile)
test/myfile-test.el
実行されるファイルには(require 'ert)、(require 'myfile)とかして必要なファイルをものをロードする。
ERTはert-deftestを使って実行するテストを作る。
;; test/myfile-test.el (require 'ert) (require 'myfile) (ert-deftest myfile:addition-test () (should (= (myfile:addtion 1 2) 3)))
test/run-test.el
このファイルで実際にテストをするためのロードパスや、読み込むライブラリを設定する。
Makefileにの-lオプションで読み込むときに使われる。
少々ながいのでgithubの方で見てください。
https://github.com/pogin503/emacs-test-sample/blob/master/test/run-test.el
test/run-test.el 内でテストを実行してる部分は下の部分になる。
;; test/run-test.el ;; Run tests (if noninteractive (ert-run-tests-batch-and-exit) (ert t))
テストをしていたリポジトリ
GitHub - uk-ar/el-spec
GitHub - bbatsov/projectile: Project Interaction Library for Emacs
GitHub - rolandwalker/emacs-travis: Travis CI recipe for Emacs libraries.
GitHub - ecukes/ecukes: Cucumber for Emacs
GitHub - cask/cask: Project management tool for Emacs
GitHub - auto-complete/auto-complete: Emacs auto-complete package
GitHub - emacs-mirror/emacs: Mirror of GNU Emacs
GitHub - tkf/emacs-jedi: Python auto-completion for Emacs
GitHub - haskell/haskell-mode: Emacs mode for Haskell
https://github.com/flycheck/flycheck
travis-ciでテストをする場合は rolandwalker/emacs-travis を見ればいいと思う。でもMakefileの中身でいろいろやってて複雑ではある。
やっぱりこっちの方が簡単そうなのでこっちを見るといいと思う。
GitHub - lewang/ert-test-skeleton
(追記 2013.6.18)
Cartonを使ったtravis-ciのテストをtkfさんが作ってくれたのでそれも紹介する
GitHub - tkf/emacs-plugin-template: Minimal emacs plug-in template with setup for Travis CI
Cartonを使うほうがだいぶ楽そう。
追記2013/10/3
→CartonからCaskに名前が変わった。
終わりに
とりあえずERTのバッチテストは出来たのでひとまずは満足。
そしてこの記事を書いた後にもっと良さげなサンプルを見つけてしまうという...。
自分はまだテストちゃんと作ったことが無いのでちゃんと作ってみようと思う。
(追記 2013.6.18)
el-specとかEcukesとかERTをカバーする実装があるので、そっちの導入を次は書けばいいのかなと。