連載第2回目の目的 この連載第2回目では、Excel VBAによるWebサービスの呼び出しとXMLデータの解析についての手順を学びます。連載第1回目では、Excelの備える機能にてほぼ自動的にテーブルへの展開を行っていましたが、今回はそれらをVBAで行います。Webサービスでは、取得できるデータをXML形式で提供しているものもありますので、似たようなケースでは同様の手順でのデータ取得などに応用できるでしょう。 題材としては、株式会社ヴァル研究所の提供する「駅すぱあとWebサービス」を用います。このサービスは、Webサイトやスマートフォンアプリで有名な「駅すぱあと 乗換案内」でできることをWebサービスを通して利用できるようにするものです。継続使用には有償の契約が必要ですが、90日間無償で全機能を使用できる無料評価版がありますので、今回はこれを使用して指定区間の運賃を自動取得するExcelワ
自分が作ったマクロを他人に使ってもらう場合、「何ができるか」という機能だけでなく、「どのように出来るか」という操作性や、「どう感じるか」という審美性も大事である。 素人の手作り感たっぷりのマクロを、本格的なシステムのように感じさせるのはやはりデザインの力だ。 最初のフォーム ここに、「とりあえず作ってみました」的なフォームを用意した。 仮に機能面は満たしているとしても、少々野暮ったい。 特にWindows10で実行すると、ウインドウが平坦なのでテキストボックスが妙に浮いて見える。(下図) 時代の主流はフラットデザイン。 いつまでこの流行が続くのかは分からないが、時流に逆らったデザインは野暮ったく見えるので、テキストボックスのBorderStyleは1-fmBorderStyleSingleにしておこう。 それから、ラベルやボタンのフォントはデフォルトでは「MS UI Gothic 9ポイン
プログラミングでは、ひとつの言語をマスターすれば、どんな言語でも使えると言われている。 この言説には賛否あるけど、ある意味正しくて、ある意味間違いだと思う。 より正確に言えば、新しく学ぶ言語と既にマスターしている言語に共通する概念についてはスムーズに移行できるということだ。 たとえば変数・分岐・繰り返し・比較演算なんかは、大半の言語が備えている共通概念である。言語によって作法やスタイルが異なるだけで考え方は同じなので、新しく学習する言語でこれらを使いこなすのは難しくない。 仮にVBAを100%マスターしているなら、Pythonの学習範囲はPython特有の部分だけで済む。 まあそうは言ってもなかなか一つの言語をマスターするのは難しい。 VBAの学習割合が少なければ、Pythonをマスターするための学習範囲はより広くなる。 じゃあまずはVBAを極めよう!と考えるかもしれないがそれも早計である
VBAの開発画面(VBE)には様々なウィンドウがありますが、その中でも特に奥が深いのがイミディエイトウィンドウです。 イミディエイトウィンドウをどれだけ使いこなしているかで、その人のVBAプログラミングスキルがどれ程のものかひと目で分かる(かもしれません) 今回はそんなイミディエイトウィンドウだけに焦点を絞って、徹底的に紹介していきます。 イミディエイトウィンドウとは なぜイミディエイトウィンドウを使うのか 1.コーディング中に文法や関数を確認する 2.デバッグ中に変数の書き換えや情報出力を行う 3.作業を支援するために使用する VBEのイミディエイトウィンドウの使い方 便利な操作テクニック全集 データ型による整形 セミコロンとカンマによる整形と連結 コロンとアンダースコアによるステートメントの連結と折り返し バッドノウハウ イミディエイトウィンドウの活用事例集 プロシージャ(Sub)を実
堅牢なソフトウェアを作ろうと思ったら、テストは欠かせないプロセスだ。 ソフトウェアテストというのは、要するに「ちゃんと動くかどうか」を確認する作業なのだが、「使ってみました。たぶん問題ありません。」という簡単な話でもない。 私もあまりテストに関して知識が無かったので、以下の書籍を読んだ。 知識ゼロから学ぶソフトウェアテスト 【改訂版】 作者: 高橋寿一出版社/メーカー: 翔泳社発売日: 2013/12/10メディア: 単行本(ソフトカバー)この商品を含むブログ (7件) を見る 語り口が軽快でサクサク読めるので、テストに興味があるけれどまったく初めてという人にお勧め。 さて、この本で学んだ知識(同値分割法・境界値分析法)を基にFizzBuzzのテストを書いてみようと思う。 まずは、普通のFizzBuzzコード Sub FizzBuzz() For i = 1 To 100 Select C
任意のフォルダのサブフォルダに保存されている全ファイルのサイズを取得してグラフ化します。サンプルでは「C:\Tmp」フォルダを調べています。「C:\Tmp」フォルダには「Sub」「Sub2」「Work」「Work2」という4つのサブフォルダを作成し、適当なファイルを保存しました。マクロの後半はグラフを作るコードです。グラフのオプションなどはご自由に設定してください。 Sub Sample08() Dim FSO As Object, f As Variant, cnt As Long Set FSO = CreateObject("Scripting.FileSystemObject") For Each f In FSO.GetFolder("C:\Tmp\").SubFolders cnt = cnt + 1 Cells(cnt, 1) = FSO.GetFolder(f).Name
Chr 【キャラクター】関数ASCII【アスキー】コード対応する文字を取得するには、Chr 【キャラクター】関数を使用します。 ASCII(アスキー)コードとはアルファベット、数字、記号、空白文字、制御文字を収録した文字コードです。 Chr【キャラクター】関数の書式と引数の説明Chr(Charcode) 【戻り値】長整数型(Long)の値。引数Charcodeに指定されたASCIIコードに対応する文字や制御文字などを返します。 Charcode【キャラクターコード】(必須) 取得したい文字のASCII【アスキー】コードを長整数型(Long)の値で指定します。 ※0~31のASCIIコードに対応する文字は表示されません。この範囲には制御文字も含まれています。 ※OSが使用している国別に割り当てられた文字セットにより、127以上のASCIIコードで表示される文字は異なる場合があります。
今回は、指定の標準モジュールにマクロを書いておくとブックの起動時にVBエディタのメニューに自動登録してくれるアドインを作る。 VBエディタのメニューから実行するマクロなので、主に開発支援のためのコードを登録すると便利。 アドイン化することで常にVBエディタ上で実行できるようになる。 目次 マクロの動作解説 活用できる場面 作り方 準備 参照設定 セキュリティ設定 コーディング クラスモジュール 標準モジュール アドイン化 実際に活用してみる 注意事項 今後やりたいこと 参考書籍 マクロの動作解説 1) 「MenuMacros」という名称で標準モジュールを作り、任意のコードを記述する。 ※たとえば以下のコードを挿入する。 Sub hoge() 'H MsgBox "hoge" End Sub Sub fuga() 'F MsgBox "fuga" End Sub Sub piyo() 'P
システムの運用をやっていると、VBAからDOSコマンドとかPowerShellを実行したくなるケースがある。 WScript.ShellのExecメソッドなら標準出力が取得できるのだが、一瞬DOS窓が開いてしまうのがちょっと格好悪い。 非表示でやりたいと思ったら、Runコマンドでコマンド結果をリダイレクトでファイルに書き込み、それを読み込むという面倒なことをしないといけない。 ああ面倒くさい。。 ということで、楽にそういうことができるようにモジュールで包んで抽象化した。 さて、普段なら作り方から説明するんだけれど、今回はコードが長いのでまず使う方のコードを紹介しよう。 使い方 たとえばipconfig /allの結果を取得したいとする。 記述するコードは、 なんと、これだけ!(いぇい!) Sub Sample1() Debug.Print SystemAccessor.GetCommand
開発中のマクロで、こまめに保存しておきたいケースがあったのでコードを書いてみた。 これは開発中のブックに埋め込んで利用する前提。私は標準モジュール「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(
Debug.Print、Debug.Assertはいずれもデバッグ用の機能なので、リリース版のコードには不要である。 かといって消してしまうと、次にコードを修正するときに面倒なので残しておきたい。 そこで代用クラスを作ってみたので紹介。 まずクラスモジュールを挿入し、オブジェクト名をTesterにする。 コードは次のとおり。 #Const VALID = True Const STOP_ON_ASSERTION_FAILURE = False Sub Out(v As Variant) #If VALID Then Debug.Print v #End If End Sub Sub Assert(exp As Boolean, Optional message As String = "Undefined") #If VALID Then If Not exp Then Out "Asse
VBEditorには呼び出し履歴という機能がある。 たとえば、プロシージャProcAからプロシージャProcBを呼び出した際にProcBで実行時エラーを吐いて中断したとする。 このとき、中断モードでプロシージャ呼び出しを遡ることができる機能である。 本記事ではこれを使ったデバッグテクニックを紹介する。 まず次のコードを実行してみる。 Sub ProcA() For i = -5 To 5 Call ProcB(i) Next End Sub Sub ProcB(x) Debug.Print 100 / x End Sub するとゼロ除算エラーが発生する。ここでデバッグをクリックすると、 エラーが発生した行で中断モードになる。 ここでxが0だからエラーになったのは自明である。 カーソルを乗せるか、イミディエイトウインドウで「?x」と入力すればxが0であることが分かる。 しかしなぜxが0になっ
今回はExcelブック単体でVBAを疑似マルチスレッド化できるか実験を行い、見事成功したので紹介します。 きっかけ コード 結果 ちょっとだけ解説 Application.OnTime について まとめ きっかけ 最近(私の中で)話題な「Excel Piano」開発者のA氏がこんなツイートをしていました。 VBAで並列処理するのってどうやるんだろ… VBS呼び出せばいいけどWindows APIの呼び出しがExcel経由でやらんなんくてなんか面倒。 いいやり方知ってる人いたらリプください— あっさん (@Kabura_net14831) 2019年3月26日 彼の言うとおり VBScript を使うことで、並列処理をすることは可能ですが、いろいろと問題があります。 VBSで実現できる並列処理は、疑似マルチスレッド(実際にはマルチプロセス)である。 VBSはExcelのVBEの中でデバッグが
サービス業において、業務工数を見える化するというのはとても難しい。 実績ベースで工数入力をしている職場は多いと思うけど、実際のところその方法は担当者の匙加減で何とでもなってしまう。 工数分析をしようと思ったら、工数は理論値で出して、実績との乖離をヒアリングによって突き止めるのが良いと思う。 それで今回は、以下のようなタスクごとの工数値を管理する表を考えてみた。 これをVBAで集計処理することで、担当者ごとの日々の工数をグラフ化する。 すると、年間を通してスタッフごとの繁忙期・繁忙曜日などが見えてくる。 ※スタッフの工数にあまり偏りが無いのは、業務を調整したあとでスクリーンショットを取った為。 ベースになるExcel表の解説 コードを紹介する前に、Excel表から解説する。 まず冒頭の表は1業務を1行で表している。 ヘッダーの上に薄い文字でManとかSelectとかCalcと書かれているのは
こちらの記事で伊藤先生も書かれているように、この数年でVBAのクラスモジュールに関する情報が充実してきている。 これからクラスモジュールについて学習しようと考えている方も沢山(期待を込めて)いらっしゃることと思う。 そこで今回は、オブジェクト指向を学習するにあたってつまづきやすいポイントを紹介し、その処方箋としてアドバイスを書いてみようと思う。 私がオブジェクト指向でつまづきやすいポイントは以下の7つだと考える。 オブジェクト指向の目的が理解できない オブジェクト指向の悪評に惑わされる オブジェクト指向の用語がややこしすぎる オブジェクト指向の前に覚えるべきことを覚えていない オブジェクト指向の一部の特長を過大に受け止めてしまう オブジェクト指向での具体的な実装方法が分からない オブジェクト指向の活用方法が分からない これらは私自身がつまづいたポイントでもある。こうしてみると結構ある。 で
ソフトウェアは一度作って終わりではなく、公開後もバグの修正や機能向上のため修正を繰り返すことになる。 マクロも同様で、通常はバージョン番号をつけて管理したりする。 バージョン番号の付け方は特に決まっているわけではないが、一般的には次のルールにしていてることが多いようだ。 メジャーバージョン番号.マイナーバージョン番号.リビジョン番号 番号名 意味(私の解釈) メジャーバージョン番号 コンセプトはそのままに一から作り直した場合や、作り直しに相当するほどの大きな変更があった場合に更新。外観の大きな変更を伴うことが多い。 マイナーバージョン番号 機能の追加・削除、操作性の変更等があった場合に更新。 リビジョン番号 バグ修正・リファクタリング(動作に影響を与えないソースコードの整理)等があった場合に更新。 使い捨てマクロならともかく、ある程度使いまわす予定があるならどのみちバージョン管理する羽目に
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く