bar_1

contents_map

ラベル VBA の投稿を表示しています。 すべての投稿を表示
ラベル VBA の投稿を表示しています。 すべての投稿を表示

2016年12月9日金曜日

LibreOffice Basic のプログラミング: 構文



構文

このセクションでは、LibreOffice Basic の基本的な構文について解説します。詳細情報については、別途用意された『LibreOffice Basic ガイド』を参照してください。
  1. 変数の使用法
    LibreOffice Basic の基本的な変数の使用法について説明します。
  2. オブジェクトの使用法
    オブジェクトカタログには、LibreOffice で作成したモジュールやダイアログの一覧が表示されます。
  3. 手続きおよび関数の使用法
    ここでは、LibreOffice Basic でのプロシージャーおよび関数の基本的な使用法について説明します。
  4. ライブラリ、モジュール、ダイアログ
    ここでは LibreOffice Basic での、ライブラリ、モジュール、ダイアログの基本的な使用法について解説します。

2016年11月28日月曜日

LibreOffice Basic の Option と定数の一覧

LibreOffice BASIC のオプション (Option) と定数 (Constants) について、公式のドキュメントを検索したけど、みつからない。そこで Web 上の情報とソースコードを調べてみた。

2016年11月19日土曜日

LibreOffice Basic のプログラミング: 基本



基本

このセクションでは、LibreOffice Basic の基本について説明します。
LibreOffice Basic のコードは、Sub...End SubFunction...End Function セクションで定義するサブルーチンおよび関数から構成されます。1 つの Sub および Function からは、他の Sub や Function を呼び出すこともできます。Sub や Function を記述する際に、可能な限り汎用的なコードにしておくと、他のプログラムで再利用できる可能性が高まります。プロシージャーおよび関数 も参照してください。
Note.png パブリック変数やサブルーチン、関数の名前にはいくつかの制限が適用されます。同じライブラリのモジュールのいずれかと同じ名前を使ってはいけません。

1. Sub (サブルーチン) の用途

Sub とは、サブルーチン (subroutine) を省略したもので、1 つのプログラム中で実行する特定のタスクをブロック化する際に使用します。 サブルーチンを利用することで、1 つのタスクを複数のプロシージャーに分割することができます。 プログラムの構造を複数のプロシージャーやサブプロシージャーに分割すると、コードの可読性が高まると同時に、エラーの発生を抑える効果も期待できます。 下記の例のように、サブルーチンにはパラメーターとして複数の引数を渡すことも可能ですが、呼び出し元のサブルーチンや関数に戻り値を返すことはできません。
DoSomethingWithTheValues(MyFirstValue,MySecondValue)

2. Function (関数) の用途

Function の基本的な機能はサブルーチンと同じですが、戻り値を返せるという点が異なります。下記の例のように、変数宣言部の右側に関数を配置することも可能で、通常の値の代わりに直接関数を記述することもできます。
MySecondValue = myFunction(MyFirstValue)

3. 大域および局所変数

大域変数とは、1 つのモジュール内にあるすべてのサブルーチンと関数で使用できる変数のことです。これらの宣言は、モジュール内のすべてのサブルーチンや関数より前に記述する必要があります。
個々のサブルーチンや関数の中で宣言した変数は、該当するサブルーチンや関数の内部でのみ使用できます。これらの変数は、上位のサブルーチンや関数から継承した局所変数や大域変数と同じ名前があっても優先的に使用されます。

4. 構造化

プログラムをプロシージャーや関数 (Sub および Function) に分割して記述した場合、個々のプロシージャーや関数をファイルに保存して、他のプロジェクトで再使用することができます。LibreOffice Basic には、モジュールとライブラリ の機能が用意されています。サブルーチンや関数は、常にモジュール内に定義されます。モジュールは、大域的に使用することも、特定ドキュメント内部でのみ使用することもできます。また複数のモジュールをまとめて、1 つのライブラリとすることもできます。
サブルーチン、関数、モジュール、ライブラリは、ダイアログ マクロ を使用することで、ファイル間のコピーおよび移動が行えます。

2016年11月18日金曜日

LibreOffice Basic のプログラミング


Basic ヘルプ > LibreOffice Basic のプログラミング

LibreOffice Basic のプログラミング

(blogspotの記事のパーマリンクでは、アンダースコアを含めても消される)
ここではマクロおよび LibreOffice Basic の一般的な使用法を解説します。
  • 基本
    このセクションでは、LibreOffice Basic の基本について説明します。
  • 構文
    このセクションでは、LibreOffice Basic の基本的な構文について解説します。詳細情報については、別途用意された『LibreOffice Basic ガイド』を参照してください。
  • 統合開発環境 (Integrated Development Environment: IDE)
    このセクションでは、LibreOffice Basic の統合開発環境 (Integrated Development Environment: IDE) について解説します。
  • イベント駆動型マクロ
    このセクションでは、Basic プログラムをプログラムイベントに割り当てる方法について解説します。

LibreOffice Basic ヘルプ

LibreOffice Basic のヘルプ・ドキュメントのHP があまりに使いにくいので、使いやすく改変したものをここに書いていきますね。この記事およびこのブログ (voidptrjp.blogspot.jp) 内のヘルプ・ドキュメントに直接関連する記事のライセンスは LGPLv3 となります。
オリジナルのドキュメントのライセンス表示:
特に記載がない限り、内容はthe GNU Lesser General Public License (LGPLv3), unless otherwise specified, originally based on OpenOffice.org help. “LibreOffice” and “The Document Foundation” are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policyのライセンスで利用できます。

LibreOffice Basic ヘルプ


Basic ヘルプ >

LibreOffice は、LibreOffice ソフトウェア開発キット (SDK) を用いるプログラム開発言語に対して LibreOffice コンポーネントの操作を可能にする、アプリケーションプログラミングインタフェース (API) を提供します。LibreOffice API および ソフトウェア開発キットに関する、より詳しい情報は、http://api.libreoffice.org/ をご覧下さい。
このヘルプ項目は、もっとも一般的な LibreOffice Basic のランタイム機能を説明します。より詳細な情報を得るためには、Wiki の OpenOffice.org BASIC プログラミングガイド を参照してください。

LibreOffice Basic の使い方

ヘルプの操作法

ヘルプではシステムで設定されているデフォルトプログラムの標準設定を参照します。色、マウスの動作、その他の設定できる項目はシステムやプログラムによって異なる場合があります。
  • LibreOffice ヘルプウィンドウ(Common/The_Help_Window.html)
  • Tips and Extended Tips(Common/Tips_and_Extended_Tips.html)
  • 索引 - ヘルプのキーワード検索(Common/Index_-_Keyword_Search_in_the_Help.html)
  • 検索 - 全文検索(Common/Find_-_The_Full-Text_Search.html)
  • ブックマーク管理(Common/Managing_Bookmarks.html)
  • 目次 - ヘルプの主要トピック(Common/Contents_-_The_Main_Help_Topics.html)

2014年3月7日金曜日

VBAUnit の OOo Basic への移植

LBAUnit::Helper


VBAUnit (.NET版) を、OOo Basic に移植しようとしてみた。正確には、OpenOffice ではなく LibreOffice にだけども。

LBAUnit-Helper

ところが、OOo Basic には、Eval がそもそもないらしい
おぉ、なんてこった! なので断念した。

ユニットテスト (一般に xUnit) のフレームワークを作るには、その言語にはメタプログラミングの機能が必要とされる。

メタプログラミングには:


  • eval

  • self

  • lambda

といった機能を言語レベルでサポートしていることが望ましい。とくに、ひとつめの Eval は必須。

ところが、OOo Basic (OpenOffice.org Basic) は、これらのどれもサポートしてないんだな。まぁ、Python や Java, JavaScript でやってくれという話なんだろう……。

いちおう、OOo Basic にも TypeName() といった関数や MRI などリフレクション/イントロスペクションの拡張機能はあるにはあるのだけど、Eval がないとどうにもならない; 例えば、テストケースやメソッドを集めて実行する、という部分には、「コードを書くコード」「コードを実行するコード」を Basic がサポートしている必要がある。

クラスやインタフェースの定義、インスタンス変数、プロパティ、オブジェクトの生成をBasicのみでできることは、確認できたのだけどね……。

なので、あきらめた _(」 L、ソ、)_。

assert関数 と結果表示をするヘルパー関数は作ったので、まぁ、なんかに使えると思ったら使ってください (xba 形式でエクスポートしてあります):




2011年3月24日木曜日

[Excel][VBA]COUNTIF関数を複数条件で使うには?

■背景と問題点


以前のエントリ ([EXCEL][VBA] COUNTIF関数で複数条件を扱うには?(OR条件編), 2008.)で、COUNTIF関数によるORで結合された複数条件を扱う方法を紹介した。しかし、この方法だと場合によっては以下のような不具合がある:
  • 条件を満たすセルの数を、二重にカウントしてしまう
  • AND条件については触れていない
また、この問題をググってみても、どうもこれといって、分かりやすい解法が載っているサイトを見つけることはできない(2011年3月現在); 多くのサイトでは、SUMPRODUCT関数、COUNTIFS関数(Excel 2007以降)を使った方法が紹介されているが、この方法では、AND条件しか、指定することができない。
上述の以前のエントリは、本ブログに挙げて以来、継続的にアクセスがある。 COUNTIF関数で複数条件を扱うのに困っている人は、多そうだ。
この問題は、根本的には、COUNTIF関数の第2の引数である検索条件の記述の不自由さに由来するものと、考える。なぜならば(ヘルプ・ドキュメントによれば、検索条件には「式」を書くことが出来ることになっているが、実際には)、検索条件には、「TRUEもしくはFALSEを返す、2項限定の(論理)式」しか、指定 することが出来ないからだ。
そこで、上記の問題点を踏まえ、今回のエントリでは
  • 以前のエントリのように、二重にカウントすることはない
  • ブーリアン演算の指定、すなわち:
    • 条件指定は、AND条件・OR条件どちらも同時に使用可能
    • 条件項目は、いくつでも可能
  • VBAマクロは使用せず、既存の関数のみの単純な方法
であるような、一般化したCOUNTIF関数で複数条件を扱う方法を、紹介する。

2010年9月27日月曜日

VBAUnit: クラス構成

前回(http://voidptr.seesaa.net/article/163865170.html )は、パッケージ構成についてみた。
本エントリでは、クラス構成についてみてみる。


クラス構成
net版
net版を組み込んだ場合、以下のようになる:
Microsoft Excel Objects  とくになし

標準モジュール VbaUnitMain

クラス モジュール Assert
AutoGen
IAssert
IResultUser
IRunManager
ITest
ITestCase
ITestManager
RectangleClass*
RectangleTesterDisabled
RunManager
SimpleTester
TestCaseManager
TestClassLister
TesterTemplate
TestFailure
TestResult
TestRunner
TestSuite
TestSuiteManager


jp版
jp版を組み込んだ場合、以下のようなプロジェクトが追加される:

VBAHelperProject (VBAHelper.xla) Microsoft Excel Objects Sheet1 (Sheet1)
ThisWorkbook

標準モジュール TestVBAHelperModule
VBAHelperModule

VBAUnit(VBAUnit.xla) Microsoft Excel Objects Sheet1 (Sheet1)
Sheet2 (Sheet2)
Sheet3 (Sheet3)
ThisWorkbook

フォーム frmTestResult

標準モジュール VBAUnitAssert
VBAUnitModule

クラス モジュール TestCase
TestResult
TestSuite

VBAUnit: パッケージの構成

VBAUnitは、SourceForgeのプロジェクトとしては、同名のものが2種類存在する:
rharwood氏によるVBAUnit ( http://sourceforge.net/projects/vbaunit/ ; 2010年現在は、Adminされてない模様)と、ikagawa氏による VBAUnit ( http://sourceforge.jp/projects/vbaunit/ ) である。

以下、rharwood氏によるプロジェクトのパッケージをnet版、ikagawa氏によるプロジェクトのパッケージを、jp版と呼ぶ。


パッケージの構成
パッケージの構成は、以下のとおりである:
●net版
net版は、ドキュメント、クラスファイル、モジュールファイル、サンプル(Excel, Access)からなる。

■ファイル名
vbaunit.zip
■ファイル構成
ファイル名種類パッケージ
vbaunit/
readme.html
modules/
Assert.cls
AutoGen.cls
IAssert.cls
IResultUser.cls
IRunManager.cls
ITest.cls
ITestCase.cls
ITestManager.cls
RectangleTesterDisabled.cls
RunManager.cls
SimpleTester.cls
TestCaseManager.cls
TestClassLister.cls
TesterTemplate.cls
TestFailure.cls
TestResult.cls
TestRunner.cls
TestSuite.cls
TestSuiteManager.cls
VbaUnitMain.bas
samples/
VBAUnit.xls
VBAUnit.mdb

●jp版
jp版は、アドイン形式(.xla)のファイルで構成される。
■ファイル名
VBAUnit.zip

■ファイル構成
VBAUnit/
VBAHelper.xla アドイン形式
VBAUnit.xla アドイン形式

2010年8月23日月曜日

ExcelVBA漢数字を数値に変換するマクロ


Sep. 2nd, 2011追記:久々に見なおしてみたら、千、百、十などの小さなくらいの処理にバグを見つけた。修正したものを github に格納している。下記のコードも更新した。



またこの修正に伴い、新たに、壱萬などの漢字表記による漢数字もサポートする仕様追加を行った。



官公庁の発表している文書を読んでいるときに、グラフにしてみたいデータが有っ
た。そのデータ部分をコピペで、Excelに張り付けていた。


ところが、そのデータは漢数字で表記されていたのだ。当然このデータは、セル
上で文字列(String)として認識される。グラフを作成するのためには、数値デー
タが必要だ──漢数字を、いちいち手打ちで数値に修正するのはバカバカしい…
下向いちゃうし。

 

このような思いから、Excelで、漢数字を数値に変換する方法についてぐぐってみたところ、似たようなニーズがあったようで、いくつか参考となるVBAマクロを見つけることができた。


しかし、この例の場合は

  • 4桁までの数字+位を表す漢数字という形式

  • 位が固定

  • データの指定方法がセルのみ

などの点で、一般性にかけるように思われた。



そこで、当方で

  • 二千十、二〇一〇、2千十、いずれの表記も可

  • 〇~京の単位まで、柔軟に使用可

  • 引数は、セル、もしくは文字列いずれも使用可


であるような、マクロ関数(Function): STRINGNUMBER を作ってみた。




Attribute VB_Name = "KanNum"
'''' KanNum.bas
'
'
'Author: mephistobooks (http://voidptr.seesaa.net)
'Date: 2010 Aug. 13
'Updated: Sep. 1st, 2011 bugfix (千, 百, 十)
'
''' as use stricts in Perl;
Option Explicit
'Private Const DEBUG_KANNUM = True
Private Const DEBUG_KANNUM = False
'NAME
'  STRINGNUMBER
'
'SYNOPSIS
'  =STRINGNUMBER(v)
'  v は、漢数字で書かれた、セルまたは文字列
'
'
'DESCRIPTION
'  漢数字を数値に変換する。数値を漢数字に変換する関数:NUMBERSTRING の逆を行う。
'  漢数字は、京の単位まで指定できる。
'  漢数字の指定方法は、セルまたは文字列で指定できる。
'  漢数字の表記は、下記の例のいずれにも対応:
'
'  例.
'       STRINGNUMBER("一九七六") => 1,976
'   STRINGNUMBER("千九百七十六") => 1,976
'        STRINGNUMBER("56万3千") => 563,000
'  STRINGNUMBER("参阡伍百萬壱拾") => 35,000,010
'
'REFERENCES
'  Q.“Excelで漢数字を数値に変換する方法を教えてください。”
'  http://q.hatena.ne.jp/1268555767
'
Public Function STRINGNUMBER(ByVal varcl As Variant) As Variant
'''
Dim str As String       'kanji-number string (working variable)
Dim str_org As String   'kanji-number string (original)
'
Dim tmp As String
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''' (0) Initialize the variables
'
tmp = TypeName(varcl)
If DEBUG_KANNUM Then
Call MsgBox("TypeName(varcl)[" & tmp & "]" & vbCrLf & _
"str[" & str & "]")
End If
' Process the argument due to its type.
If TypeName(tmp) = "String" Then
str_org = varcl
Else
str_org = varcl.Value
End If
'Kanji-number string.
str = str_org
If DEBUG_KANNUM Then
Call MsgBox("TypeName(varcl)[" & tmp & "]" & vbCrLf & _
"str[" & str & "]")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Algorithm:
'
'*Assumption
'  assume that kanji-number string (漢数字文字列) consists of three type of
'  number string: compound units, semi-compound units, and literal
'  numbers.
'
'  compound units (京,兆,億,万) consists of semi-compound units
'  and literal number string.
'
'  semi-compound units (千,百,十) consists of themselves (ex. 千十),
'  and also they sometimes includes literal number string (ex. 3千4百).
'
'  literal number string (〇~九) is able to convert to number (value)
'  directly.
'
'*Way of getting the value of kanji-number string
'  generate the expression from kanji-number string like the following:
'    ((n_1)億)+(n_2)万+(n_3))
'  where n_? is a*1000+b*100+c*10+d, and a-d here indicates 0-9.
'
'  after the step (4), we can obtain the above expression which
'  consists from only numbers, parentheses, product(*), and addition(+).
'
'  and finally, the value is obtained by evaluation of the generated
'  expression at the step (5)
'
'''' (1) Normalize the value.
'  `normalize' means that hankaku, and all characters of
' [0-9],[〇-九] to [0-9].
'
str = StrConv(str, vbNarrow) '半角
'for semi-compound units
str = Replace(str, "拾", "十")
str = Replace(str, "阡", "千")
str = Replace(str, "萬", "万")
'for the literal number strings.
str = Replace(str, "九", "9")
str = Replace(str, "八", "8")
str = Replace(str, "七", "7")
str = Replace(str, "六", "6")
str = Replace(str, "五", "5")
str = Replace(str, "伍", "5")
str = Replace(str, "四", "4")
str = Replace(str, "三", "3")
str = Replace(str, "参", "3")
str = Replace(str, "二", "2")
str = Replace(str, "弐", "2")
str = Replace(str, "一", "1")
str = Replace(str, "壱", "1")
str = Replace(str, "〇", "0")
'''' (2) Structurize for the compound units: 京,兆,億,万.
'
'  (.*)兆+(.*)億+(.*)万+(.*)
'
str = "(" + str
'
str = Replace(str, "京", ")京+(")
str = Replace(str, "兆", ")兆+(")
str = Replace(str, "億", ")億+(")
str = Replace(str, "万", ")万+(")
str = str + ")"
''' (3) Numerize the value
'semi-compound units
str = Replace(str, "千", "*1000+")
str = Replace(str, "百", "* 100+")
str = Replace(str, "十", "*  10+")
'compound units
str = Replace(str, "京", "*10000000000000000+")
str = Replace(str, "兆", "*    1000000000000+")
str = Replace(str, "億", "*        100000000+")
str = Replace(str, "万", "*            10000+")
''' (4) correct the expression of the value.
str = Replace(str, "()", "0")
str = Replace(str, "++", "+")
str = Replace(str, "+)", "+0)")
str = Replace(str, "(*", "(1*")
str = Replace(str, "+*", "+1*")
If DEBUG_KANNUM Then
Call MsgBox("org:" & str_org & vbCrLf & "str:" & str)
End If
''' (5) Eval the generated expression!
STRINGNUMBER = Application.Evaluate(str)
End Function


各構成単位ごとに、丸括弧でくくることが、みそだ。
最終的に、漢数字部分は数字に置き換えられ、数式の形になる。そして、それがApplication.Evaluate()により、数値に変換される。


Have fun!!


2010年8月13日金曜日

VBAのドキュメントの目次一覧

Microsoftのヘルプ機能は、OSのそれにしろOfficeアプリケーションのそれにし
ろ、まったくひどいしろものだ。なにしろ、知りたい機能で検索しても当該ページがで
てこない。
また、このヘルプ・ドキュメントそのものについても、同じ類のことがいえる:
一覧性が非常にひくいのだ──5万数万もの高い金を取りながら、電子マニュア
ルしか存在しないためだ。

最近、立て続けにそんな経験をしたので、ここにExcel2003 のVisual Basic Editor
のヘルプの目次をテキスト形式で一覧にし、示すこととする。これにより、マニュアル全体
を俯瞰することができ、Googleによってインデックス化されれば、検索性も増すであろう。

対象は、Excel2003のVisual Basic Editorのヘルプメニューを開いたときに出て
来るドキュメントだ。これらは開いたときの順番の通りに、項目を挙げている。
本来的には、順番で読むのに適さないが、資料としてこのままとする。

凡例
このテキストでは、■-□-◆の順に、ドキュメントの階層を表す。■がトップレ
ベルだ。
◆A-Zは、必ずしも、AからZまでの項目があるわけではない;実際には歯抜けと
なる項目が存在する。
��?)は、?アイコンを示す。
項目右端の★は、読むべき注目を表す。基礎的な概念について述べている項目に
付した。というのも、資料は必ずしも理解に適した順番で配列されているわけで
はないのだ。階層構造についても、同じことが言える。機会があれば、VBA版
『プログラミング言語C』を書いてみたい。


Visual Basic Editor のヘルプの目次一覧

■Microsoft Excel Visual Basic リファレンス
 □(?)Microsoft Office Excel オブジェクト モデル
 □新機能

  ◆(?)新しいオブジェクト
  ◆(?)新しいプロパティ(アルファベット順)
  ◆(?)新しいプロパティ(オブジェクト順)
  ◆(?)新しいメソッド(アルファベット順)
  ◆(?)新しいメソッド(オブジェクト順)
  ◆(?)新しいイベント
 □プログラミングの概念・・・★
  ◆ブックとワークシート
  ◆セルとセル範囲
  ◆コントロール、ダイアログ、ボックス、フォーム
  ◆イベント、ワークシート関数、図形
  ◆他のアプリケーションを使って作業する
 □コレクション
  ◆A-Z
 □オブジェクト
  ◆A-Z
 □メソッド
  ◆A-Z
 □プロパティ
  ◆A-Z
 □イベント
  ◆A-Z
 □列挙
  ◆(?)Microsoft Office Excel の定数


■Microsoft Visual Basic Documentation
 □Visual Basic ユーザー インターフェース
  ◆コマンド
  ◆キー
  ◆メニュー
  ◆その他
  ◆ショートカット
  ◆タブおよびダイアログ ボックス
  ◆ツールバー
  ◆ウィンドウ
 □Visual Basic プログラミングのヒント
  ◆(?)名前の二重定義の回避
  ◆(?)同じ名前のプロシージャの呼び出し
  ◆(?)Property プロシージャの呼び出し・・・★
  ◆(?)Sub プロシージャと Function プロシージャの呼び出し・・・★
  ◆(?)オブジェクト変数の作成・・・★
  ◆(?)再帰プロシージャの作成・・・★
  ◆(?)配列の宣言・・・★
  ◆(?)定数の宣言・・・★
  ◆(?)変数の宣言・・・★
  ◆(?)プロパティ設定時のコードの実行
  ◆(?)コードのループ
  ◆(?)For...Next ループの高速化
  ◆(?)引数の効率的な引き渡し
  ◆(?)関数からの文字列の取得
  ◆(?)オートメーションの概要
  ◆(?)条件付きコンパイルの概要
  ◆(?)名前付き引数と省略可能な引数の概要
  ◆(?)オブジェクト、プロパティ、メソッド、およびイベントの概要・・・★
  ◆(?)パラメータ配列の概要・・・★
  ◆(?)適用範囲と参照可能範囲の概要・・・★
  ◆(?)変数の有効期間の概要・・・★
  ◆(?)バリアント型 (Variant)の概要・・・★
  ◆(?)Visual Basic の構文の概要・・・★
  ◆(?)配列の使い方・・・★
  ◆(?)定数の使い方・・・★
  ◆(?)データ型の効率的な使い方
  ◆(?)Do...Loop ステートメントの使い方・・・★
  ◆(?)For Each...Next ステートメントの使い方・・・★
  ◆(?)For...Next ステートメントの使い方・・・★
  ◆(?)If...Then...Else ステートメントの使い方・・・★
  ◆(?)コードでのかっこの使い方
  ◆(?)Select Case ステートメントの使い方・・・★
  ◆(?)With ステートメントの使い方・・・★
  ◆(?)Visual Basic の名前付け規則・・・★
  ◆(?)アプリケーション間の連携
  ◆(?)Function プロシージャの記述方法・・・★
  ◆(?)Property プロシージャの記述方法・・・★
  ◆(?)Sub プロシージャの記述方法・・・★
  ◆(?)代入ステートメントの記述方法・・・★
  ◆(?)ファイルへのデータの書き込み・・・★
  ◆(?)宣言ステートメントの記述方法・・・★
  ◆(?)実行可能なステートメントの記述方法
  ◆(?)Visual Basic ステートメントの作成
 □Visual Basic 開発環境
  ◆(?)オブジェクト ライブラリの確認および参照設定の追加
  ◆(?)実行の継続
  ◆(?)ヘルプから使用例をコピーするには
  ◆(?)プロシージャの作成
  ◆(?)コードへの宣言の入力
  ◆(?)特定のステートメントの実行
  ◆(?)プロシージャの検索・・・★
  ◆(?)変数の定義の検索・・・★
  ◆(?)コード内の文字列の置換・・・★
  ◆(?)実行の再開・・・★
  ◆(?)コード内の文字列の検索・・・★
  ◆(?)タイプ ライブラリへの参照設定
  ◆(?)ブレークポイントの設定と解除
  ◆(?)プロジェクト プロパティの設定
  ◆(?)テキスト ファイルのコードへのインポート・・・★
  ◆(?)Visual Basic 環境オプションの設定
  ◆(?)コード ウィンドウの分割
  ◆(?)コード実行の開始・・・★
  ◆(?)コード実行の停止・・・★
  ◆(?)コード実行のトレース・・・★
  ◆(?)構文チェックの設定と解除の切り替え・・・★
  ◆(?)イミディエイト ウィンドウの使用
  ◆(?)オブジェクト ブラウザの使用・・・★
  ◆(?)プロジェクト エクスプローラの使用・・・★
  ◆(?)プロパティ ウィンドウの使用
 □Visual Basic ランゲージ リファレンス
  ◆定数
  ◆データ型
  ◆ディレクティブ
  ◆イベント
  ◆関数
  ◆グループ
  ◆インデックス/一覧
  ◆キーワード
  ◆メソッド
  ◆その他
  ◆オブジェクト
  ◆演算子
  ◆プロパティ
  ◆ステートメント
 □Visual Basic アドイン モデル
  ◆コレクション
  ◆イベント
  ◆メソッド
  ◆オブジェクト
  ◆プロパティ
 □Microsoft Forms リファレンス
  ◆(?)Microsoft Forms オブジェクト モデルの全体像
  ◆Microsoft Forms デザイン リファレンス
  ◆Microsoft Forms 開発者へのヒント
  ◆Microsoft Forms オブジェクト リファレンス


■Microsoft Office Visual Basic リファレンス
 □(?)Microsoft Office オブジェクト モデル
 □新機能
  ◆(?)新しいオブジェクト
  ◆(?)新しいプロパティ (アルファベット順)
  ◆(?)新しいプロパティ (オブジェクト順)
  ◆(?)新しいオブジェクト (アルファベット順)
  ◆(?)新しいオブジェクト (オブジェクト順)
 □プログラミングの概念
  ◆(?)Microsoft Office ソリューション開発者向けのセキュリティ情報
  ◆Office コマンド バーを使用する
  ◆Office アシスタントを使用する
  ◆(?)コレクションからオブジェクトを取得する
  ◆(?)OLE プログラム ID
  ◆(?)MSDN で MODI VBA のリファレンスを検索する
 □コレクション
  ◆A-Z
 □オブジェクト
  ◆A-Z
 □メソッド
  ◆A-Z
 □プロパティ
  ◆A-Z
 □イベント
  ◆A-Z
 □列挙
  ◆(?)Microsoft Office の定数



References
Microsoft Excel 2003; "Visual Basic のヘルプ"; Microsoft, メニュー>ヘルプ(H)

2008年10月14日火曜日

[EXCEL][VBA] COUNTIF関数で複数条件を扱うには?(OR条件編)



2011年3月24日追記:このエントリは、より一般化された方法によって 改善された

COUNTIF関数は、次のような形式で範囲で指定されたセルの中から、条件を満たすセルの個数をカウントするものである:

=COUNTIF(範囲,検索条件)


ここで、「検索条件」とは

計算の対象となるセルを定義する条件を数値、式、セル参照、または文字列で指定します。
たとえば、検索条件は 32、"32"、">32"、"Windows"、または B4 のようになります
(式および文字列を指定する場合は半角の二重引用符 (") で囲む必要があります)。

[Microsoft Excel ヘルプより]


ところで、この検索条件が複数(OR条件)である場合は、どうしたらよいのだろうか?
単純に、次のようにすればいい:

=COUNTIF(範囲1, 検索条件1)+COUNTIF(範囲2, 検索条件2)





2008年5月28日水曜日

Excel VBA: シート名から目次を自動生成する

Excelで仕様書・設計書を書いているエンジニアは、相当数にのぼると考えられます。タイトルページ、変更履歴、目次、インタフェース、アーキテクチャ、機能一覧、、、。目次なんて、勝手に作ってほしいですよね。ねっ。WORDなら、できるんだし。


今回はそんなとき役に立つ以下のトピックについて、書いてみたいと思います:


  1. 各シートに、ページ・タイトルを設定する

  2. ページ・タイトルの一覧をリスト・アップし、目次を自動生成する

  3. このとき、目次のページ・タイトルをクリックすると、当該ページにジャンプする





1. 各シートにページ・タイトルを設定する



今回は、以下のような仕様でいこうと思います:
  • ページ・タイトルは、シート名と同一とする
  • 各シートのA1セルに、ページ・タイトルを表示する
    当然、シート名を変えたときは自動的に追随するものとします。
  • また各シートへのタイトル設定は、自動でできる



これらは、以下のようなコードで、実現できます:
'name: insert_titles
'date: May 28th, 2008
'author: http://voidptr.seesaa.net/
'desc: 各シートにタイトルを設定する
'
'
Public Sub insert_titles()
Dim ii As Integer

For ii = 1 To ThisWorkbook.Sheets.Count
ThisWorkbook.Sheets(ii).Range("A1").Value _
= "=RIGHT(CELL(" & """" _
& "filename" & """" _
& ",A1), LEN(CELL(" & """" _
& "filename" & """" _
& ",A1))-FIND(" & """" _
& "]" & """" _
& ", CELL(" & """" _
& "filename" & """" _
& ",A1)))"
Next ii
End Sub



シートごとに、A1セルの値を設定しているだけです。

シート名は、Excelの関数cell()から得ています。

ただしcell("filename",A1)だけでは、
フルパス+[xlsファイル名]+シート名

のかたちであるため、シート名の部分だけRIGHT()、LEN()、FIND() で切り取っています。

cell関数を使用しているため、シート名を変更したときは、自動的にタイトルも変わります。


ちょっとわかりにくい点として、ダブル・クォート(”)が4つ、連続して書かれている箇所があります。
これは、文字列としてのダブル・クォートです。

  

2. 目次を自動生成する

ここでは、以下のような仕様で行こうと思います。
  • 目次のページのシート名は、「目次」または「Contents」とする
  • 目次ページより左側にあるシート、および目次ページ自体は、目次に含めない
  • 目次ページには、名前付セル:TITLE_LISTNIG を用意し、このセルから下に向かってページ・タイトルを羅列していく
  • 羅列されたページ・タイトルをクリックすると、そのシートにとぶ



これらは、以下のようなコードで実現されます。
'name: make_contents
'date: May 28th, 2008
'author: http://voidptr.seesaa.net/
'desc: 目次をつくる
'
Public Sub make_contents()
'
Const PAGE_TITLE = "A1"
Const START_LISTING = "TITLE_LISTING"

'
Dim is_after_contents As Boolean
Dim num_sheets As Integer
Dim num_skips As Integer
Dim ii As Integer

is_after_contents = False
num_sheets = ThisWorkbook.Sheets.Count
num_skips = 1

''' list the title pages.
For ii = 1 To num_sheets
'clear old list item.
Range(START_LISTING).Offset(ii).Value = ""


'count the pages before contents.
If is_after_contents = False Then
num_skips = num_skips + 1
End If


'list a item.
If ThisWorkbook.Sheets(ii).Name = "目次" _
Or ThisWorkbook.Sheets(ii).Name = "Contents" _
Then

is_after_contents = True

Else
If is_after_contents Then
Range(START_LISTING).Offset(ii - num_skips).Value _
= "=hyperlink(" _
& """" & "#" _
& "'" _
& ThisWorkbook.Sheets(ii).Range(PAGE_TITLE).Value _
& "'" _
& "!A1" _
& """" _
& "," _
& """" _
& ThisWorkbook.Sheets(ii).Range(PAGE_TITLE).Value _
& """" _
& ")"
End If
End If

Next ii

End Sub



注意としては、セルの名前:TITLE_LISTINGは自分で定義すること。


このマクロを実行すると、目次シートのTITLE_LISTINGセルから下に向かって、ページ・タイトルがずらっと表示されると思います。
各ページ・タイトルは、HYPERLINK関数を利用して表示されているので、クリックすると、実際のページに飛びます。



わかりにくい点として、ダブル・クォートでかこまれたシングルクォートがあると思います。これはなぜ必要か?

シート名によっては、参照がうまくできなくなる場合があるからです。(ハイフンを含んだシート名=ページ・タイトルで試してみて。)
HYPERLINK関数の仕様です。



お好みで、この目次ページに「更新」ボタンなどを定義し、押下したらmake_contents()が実行されるようにしたらよいでしょう。





2008年5月20日火曜日

Excel2003: vbaUnitを使うためのExcelの設定

[Sep. 27th, 2010]追記:2種類のパッケージを混同していたので、記述を修正。
Excel2003の場合、とくに、Visual Basic Applications Extensibility の設定は、いらないのだね。


SourceForgeから、vbaUnit のアドイン・ファイルをダウンロードして来ればいい:
  • http://sourceforge.jp/projects/vbaunit/
  • http://sourceforge.net/projects/vbaunit/

前者は、アドイン(.xla)ファイルが、
後者なら、ReadMeとサンプルもついているよ。(英語だけどね。)

sourceforge.jp版の場合、
ダウンロードしたら解凍して、アドインを組み込めば使えるみたいよ。
ツール>アドイン...>参照...
から、組み込めるよ。
sourceforge.net版の場合、
ダウンロードしたら解凍して、.cls, .basをインポートする。Visual Basic Editorで
ファイル>インポート...
から、インポートできる。

sourceforge.net版のサンプルを試したかったら、Visual Basic Editorから、VBAProject::標準モジュールのVbaUnitMain をまず開いてみて。
それから、イミディエイト・ウィンドウで
prep
run
と、タイプしてみて。

イミディエイト・ウィンドウは、Visual Basic Editorのメニューの
表示>イミディエイト・ウィンドウ
で表示できるよ。

2008年5月1日木曜日

Excel VBA: マクロをテキストファイルに落とす

今日の今日まで知らなかったのだが、EXCEL マクロのソース・コード記述って、テキスト・ファイルに落とせるんだね。いつも、コピペで対応していたよ。

方法は、簡単。

ブラウザ内で、各モジュール配下のオブジェクトを選択>右クリック>ファイルにエクスポート...

で、出力される。

オブジェクトの種類によって、拡張子はいろいろ:.bas, .cls, {.frm, frx} だけどね。
フォームの場合は、ソース・コードそのものとバイナリ・ファイルのペアが出力されるね。
バイナリ・ファイルのほうは、ジオメトリックな情報なんだろうね。