タグ

VBAに関するsanthiagomanのブックマーク (40)

  • VBAでインターフェースを使って引数付きのコンストラクタを実現する。 - t-hom’s diary

    タイトルにコンストラクタとあるが、正確にはコンストラクタもどきである。 先日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でインターフェースを使って引数付きのコンストラクタを実現する。 - t-hom’s diary
  • VBA 開発中マクロブックのバックアップを取るマクロ - t-hom’s diary

    開発中のマクロで、こまめに保存しておきたいケースがあったのでコードを書いてみた。 これは開発中のブックに埋め込んで利用する前提。私は標準モジュール「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(

    VBA 開発中マクロブックのバックアップを取るマクロ - t-hom’s diary
  • VBA コーディングガイドライン - You.Activate

    このガイドラインについて システム開発の会社には、通常コーディングルールというものが存在します。それぞれ会社ごとに異なりますが、コードの品質を一定に保てるよう各社工夫されているようです。 VB.NETやC#、Javaにはコーディングルールを集めた書籍が存在します。 VB.NETルールブック ~読みやすく効率的なコードの原則 C#ルールブック ~読みやすく効率的なコードの原則 Javaルールブック ~読みやすく効率的なコードの原則 これらは何もシステム開発の標準というわけではありませんが、一例として誰でも見られる形で販売されているのは素晴らしいことです。 私はVBAにおいても一応指針となるようなものが欲しいと思い、そのような書籍を待ち望んでいますがどうにも発売される気配はありません。 一応QiitaというサービスでExcel VBAコーディング ガイドライン案というものを見つけましたが、少し

  • VBA コーディング上達のコツは、整理整頓 ~まずは変数名から - t-hom’s diary

    私の部屋には爪切りが3個ある。部屋が散らかってくるといつもどこかへ行ってしまうが、捨てたわけではないので片付けをしたタイミングでまた見つかったりするからだ。このように、部屋が整頓されていないと、同じものを二個・三個買ってしまったりする。 一方、整理整頓された部屋は機能的で見通しがよく、どこに何があるのかすぐわかる。 ものの置き場所はちゃんと決まっており、棚やケースにきちんと収まっている。 箱にはラベルが張られ、いちいち開けなくてもパッと見ただけで中身が分かる。 さて、整理整頓の考えが重要なのはプログラミングの世界でも同じである。 プログラミングスキル上級者はコードの整理整頓が上手い。 というのも、ある程度プログラムが大きくなってくると、ちゃんと整理整頓しておかないとたちまち手に負えなくなるからである。 たとえ自分で作ったコードでも月日がたてば細部は忘れてしまうものである。 特に忘れやすいの

    VBA コーディング上達のコツは、整理整頓 ~まずは変数名から - t-hom’s diary
  • VBA コードの抽象度とは - t-hom’s diary

    具体的、抽象的という言葉について 一般的には、「具体的でわかりやすい」とか、「抽象的でわかりにくい」という使い方をする。具体的でわかりづらい、抽象的でわかりやすいと言われても、「は?」と思う方が大半だろう。 ただプログラミングのような緻密な作業においては、この反転現象がおきる。 たとえば、「歩く」という動作について考えてみよう。この言葉は人間にとって十分具体的だ。しかし、より具体的に言えば、上半身のバランスをとりながら右足と左足を交互に前に出し、重心を前へ前へと運ぶ作業である。もっと具体的に言えば、筋肉Aを収縮させると同時に筋肉Bを弛緩させ、さらに…。 という具合に、具体的になればなるほど意味が分からなくなる。 ある地点を越えると、具体的になればなるほど分かりづらくなる。 そしてそれが、プログラミングの世界である。 コードの抽象度 プログラミングでは、抽象度が高い・抽象度が低いという言い方

    VBA コードの抽象度とは - t-hom’s diary
  • VBA インターフェースを活用してコードの抽象度を上げるテクニック - t-hom’s diary

    以下のような注文票にマクロでデータを記入することを考えてみる。 人間が記入する場合は、次のように考えながら記入していくだろう。 「注文票の、ひとつ目の商品名は"パソコン"で、単価は10万円、個数は40個。二つ目の商品は"複合機"で、単価は150万円、個数は2個。」 これをVBA風に書くと、こうなる。 Sub 注文記入() With 注文票.注文(1) .品名 = "パソコン" .単価 = 100000 .個数 = 40 End With With 注文票.注文(2) .品名 = "複合機" .単価 = 1500000 .個数 = 2 End With End Sub やりたいことがそのまま表記され、極めてシンプルなコードである。 が、もちろん普通はこんな風には書けない。 それを何とかしてしまおうというのが今回のテーマ。 普通にマクロを組む場合 まず普通にマクロを組む場合について考えてみよう

    VBA インターフェースを活用してコードの抽象度を上げるテクニック - t-hom’s diary
  • VBA 私がコードを整理するときの思考プロセスを紹介 - t-hom’s diary

    今回は私が普段どんなことを考えながらコードを整理しているのかを紹介する。 題材としてはなるべくシンプルなものがよかったので、カレンダーのヘッダー部分を作成するマクロを取り上げた。 最初に書いたコードがどういう風に変化していくか、またなぜそのように変更したのかに注目していただければと思う。 最初のコード まずはよく初心者が書くようなコード。 Book1.xlsmの、標準モジュールに書く想定である。 Sub カレンダー() Workbooks("Book1.xlsm").Sheets(1).Activate Range("B2").Value = "日" Range("C2").Value = "月" Range("D2").Value = "火" Range("E2").Value = "水" Range("F2").Value = "木" Range("G2").Value = "金" R

    VBA 私がコードを整理するときの思考プロセスを紹介 - t-hom’s diary
  • VBAのコーディングガイドラインを作ってみた - t-hom’s diary

    VBAのコーディングガイドラインを作ってみた。 掲載先は私のメインサイト。 VBA コーディングガイドライン - You.Activate ガイドライン作成にあたり参考にしたのはこちらの4冊 VB.NETルールブック ?読みやすく効率的なコードの原則 作者: 向山隆行,片山優司,阿部順一,寺田和朗,畑中良平,電通国際情報サービス出版社/メーカー: 技術評論社発売日: 2010/12/10メディア: 単行(ソフトカバー) クリック: 26回この商品を含むブログ (1件) を見るリーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典出版社/メーカー: オライリージャパン発売日: 2012/06/23メディア: 単行(ソフトカバー)購入: 68人

    VBAのコーディングガイドラインを作ってみた - t-hom’s diary
  • VBA マクロが遅い・速いという議論は、要件ありきの話 - t-hom’s diary

    VBAのコードについて、よく、この手法は遅いから使うなという話を聞く。高速化万歳! またはその逆で、高速化のためにわかりやすさを犠牲にするなどナンセンスだ!という話も聞く。 この記事では前者を「$バンザイ」、後者を「$ナンセンス」と呼ぼう。 $バンザイと$ナンセンスはどちらも自分の考えが正しいと信じており、否定しようものなら青筋を立てて反論してくることだろう。 問題はそこにある。あまりにも感情移入しすぎている。 私が思うに、$バンザイと$ナンセンスはどちらも正しくない。個々の要件、シチュエーションが考慮されていないからだ。 $バンザイは、マクロが高々1分速くなったところでビジネス的には大して変わらないという観点が抜け落ちている。 実行に15分かかる処理が14分になったところで、気づきもしないだろうし、そのような高速化にあまり意味はないと思う。 また、月に1度しか発生しない作業なら、2分を1

    VBA マクロが遅い・速いという議論は、要件ありきの話 - t-hom’s diary
  • VBA マクロの高速化のためのApplication設定をクラスモジュールにまとめる - t-hom’s diary

    今回はちょっと変わったクラスモジュールのテクニック案。 異端扱いされそうな気がするので、思いついた私自身、採用には慎重なのだけれど、アイデアとしては面白いと思ったので備忘録として公開してしまうことにした。 さて、過去にPropertyプロシージャを使った高速化テクニックというのをやった。 thom.hateblo.jp 今回も基的にはApplication設定を変更するだけなのだが、クラスモジュールを使って更に怠慢にやろうという話。 作り方 クラスモジュールを挿入し、オブジェクト名を「OneTimeSpeedBooster」に変更する。 このクラスの名前付けは超重要!! そもそも馴染みのない異端テクニックなので、何がしたいのか名前で示さないと訳が分からなくなる。 クラスに書くコードはこちら。 Private Sub Class_Initialize() With Application

    VBA マクロの高速化のためのApplication設定をクラスモジュールにまとめる - t-hom’s diary
  • VBAで関数型プログラマーの思考法を学ぶ - t-hom’s diary

    これは私に関数型言語の素晴らしさを教えてくれたである。 プログラミングGauche 作者:KahuaプロジェクトオライリージャパンAmazon プログラミングGauche(ゴーシュ)。 一度売ってしまったのだけど、どうしてもそののコラム「Lisp脳」の謎に迫る-Schemeプログラマの発想がもう一度読みたくなって先日ついに買い戻してしまった。 そのコラムは手続き型の思考と関数型の思考の違いについて説明したもので、初めて読んだときはあまりに考え方が違うので衝撃を受けた。 これはGaucheという言語※のなので、コラムのコードも当然Gaucheで書かれているのだが、今回はこのコラムの内容をVBAのコードに置き換えて紹介ようと思う。 ※厳密にいうとGaucheは処理系の名称なので、言語名はSchemeだけど、どういうことか説明しだすとややこしいので割愛。 さて、その前に関数型言語について。

    VBAで関数型プログラマーの思考法を学ぶ - t-hom’s diary
  • VBA SubとFunctionとPropertyの使い分け - t-hom’s diary

    VBAには3種類のプロシージャがある。SubとFunctionとPropertyだ。 しかしその守備範囲はキッチリ線引きされているわけではなく、使い分けに困る場面がある。 今回はその使い分けのヒントとなる考え方を紹介する。 なお、3種類と書いたがProperty にはLet・Set・Getがあるので実際には5種類になる。 このうちLetとSetはいずれも値を設定するという目的が同じなのでひとまとめに扱うことにする。 私がプロシージャを使い分ける際に考えていることを以下2つの表にまとめた。 表が2つあるのは、何のためのプロシージャか(What)と、どのようなプロシージャか(How)の2つの観点で考える為。 What表の解説 単純な手続き 単純な手続きとは、いわゆる「マクロ」など、単純に手続きとしてのプロシージャを指す。 純粋な関数 純粋な関数とは、手続きの外で状態の変更を引き起こさず、ユーザ

    VBA SubとFunctionとPropertyの使い分け - t-hom’s diary
  • VBA 標準モジュールの分割基準 - t-hom’s diary

    VBAではマクロを記述する場所として複数の標準モジュールを利用できるが、何を基準に分けたら良いか分からないというツイートを見かけたので、私の考えを記しておこうと思い久々にブログ更新。 モジュール分割の大前提として、私はまずプロシージャが適切に分割されているかどうかが重要だと考える。 例えば以下のようにそれぞれのマクロが単一のプロシージャで構成されているとき、モジュール分割の動機は薄い。 しかしプロシージャの分割を覚えると、単一の機能を果たすマクロが複数のプロシージャで構成されることが発生する。 紙面の都合で2つのマクロを図示しているが、実際にはどんどんマクロが増え、どのマクロがどのプロシージャを呼び出すのが、ごちゃごちゃして訳が分からない状態になってくる。 すると、モジュールを分割して整理したいという要求が生まれる。 【注意】図ではマクロ1つに1モジュールになっているがこれはあくまで紙面の

    VBA 標準モジュールの分割基準 - t-hom’s diary
  • VBA 中級者を悩ませるプロシージャ分割をマスターする極意 - t-hom’s diary

    タイトルで大きく出てしまった。極意だなんてまあよく恥ずかしげもなく。 「だって教えるプロの~」よりマシか。。なんちゃって。 ま、是非知ってほしい内容ではあるので、釣ってみた感じ。 さて、それなりにVBAを書けるようになった方が次に悩むこととして、プロシージャの分割方法が分からないというものが多い。Functionの使い方が分からないという相談もよくいただくけれど、これもプロシージャ分割の問題。 上級者のコードは1つのマクロで複数のプロシージャを呼び出していたりするので、「ああ自分のコードと違う」と最初に気付くのがこのプロシージャの分割なのかもしれない。 よくある相談として、「どこをどう分けていいかわからない」というものがある。 これ、まずこの日語を分けよう。 どこを分けていいかわからない どう分けていいかわからない この2つは別物で、前者は設計の話であるし、後者は具体的なコーディングテク

    VBA 中級者を悩ませるプロシージャ分割をマスターする極意 - t-hom’s diary
  • VBA Set Obj = Nothing は必要か - t-hom’s diary

    オブジェクト変数を使い終わった後、必ず変数に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 Set Obj = Nothing は必要か - t-hom’s diary
  • VBA マクロ高速化のために停止すべき3項目 - t-hom’s diary

    VBAでは画面描画を停止すると実行が早くなることは広く知られているが、実はあと2つ、設定すると有効なオプションがある。 手動計算と、イベントの抑制だ。 それぞれ、次のようにして設定する。 Application.ScreenUpdating = False '描画停止 Application.EnableEvents = False 'イベント抑制 Application.Calculation = xlCalculationManual '手動計算 With文で一度に設定しても良い。 With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual End With 設定を解除するには次のようにする。 With Application .ScreenUpdat

    VBA マクロ高速化のために停止すべき3項目 - t-hom’s diary
  • VBA モジュールのプロシージャは呼び出し順に書く - t-hom’s diary

    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 モジュールのプロシージャは呼び出し順に書く - t-hom’s diary
  • VBA マクロで利用する設定値をシートに保存し、文字列でアクセスするテクニック - t-hom’s diary

    今回はマクロで利用する設定値をシートに保存し、汎用的に文字列でアクセスできるようにするテクニックの紹介。 作り方 標準モジュールを挿入し、プロパティウィンドウからオブジェクト名をConfgに変更する。 Configモジュールに以下のコードを張り付ける。 Option Explicit Private configurations As Variant '<- configulations is keepd here as variant array. Private Property Get InitialSettings() As Collection Set InitialSettings = New Collection InitialSettings.Add Array("Name", "Value", "Description") '←見出しです。 '以下のサンプルに従って設定を

    VBA マクロで利用する設定値をシートに保存し、文字列でアクセスするテクニック - t-hom’s diary
  • VBAの自作クラスでデフォルトプロパティを設定する方法 - t-hom’s diary

    海外のサイトで、自作のクラスにデフォルトプロパティを設定する方法を発見した。 (リンク先は英語) http://www.cpearson.com/excel/DefaultMember.aspx デフォルトプロパティとは、クラス名だけで参照できるデフォルトの値のことである。 たとえば、ExcelのRangeオブジェクトのデフォルトプロパティはValueなので、Range("A1").Value = 1と書かなくてもRange("A1") = 1と書くだけでValueプロパティにアクセスできる。 こういったデフォルトプロパティを自作クラスに実装する方法である。 やり方は以下のサンプルのとおり。 例として、Personクラスを作ったとする。 Private p_name As String, p_age As Integer Property Get Name() As String Name

    VBAの自作クラスでデフォルトプロパティを設定する方法 - t-hom’s diary
  • http://www.openreference.org/articles/view/583