Microsoft Access を使用するときは、多くの場合、データにない値を操作する必要があります。 たとえば、注文の売上税を計算したり、注文自体の合計値を計算したりすることが必要な場合があります。 これらの値は、式を使って計算できます。 式を使うには、適切な構文を使って式を記述します。 構文とは、式の単語と記号を正しく組み合わせるルールのセットです。 初めは、Access の式は少し読みにくいものです。 ただし、式の構文をよく理解し、少し練習すれば、もっと簡単にわかるようになります。
この記事の内容
式の概要
式は、組み込みまたはユーザー定義の関数、識別子、演算子、値、定数のいずれか、またはすべての組み合わせです。これらは、単一の値に評価されます。
たとえば、次の式は一般的な構成要素を含んでいます。
=Sum([Purchase Price])*0.08
-
Sum() は、組み込み関数です。
-
[Purchase Price] は、識別子です。
-
* は、算術演算子です。
-
0.08 は、定数です。
この式をフォーム フッターまたはレポート フッターのテキスト ボックスで使用して、アイテム グループの売上税を計算することができます。
この例よりもさらに複雑な式や単純な式も作成できます。 たとえば、次のBooleanは、演算子と定数のみで構成されます。
>0
この式は、次の値を返します。
-
数値が 0 より大きい場合は True。
-
数値が 0 未満の場合は False。
この式をコントロールまたはテーブルのフィールドの入力規則プロパティで使用して、正の値のみが入力されるようにすることができます。 式は、計算の実行、文字列の操作、データのテストのために、さまざまな場所で使用されます。 テーブル、クエリ、フォーム、レポート、マクロはすべて、式を指定するプロパティを備えています。 たとえば、コントロールのコントロール ソース プロパティと既定値プロパティで式を使用することができます。 また、テーブルのフィールドの入力規則プロパティでも式を使用することができます。
式の構成要素
式を作成するには、関数、演算子、定数、値を使って識別子を組み合わせます。 有効な式には、1 つ以上の関数または 1 つ以上の識別子が含まれている必要があり、定数や演算子を含めることもできます。 また、式は別の式の一部として (通常は関数の引数として) 使うこともできます。 これは、式の入れ子と呼ばれます。
-
識別子 一般的な形式は、次のとおりです。
[Collection name]![Object name].[Property name]
式のコンテキストにおいて識別子を一意にするために十分な部分だけを指定する必要があります。 [Object name] という形式の識別子は珍しくありません。
-
関数 一般的な形式は、次のとおりです。
Function(argument, argument)
通常、引数の 1 つは識別子または式です。 引数を必要としない関数もあります。 特定の関数を使用する前に、その関数の構文を確認します。 詳細については、「関数 (カテゴリ順)」を参照してください。
-
演算子 一般的な形式は、次のとおりです。
Identifier operator identifier
この形式には例外があります。詳細については、「演算子」セクションを参照してください。
-
定数 一般的な形式は、次のとおりです。
Identifier comparison_operator constant
-
値 値は、式の複数の場所で使用することができます。
オブジェクト、コレクション、プロパティ
Access データベース内のすべてのテーブル、クエリ、フォーム、レポート、フィールドは、それぞれオブジェクトと呼ばれます。 すべてのオブジェクトには名前があります。 Microsoft Office Access Contacts テンプレートから作成されるデータベースの Contacts テーブルなどのように、既に名前が付いているオブジェクトもあります。 新しいオブジェクトを作成するときは、オブジェクトの名前を指定します。
特定の種類のオブジェクトのすべてのメンバーのセットは、コレクションと呼ばれます。 たとえば、データベース内のすべてのテーブルのセットはコレクションです。 データベースのコレクションのメンバーであるオブジェクトが、他のオブジェクトを含むコレクションになっていることもあります。 たとえば、テーブル オブジェクトはフィールド オブジェクトを含むコレクションです。
オブジェクトにはプロパティがあります。プロパティは、オブジェクトの特性を記述し、変更する方法を提供します。 たとえば、クエリ オブジェクトの既定のビュー プロパティでは、クエリを実行したときのクエリの表示方法が記述されているだけでなく、ユーザーが指定することもできます。
次の図は、コレクション、オブジェクト、プロパティの関係を示したものです。
|
3 プロパティ 2 オブジェクト 1 コレクション |
識別子
式でオブジェクト、コレクション、プロパティを使うときは、識別子を使って要素を参照します。 識別子には、識別している要素の名前と、それが属する要素の名前が含まれます。 たとえば、フィールドの識別子には、フィールドの名前と、フィールドが属しているテーブルの名前が含まれます。 このような識別子の例を次に示します。
[Customers]![BirthDate]
場合によっては、要素の名前自体が識別子として機能します。 これは、作成している式のコンテキスト内で要素の名前が一意である場合に成り立ちます。 識別子の他の部分は、コンテキストによって暗黙的に示されます。 たとえば、テーブルを 1 つだけ使うクエリを設計する場合、テーブルのフィールド名はそのテーブル内で一意でなければならないため、フィールド名だけで識別子として機能します。 使っているテーブルが 1 つだけなので、フィールドを参照するためにクエリで使っている識別子では、テーブル名は暗黙的に指定されます。
それ以外の場合は、参照が機能するためには、識別子の各部分を明示的に指定する必要があります。 これは、式のコンテキスト内で識別子が一意ではない場合に当てはまります。 あいまいさがある場合は、識別子の十分な部分を明示的に指定して、識別子をコンテキスト内で一意にする必要があります。 たとえば、Products テーブルと Orders テーブルを使うクエリを設計していて、両方のテーブルに ProductID フィールドがあるものとします。 このような場合、どちらかの ProductID フィールドを参照するためにクエリで使う識別子は、フィールド名だけでなくテーブル名も含む必要があります。 次に例を示します。
[Products]![ProductID]
識別子演算子 識別子では、次の 3 つの演算子を使うことができます。
-
感嘆符演算子 (!)
-
ドット演算子 (.)
-
角かっこ演算子 ([ ])
識別子の各部分を角かっこで囲み、感嘆符演算子またはドット演算子を使って各部分を結合します。 たとえば、Employees テーブルの Last Name フィールドの識別子は、[Employees]![Last Name] と表すことができます。 感嘆符演算子は、後に続く部分が感嘆符演算子の前にあるコレクションに属するオブジェクトであることを、Access に伝えます。 この例では、[Last Name] は [Employees] コレクションに属するフィールド オブジェクトであり、[Employees] 自体はテーブル オブジェクトです。
厳密にいえば、識別子または部分識別子を囲む角かっこを常に記述する必要はありません。 識別子にスペースまたは他の特殊文字が含まれない場合は、式が読み取られるときに角かっこが自動的に追加されます。 ただし、角かっこは常に記述しておくことをお勧めします。そうすれば、エラーを回避するのに役立つだけでなく、式の特定の部分が識別子であることを示す視覚的な手がかりとしても機能します。
関数、演算子、定数、値
式を作成するには、識別子だけでなく、何らかのアクションを実行する必要があります。 式の中でアクションを実行するには、関数、演算子、定数を使います。
関数
関数は、式の中で使うことができる手続きです。 Date などの一部の関数は、入力がなくても機能します。 ただし、ほとんどの関数では、引数と呼ばれる入力が必要です。
この記事の最初の例の DatePart 関数では、区間引数 (値は "yyyy") と日付引数 (値は [Customers]![BirthDate]) の 2 つの引数が使われています。 DatePart 関数は、これら 2 つの引数 (区間と日付) は必須ですが、最大 4 つの引数を受け取ることができます。
式でよく使われる関数を次に示します。 その関数で使用する構文の詳細については、各関数のリンクをクリックしてください。
-
Date 関数は、システムの現在の日付を式に挿入するために使います。 Format 関数と共に使われるのが一般的であり、日時データを含むフィールドのフィールド識別子との組み合わせでも使われます。
=Date()
-
DatePart 関数は、日付の一部分を特定または抽出するために使われます。日付は通常はフィールド識別子から取得されますが、Date などの別の関数から返されることもあります。
DatePart ( "yyyy", Date())
-
DateDiff 関数は、2 つの日付の差を取得するために使われます。通常は、フィールド識別子から取得された日付と、Date 関数を使って取得された日付の間隔です。
=DateDiff(“d”, Now(), [Orders].[ReceiveBefore])-10
-
Format 関数は、識別子や別の関数の結果に書式を適用するために使われます。
Format([Date],"ww")=Format(Now(),"ww")-1
-
IIf 関数は、式が true か false かを評価し、true と false の場合で異なる値を返すために使われます。
=IIf([CountryRegion]="Italy", "Italian", "Some other language")
-
InStr 関数は、別の文字列の中の文字または文字列の位置を検索するために使います。 通常、検索対象の文字列はフィールド識別子から取得されます。
InStr(1,[IPAddress],".")
-
Left、Mid、Right 関数は、左端の文字 (Left)、中間の特定の位置にある文字 (Mid)、または右端の文字 (Right) から始めて、文字列から文字を抽出するために使われます。 一般に、InStr 関数と共に使われます。 通常、これらの関数が文字を抽出する元となる文字列は、フィールド識別子から取得されます。
Left([ProductName], 1) Right([AssetCode], 2) Mid([Phone],2,3)
関数の一覧については、「関数 (カテゴリ順)」をご覧ください。
演算子
演算子は、式の他の要素間の特定の算術関係または論理関係を示す単語または記号です。 次の演算子があります。
-
算術演算子。プラス記号 (+) など。
-
算術演算子。等号 (=) など。
-
論理演算子。Not など。
-
連結演算子。& など。
-
特殊演算子。Like など。
一般に、演算子は 2 つの識別子の間の関係を示すために使われます。 次の表では、Access の式で使うことができる演算子について説明します。
算術演算子
2 つ以上の数値から 1 つの値を計算したり、数値の記号を正から負に変換したりするには、算術演算子を使います。
演算子 |
用途 |
使用例 |
---|---|---|
+ |
2 つの数値の和を求めます。 |
[小計]+[販売税] |
- |
2 つの数値の差を求めたり、数値の負の値を示したりします。 |
[価格]-[割引金額] |
* |
2 つの数値を乗算します。 |
[数量]*[単価] |
/ |
最初の数値を 2 番目の数値で除算します。 |
[合計]/[アイテム数] |
\ |
両方の数値を四捨五入したり、最初の数値を 2 番目の数値で除算して、結果を整数に切り捨てたりします。 |
[登録人数]\[部屋数] |
Mod |
最初の数値を 2 番目の数値で除算して、余りだけを返します。 |
[登録人数] Mod [部屋数] |
^ |
指数で累乗した数値に変換します。 |
Number ^ Exponent |
比較演算子
値を比較し、True、False、または Null (未知の値) の結果を返すには、比較演算子を使います。
演算子 |
用途 |
---|---|
< |
1 番目の値が 2 番目の値より小さいかどうかを判定します。 |
<= |
1 番目の値が 2 番目の値以下かどうかを判定します。 |
> |
1 番目の値が 2 番目の値より大きいかどうかを判定します。 |
>= |
1 番目の値が 2 番目の値以上かどうかを判定します。 |
= |
1 番目の値が 2 番目の値と等しいかどうかを判定します。 |
<> |
1 番目の値が 2 番目の値と等しくないかどうかを判定します。 |
いずれの場合でも、1 番目の値または 2 番目の値のいずれかが Null の場合、結果も Null になります。 Null は不明の値を意味するため、Null との比較結果も不明になります。
論理演算子
論理演算子を使って 2 つの値を組み合わせると、結果として True、False、または Null が返されます。 論理演算子は、ブール演算子とも呼ばれます。
演算子 |
用途 |
説明 |
---|---|---|
And |
Expr1 And Expr2 |
Expr1 と Expr2 が True の場合、True になります。 |
Or |
Expr1 Or Expr2 |
Expr1 または Expr2 のいずれかが True の場合、True になります。 |
Eqv |
Expr1 Eqv Expr2 |
Expr1 と Expr2 の両方が True か、Expr1 と Expr2 の両方が False の場合、True になります。 |
Not |
Not Expr |
Expr が True でない場合、True になります。 |
Xor |
Expr1 Xor Expr2 |
Expr1 または Expr2 のいずれか一方だけが True で、両方が True でない場合、True になります。 |
連結演算子
2 つのテキスト値を 1 つの文字列に組み合わせるには、連結演算子を使います。
演算子 |
用途 |
説明 |
---|---|---|
& |
string1 & string2 |
2 つの文字列を組み合わせて、1 つの文字列を作成します。 |
+ |
string1 + string2 |
2 つの文字列を組み合わせて、1 つの文字列を作成し、Null 値を伝達します。 |
特殊演算子
特殊演算子は、次の表に示すように使います。
演算子 |
説明 |
詳細情報 |
---|---|---|
Is Null or Is Not Null |
値が Null か Null でないかを決定します。 |
|
Like "pattern" |
ワイルドカード演算子 ? と * を使って、文字列値の一致を検索します。 |
|
Between val1 And val2 |
数値またはデータ値が一定範囲内にあるかどうかを判別します。 |
|
In(string1,string2...) |
文字列値が、文字列値のセットの範囲内に含まれるかどうかを判別します。 |
定数
定数とは、変化せず、式の中で使うことができる、既知の値です。 Access にはよく使われる定数が 4 つあります。
-
True 論理的に真であるものを示します。
-
False 論理的に偽であるものを示します。
-
Null 既知の値がないことを示します。
-
"" (empty string) 空であることがわかっている値を示します。
定数は関数の引数として使うことができ、条件の一部として式で使うこともできます。 たとえば、クエリで列の条件の一部として空の文字列定数 ("") を使って、その列のフィールド値を評価できます (例: 条件として <>"" と入力します)。 この例では、<> が演算子で、"" が定数です。 一緒に使うと、適用対象の識別子を空の文字列と比較する必要があることを示します。 識別子の値が空の文字列以外である場合、式は True になります。
Null 定数を使うときは注意する必要があります。 ほとんどの場合、Null を比較演算子と組み合わせて使うとエラーになります。 式で値を Null と比較する場合は、Is Null または Is Not Null 演算子を使います。
値
式の中で数字 1,254 や文字列 "Enter a number between 1 and 10." などのリテラル値を使用できます。 一連の数字である数値 (必要に応じて符号や小数点を含む) も使用できます。 符号がない場合は、正の値と見なされます。 負の値にするには、マイナス記号 (-) を付けます。 指数形式も使用できます。 そのためには、"E" または "e" と指数の記号を加えます (例: 1.0E-6)。
テキスト文字列を使用する場合は、Access で正しく解釈されるようにそれらを引用符で囲みます。 状況によっては、Access が自動的に引用符を付けてくれます。 たとえば、入力規則またはクエリ条件の式にテキストを入力すると、Access によって自動的にテキスト文字列が引用符で囲まれます。
たとえば、Paris というテキストを入力すると、式には "Paris" と表示されます。 式で文字列が実際に引用符で囲まれるようにしたい場合は、ネストされた文字列を一重引用符 (') または、3 組の二重引用符 (") で囲みます。 たとえば、次の 2 つの式は同じです。
Forms![Contacts]![City]. DefaultValue = ' "Paris" '
Forms![Contacts]![City].DefaultValue = " " "Paris" " "
日付/時刻の値を使用するには、値をシャープ記号 (#) で囲みます。 たとえば #3-7-17#、#7-Mar-17#、#Mar-7-2017# はいずれも有効な日付/時刻の値です。 Access は # 文字で囲まれた有効な日付/時刻の値を見つけると、この値を自動的に日付/時刻データ型として扱います。
Web データベースでは式の入れ子の制限は 65
65 レベルよりも深い入れ子の式はブラウザーで動作しないため、Access Web データベースでそのような式は使用できません。 エラー メッセージは表示されませんが、式が機能しません。
&、AND、OR の各演算子を使用すると、Access のクライアントに反映されないレベルの入れ子が、サーバーに追加作成される場合があります。 たとえば、式 "a" & "b" & "c" は式ビルダーで入れ子になりませんが、SharePoint ではこれが concatenate.Db("a", concatenate.Db("b", "c") ) になります。 この場合、1 レベルの入れ子が作成されます。 1 つの式で多くの &、AND、OR の各演算子を連続して使用すると、サーバーの入れ子制限である 65 を超える場合があり、ブラウザーで式が機能しなくなります。