サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
インタビュー
thom.hateblo.jp
今回はGitHubの話。 基本的な使い方は入門書がいくらでも出ているので今更私が解説するまでもないけど、ブランチ運用については腑に落ちるまで少し苦労したので今回は自分流のブランチ運用をメモとして残しておこうと思う。 ガチの開発勢から色々と文句を言わるかもしれないけど、趣味開発なのでご容赦願いたい。 thomの2ブランチ開発フロー 私は次の表の1~8のような流れで開発を進めている。 このブログの読者はExcelマクロ開発者が多いのでバージョン管理システムを使わないExcel開発を例えとして挙げてみた。対比させるとGitでやっている作業が何をしているのか少しは分かりやすいかなと思う。 本来は2~4を繰り返してこまめにdevブランチを更新しつつ、ある程度キリの良いところで充分にテストをしたうえでmasterへ取り込むんだけど、なんせ一人で開発していてユーザーも大抵自分ひとりというケースが多いので
GitHubを使い始めた背景 最近、Raspberry PiやM5 Stackでの開発が本格化してきたため、レガシーなファイル名によるバージョン管理では限界が来ている。 ラズパイの本番機は先日綺麗にしたのだが、開発機はこのありさま。。 ステージング用に準備したフォルダの筈が、面倒くさくなってVNC接続してそのままVimで色々と作り始めた次第。 完全にworkフォルダの二の舞に。。 ちなみにworkフォルダの様子。。もう何のプロジェクト用だったか分からないファイルが沢山。 いい加減Gitで管理しようということで、再入門してみた。 ※個人のVBAプロジェクトで見よう見まねで使ったことはあるが、書籍を通しで読んで本格的にやるのは初めて。 購入したのはこちらの書籍。 わかばちゃんと学ぶ Git使い方入門 作者:湊川あい,DQNEO発売日: 2017/04/21メディア: Kindle版 一切コマン
今回はRaspberry Pi Zero WHで電光掲示板を動かしてみた。 ただ動かすだけではなく、無線LANに接続して他の端末から受信したメッセージを表示させる。 私がこれを作成した目的は、前回紹介した空気モニターの内容を掲示板に常時表示させるためである。 ※前回記事 thom.hateblo.jp 作成するもの 動作イメージはこんな感じ。 ※mp4からGIFアニメ化したときにかなり高速になってしまったけど、実物はだいたいこれの3分の1くらいのスピードでスクロールする。 色々と調べた結果をベースとしてプログラムで空気品質の基準値を定めていて、基準内の項目は緑の文字で、閾値付近はオレンジで、基準オーバーは赤の文字で表示させるようにした。 材料 Raspberry Pi Zero WH Raspberry Pi Zero WH GPIOピンヘッダー ハンダ付け済み Wi-Fi & Bluet
最近会社の会議でTDDが話題になった。 TDDとは何か?まずWikipediaを引用してみる。 テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。 テスト駆動開発 - Wikipedia 話題になったのは、「プログラムできてないのにテストを書けるの?」ということ。 答えは「Yes」 イメージとしては成果物が満たすべき要件を、最初からテストの形式で定義する感じ。 ちょっとやってみよう。 例えば数値を与えるとExcelの列記号に変換するプログラムを考える。 成果物イメージ 以下は成果物をイメージしやすくするため
今回は、ちょっとPythonを触ってみたいVBA経験者に向けて、簡単なGUIサンプルを紹介する。 Excel VBAではマクロの実行結果がシートに反映されるので、ある意味それ自体がGUIプログラミングと言えるが、殆どの言語では黒い画面に"Hello, World!"から入門するのが通例で、GUIの話は入門書の後半に差し掛かるあたりでちょろっと紹介される程度だ。 一方でGUIについて詳しく書かれた専門書は、黒画面での修行が終わったことを前提にしているので難しい。 黒画面 → 華がないのでやる気がでない。 GUI → 難しいのでやる気がでない。 つまり、ちょっとPythonを触ってみて、GUIが使えることを実感して、モチベーションをあげてから本格的に入門したいという方に向けた体験用コードで、しかもVBA経験者向けというのがなかなか無いので、今回書いてみた次第。 作るもの サンプルなのでシンプル
プログラミングでは、ひとつの言語をマスターすれば、どんな言語でも使えると言われている。 この言説には賛否あるけど、ある意味正しくて、ある意味間違いだと思う。 より正確に言えば、新しく学ぶ言語と既にマスターしている言語に共通する概念についてはスムーズに移行できるということだ。 たとえば変数・分岐・繰り返し・比較演算なんかは、大半の言語が備えている共通概念である。言語によって作法やスタイルが異なるだけで考え方は同じなので、新しく学習する言語でこれらを使いこなすのは難しくない。 仮にVBAを100%マスターしているなら、Pythonの学習範囲はPython特有の部分だけで済む。 まあそうは言ってもなかなか一つの言語をマスターするのは難しい。 VBAの学習割合が少なければ、Pythonをマスターするための学習範囲はより広くなる。 じゃあまずはVBAを極めよう!と考えるかもしれないがそれも早計である
開発中のマクロで、こまめに保存しておきたいケースがあったのでコードを書いてみた。 これは開発中のブックに埋め込んで利用する前提。私は標準モジュール「DevTools」に保存して使っている。 Sub BackupFile() 'Microsoft Scripting Runtimeへの参照設定が必要 Dim fso As FileSystemObject: Set fso = New FileSystemObject With ThisWorkbook Dim f As File: Set f = fso.GetFile(.FullName) Dim backupFolderPath As String: backupFolderPath _ = .Path & "\backup_" & Left(f.Name, Len(f.Name) - Len(fso.GetExtensionName(
今回は忙しすぎる人に確実にメールを読んでもらうためのテクニックについて自分の考察を紹介する。 ここでいう忙しすぎる人とは、「忙しすぎて諦めの境地にいる人」のことだ。諦めの境地なので、基本的に人の頼み事なんて知らんぷり。電話しても日中に繋がることは稀なので、基本コミュニケーションはメールになる。 にもかかわらず、メールはメールで返事が来ないのだ。 しつこく電話をかけ続けてやっと捕まえると、だいたい以下のような反応。 「あれ?そんなメール来てたかな?てへぺろ(・ω<)」 「あれ?何かしないといけないんでしたっけ?てへぺろ(・ω<)」 「あ、私関係ないと思ってました。てへぺろ(・ω<)」 彼らは、「本当に重要なことは、伝える側に責任がある」と考えている。だから、基本的によく読まないと分からないような案件は完全無視を決め込む。さもなくば自分が過労で倒れてしまうからだ。 大事なことなのでもういちどい
冪等性(べきとうせい)とは、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。 言葉の響きは難しいが、これはプログラマーなら何度も遭遇するシチュエーションなので、是非とも覚えておきたい。 たとえばExcelマクロにおいて、以下のコードは冪等ではない。 実行するたびに、オートフィルターのON / OFFが切り替わってしまうからだ。 Sub NotIdempotent() Selection.AutoFilter End Sub 先日業務であるツールを使用する様子を見たが、そのツールで使われていたオートフィルターを設定するコードは冪等ではなかった。 すると、加工するブックは予めオートフィルターを外しておかなければならない。 冪等性に注意を払ってこのコードを作り直すと、以下のようになる。 Sub Idempotent() If Not Selection.Parent.A
こちらの記事で伊藤先生も書かれているように、この数年でVBAのクラスモジュールに関する情報が充実してきている。 これからクラスモジュールについて学習しようと考えている方も沢山(期待を込めて)いらっしゃることと思う。 そこで今回は、オブジェクト指向を学習するにあたってつまづきやすいポイントを紹介し、その処方箋としてアドバイスを書いてみようと思う。 私がオブジェクト指向でつまづきやすいポイントは以下の7つだと考える。 オブジェクト指向の目的が理解できない オブジェクト指向の悪評に惑わされる オブジェクト指向の用語がややこしすぎる オブジェクト指向の前に覚えるべきことを覚えていない オブジェクト指向の一部の特長を過大に受け止めてしまう オブジェクト指向での具体的な実装方法が分からない オブジェクト指向の活用方法が分からない これらは私自身がつまづいたポイントでもある。こうしてみると結構ある。 で
堅牢なソフトウェアを作ろうと思ったら、テストは欠かせないプロセスだ。 ソフトウェアテストというのは、要するに「ちゃんと動くかどうか」を確認する作業なのだが、「使ってみました。たぶん問題ありません。」という簡単な話でもない。 私もあまりテストに関して知識が無かったので、以下の書籍を読んだ。 知識ゼロから学ぶソフトウェアテスト 【改訂版】 作者: 高橋寿一出版社/メーカー: 翔泳社発売日: 2013/12/10メディア: 単行本(ソフトカバー)この商品を含むブログ (7件) を見る 語り口が軽快でサクサク読めるので、テストに興味があるけれどまったく初めてという人にお勧め。 さて、この本で学んだ知識(同値分割法・境界値分析法)を基にFizzBuzzのテストを書いてみようと思う。 まずは、普通のFizzBuzzコード Sub FizzBuzz() For i = 1 To 100 Select C
私がクラスモジュールの使い方を知るまでのエピソード 私が初めてオブジェクト指向の便利さを理解したのは、なぜかVBScriptだった。 ExcelファイルをVBScriptのファイルにドラッグ&ドロップすると内容を読み取ってAccessのデータベースに登録し、ドロップされたExcelファイルは対象年月のフォルダに自動的に格納されるという処理だ。 これまで通りのやり方で作ろうとしたけれど、当時の私にとっては処理が複雑すぎて破綻してしまった。そこでクラスを使うことを思い立ったのだ。 クラスの使い方としては、Excelからの読み取りとAccessへの書き込みをメソッドにしただけの拙いものだったけれど、複雑さをオブジェクトに閉じ込めてメインコードがスッキリ記述できることに感動を覚えた。 これまでJava等で学習してきたオブジェクト指向の知識が初めて実を結んだ瞬間だった。それで、VBAでもオブジェクト
以前、フローチャートを作成するツールの作り方を紹介した。 thom.hateblo.jp こちらの反響が良かったのと、ちょうどお盆休みをいただいてて良い機会なのでもうすこしブラッシュアップし、GitHubで公開してみた。 公開場所とダウンロード方法 以下のリンクにてxlsmファイルを公開中。 BreadChart/BreadChart.xlsm at master · thom-jp/BreadChart · GitHub リンク先に飛んだら右下あたりのDownloadボタンでダウンロード可能。 ソースコードだけ閲覧したい場合は以下BreadChartのトップから src/BreadChart.xlsm を開き、各ファイルを閲覧できる。 github.com 使い方 基本的に使い方は以前のバージョンと同じなので以下のGIFアニメ参照。 以前のバージョンの課題と改善したポイント 以前はセルの
VBAでは、セル範囲と配列の相互変換ができるが、たとえ1列分しか変換しなくても二次元配列となってしまう。 参考 infoment.hatenablog.com VBAのJoin関数でひとつの文字列に加工しようと思ったら色々と工夫が必要なのだが、実はワークシート関数のTRANSPOSEを使うと簡単にできるという裏技がある。 たとえば次のようなデータを用意する。 これを二次元配列arrとして読み込み、Transpose関数を使って一次元配列arr2を作る。あとはJoinするだけ。 Sub 一次元データのみの二次元配列のJoin() Dim arr: arr = Range("A1:A3") Dim arr2: arr2 = WorksheetFunction.Transpose(arr) MsgBox Join(arr2, vbNewLine) End Sub 次に行データだったらどうするか。
タイトルにコンストラクタとあるが、正確にはコンストラクタもどきである。 先日VBAのAriawaseライブラリのCore.basに書かれたInitのコードに感銘を受けた話を書いた。 ただ、私の個人的な好みとしては、外部DLLの参照よりはVBAの基本機能だけで解決してしまいたい。 そこで、Initializableインターフェースを作って対処してみた。 こちらはクラスモジュール:Initializableのコード Public Function Init(p() As Variant) As Object End Function 次に、Initメソッドを実装するクラスモジュール例:SheetExのコード SheetExは、Worksheetのラッパーとして作った。 現時点ではMaxRow,MaxColumnしか無いが、いろいろ拡張できるはず。 (アイデアが無いだけ) Implements
このブログを書き始めた当時、VBA界隈は旧態依然としたコードで溢れていた。 全ての変数はプロシージャの先頭で宣言され、変数名は極端に省略されて読んでも意味が分からず、それを補完するために本来必要のないコメントでコードは散らかっていた。 プログラミング手法はトップエンジニア達の研究・議論・試行錯誤によって磨かれ、時代とともに進化している。 しかしExcel VBA使いの中には「ExcelにはExcelの流儀がある」と言って、新しい考えを受け入れない人もいる。私は当時、Excelの権威とされる人ですら、プログラミングという大きな流れを無視し、VBAをこれまでの小さな世界に閉じ込めようとしているように見えた。 ひょっとしたらVBA書きがプロのエンジニアから小馬鹿にされるのも、プログラミングという大きなフィールドで先人達が積み上げてきたものを無視して、独自の理論を展開するExcelの権威が幅を利か
プログラミングの学習途中で、いくつか難しい概念にぶつかる。 インターフェースもその一つだと思う。このインターフェースは、フォームのボタンなどの、ユーザーインターフェースのことではない。 クラスモジュールなどで作ったオブジェクトに適用するインターフェースのことである。 VBAにもインターフェースの機能が備わっているが、あまり知られていない。 さて、そもそもインターフェースとは何なのか。 インターフェースとは一言でいえば「規格」のようなものである。 世の中はさまざまな規格のおかげで成り立っている。 たとえば先日シェーバーの電池が切れたので単4型の乾電池を買ったが、規格のおかげで悩むことはない。Panasonicでも東芝でも富士通でも、単4であれば好きなメーカーの好きな電池を買えばよい。単4乾電池を名乗るからにはすべて円筒型で、長さ44.5mm、直径10.5mmで1.5ボルトである。そのように規
オブジェクト変数を使い終わった後、必ず変数にNothingをセットしているコードが多いが、実はあれは別に無くても良い。 Nothingを代入することでオブジェクトが破棄されると思っている方も多いと思うが、厳密には違う。オブジェクトの破棄のタイミングは、オブジェクトがどこからも参照されなくなった時だ。 例えば次のコード。 Sub test() Dim C As New Collection With C .Add "A" .Add "B" .Add "C" Set C = Nothing Debug.Print .Item(1) Debug.Print .Item(2) Debug.Print .Item(3) End With End Sub Set C = Nothingの後にDebug.Printしているが、結果はA B Cの順に出力される。 Withブロックから抜けるまではWithが
VBAでは互いに関連するプロシージャをひとつのモジュールに纏めることが多い。 このとき、呼び出す側と呼ばれる側のどちらを先に書けば良いだろうか。 以前の私の考えでは、例えばProc1がProc2を呼び出すとき、呼ばれる側を先に定義しておくという意味で先に書くことがあった。 Sub Proc2() MsgBox "Hello" End Sub Sub Proc1() Call Proc2 End Sub (ただし、VBAの場合はどの順で書いても動くので、過去のコードで厳密にこの原則を守っていたわけではない) 最近Clean Codeという書籍を読んで、完全に考えが変わった。 Clean Code アジャイルソフトウェア達人の技 作者: Robert C.Martin,花井志生出版社/メーカー: KADOKAWA発売日: 2017/12/18メディア: 単行本この商品を含むブログ (1件) を
VBAでは、変数宣言をIfやFor等の制御構文の中に書くことができる。 作法としてどうなのって話は一旦置いといて、とりあえず実証してみよう。 以下のマクロは正常に実行できる。 Option Explicit Sub hoge() If False Then Dim variable As Integer End If variable = 1 Debug.Print variable End Sub Ifの条件式がFalseなので処理されないと勘違いされるかもしれないけれど、宣言文については関係ない。 処理系は制御構文などガン無視でコードを単に上から順になぞって変数宣言を探すので、その変数を初めて使う行よりも上にあればOK。 また、変数宣言はFor文などのループ中に書いても1度しか処理されない。 Option Explicit Sub fuga() Dim i As Integer For
VBAには3種類のプロシージャがある。SubとFunctionとPropertyだ。 しかしその守備範囲はキッチリ線引きされているわけではなく、使い分けに困る場面がある。 今回はその使い分けのヒントとなる考え方を紹介する。 なお、3種類と書いたがProperty にはLet・Set・Getがあるので実際には5種類になる。 このうちLetとSetはいずれも値を設定するという目的が同じなのでひとまとめに扱うことにする。 私がプロシージャを使い分ける際に考えていることを以下2つの表にまとめた。 表が2つあるのは、何のためのプロシージャか(What)と、どのようなプロシージャか(How)の2つの観点で考える為。 What表の解説 単純な手続き 単純な手続きとは、いわゆる「マクロ」など、単純に手続きとしてのプロシージャを指す。 純粋な関数 純粋な関数とは、手続きの外で状態の変更を引き起こさず、ユーザ
Excelには、悪意のあるマクロによってコンピューターが被害を受けることがないようにいくつかの防御機構が備わっている。 しかしExcelマクロの解説書・解説サイト等では利便性の観点からか、設定を無効化しましょうという方向での解説が多く、セキュリティリスクについては「注意しましょう」という漠然とした勧告か「自己責任で」という免責のみで具体的に何をどう気を付ければ良いのかが書かれていないことが多い。 今回は、これらの防御機構の紹介と、正しい活用方法、外した場合の具体的なリスクについて説明する。 Excel 2013を基に紹介するが、これらの機能はExcel 2010にも存在する。(2007にも恐らくあるけれど、持っていないので不明) 目次 (1) 保護ビュー 説明 設定箇所 (2) 標準ブック形式へのマクロ保存不可 説明 (3) セキュリティの警告 説明 設定箇所 (4) VBAによるマクロの
前回、VBAを擬人化して、変数が記号表によって管理されているというところまで書いた。 ※読んでない方はこちら thom.hateblo.jp さて、今回はオブジェクトがメモリ上でどう扱われるのかという話。 次のコードで説明しようと思う。 Dim c As Collection Set c = New Collection オブジェクトはメモリにどのように存在するのか 前回の話では、値がメモリに入っていて、記号表によって変数名とアドレスを対応付けていると説明した。 オブジェクトの場合もこんな風になっているんだろうか。 実はこの図は間違いで、Integer型やLong型のように直接値が入っているわけではない。 オブジェクト型変数の場合、記号表からアドレスを参照した先には、更に別のメモリ領域を指すアドレスが入っていてそこにオブジェクトの実体が居る。 図中にスタックメモリ・ヒープメモリと書いたが、
システムの運用をやっていると、VBAからDOSコマンドとかPowerShellを実行したくなるケースがある。 WScript.ShellのExecメソッドなら標準出力が取得できるのだが、一瞬DOS窓が開いてしまうのがちょっと格好悪い。 非表示でやりたいと思ったら、Runコマンドでコマンド結果をリダイレクトでファイルに書き込み、それを読み込むという面倒なことをしないといけない。 ああ面倒くさい。。 ということで、楽にそういうことができるようにモジュールで包んで抽象化した。 さて、普段なら作り方から説明するんだけれど、今回はコードが長いのでまず使う方のコードを紹介しよう。 使い方 たとえばipconfig /allの結果を取得したいとする。 記述するコードは、 なんと、これだけ!(いぇい!) Sub Sample1() Debug.Print SystemAccessor.GetCommand
今回はクラスモジュールに、自作のEventを実装し、シートモジュールでクラスのイベントを受け取る処理をやってみる。 まずはEventを使用しないクラスサンプル クラスモジュールを挿入し、以下のコードを貼り付け。 ※サンプルなのでクラスモジュールのオブジェクト名はClass1のままとする。 Private num As Long Property Get Value() As Long Value = num End Property Property Let Value(x As Long) num = x End Property 次にSheet1モジュールに以下を貼り付け Private C As Class1 Sub Init() Set C = New Class1 End Sub Sub Plus10() C.Value = C.Value + 10 Debug.Print C.
これは私に関数型言語の素晴らしさを教えてくれた本である。 プログラミングGauche 作者:KahuaプロジェクトオライリージャパンAmazon プログラミングGauche(ゴーシュ)。 一度売ってしまったのだけど、どうしてもその本のコラム「Lisp脳」の謎に迫る-Schemeプログラマの発想がもう一度読みたくなって先日ついに買い戻してしまった。 そのコラムは手続き型の思考と関数型の思考の違いについて説明したもので、初めて読んだときはあまりに考え方が違うので衝撃を受けた。 これはGaucheという言語※の本なので、コラムのコードも当然Gaucheで書かれているのだが、今回はこのコラムの内容をVBAのコードに置き換えて紹介ようと思う。 ※厳密にいうとGaucheは処理系の名称なので、言語名はSchemeだけど、どういうことか説明しだすとややこしいので割愛。 さて、その前に関数型言語について。
タイトルで大きく出てしまった。極意だなんてまあよく恥ずかしげもなく。 「だって教えるプロの~」よりマシか。。なんちゃって。 ま、是非知ってほしい内容ではあるので、釣ってみた感じ。 さて、それなりにVBAを書けるようになった方が次に悩むこととして、プロシージャの分割方法が分からないというものが多い。Functionの使い方が分からないという相談もよくいただくけれど、これもプロシージャ分割の問題。 上級者のコードは1つのマクロで複数のプロシージャを呼び出していたりするので、「ああ自分のコードと違う」と最初に気付くのがこのプロシージャの分割なのかもしれない。 よくある相談として、「どこをどう分けていいかわからない」というものがある。 これ、まずこの日本語を分けよう。 どこを分けていいかわからない どう分けていいかわからない この2つは別物で、前者は設計の話であるし、後者は具体的なコーディングテク
VBAの初心者が書いたコードは、どうしても冗長になってしまう。 知識は無くてもなんとか目の前の業務を楽にしたいという思いで、ネットからコピーしたりマクロの記録コードをつかったりしながらやっとの思いで仕上げたマクロ。私もVBAを始めた当初は、いわゆるコピペプログラマーだったのでよくわかる。 プロシージャを分割したり、関数を作るという発想はなく、同じ処理が出てきたら同じコードをコピーして使いまわす。そうしているうちにコードはどんどん膨らみ、使われなくなった変数やコードの断片が放置され、インデントはバラバラ。冗長で汚い、一度メンテナンスをやめると書いた本人にすら手の付けられないマクロになってしまう。 そこで今回は、他人の書いたVBAのソースコードを読むとき、私がどのようにして作業を進めるかを紹介する。 もちろん、自分が過去に書いた謎のコードを解読するときにも役に立つテクニックである。 具体的な方
前回、業務マニュアルを作る際に重要な3つのポイント(指示の明確さ、メンテナンス性、読みやすさ)について書いた。 thom.hateblo.jp 今回はこのうち、メンテナンス性について、具体的にWordをどう使えばメンテナンス性の良いドキュメントができるのかを紹介する。 文書構造を考える Wordは直観的に操作できるのでその機能を知らなくてもある程度使えてしまう。 これが最大の落とし穴である。 よくある過ち 過ちというのは言い過ぎかもしれないけれど、メンテナンスが面倒くさくなる例として、以下にサンプルの文書を用意した。 一見問題無いように見えるかもしれないが、これは見出しや表題に対して個別に書式を設定しており、ルーラーでインデントを整えたものだ。スタイルを使わないので全体が標準スタイルとなっている。 構造としては、以下のようなイメージ。 まず、手動で書式を設定しているため、同じ見出しのはずが
次のページ
このページを最初にブックマークしてみませんか?
『t-hom’s diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く