「型が一致しません」「データ型が変換できません」——Accessを使っていると、こうしたエラーに突き当たる場面が多々あります。フォームに数字を入力したはずなのにテキスト型として扱われてしまう、クエリで文字列フィールドと数値フィールドを比較しようとしてエラーになる、日付として扱いたい文字列がうまく計算に使えない……。いずれもデータ型のミスマッチが原因です。
こうした問題を解決するのが型変換関数です。AccessにはCStr・CInt・CLng・CDbl・CSng・CCur・CDate・CBoolといった変換関数が用意されており、値を別のデータ型に明示的に変換することで型エラーを防ぎ、クエリや演算式を安全に動かせます。
本記事では各型変換関数の構文と動作を整理し、クエリ演算フィールド・フォームの演算コントロール・VBAコードでの実践パターンを解説します。よくある型エラーとその対処法、MOS Access試験との関連ポイントまで体系的にまとめます。
Accessの型変換関数とは
型変換関数は、任意のデータ型の値を指定したデータ型に変換して返す関数群です。関数名の最初の文字「C」は「Convert(変換する)」を意味します。VBAの標準関数として提供されており、Accessのクエリ・フォーム・レポート・マクロのどこでも共通の構文で使えます。
| 関数名 | 変換後の型 | 主な用途 |
|---|---|---|
| CStr(値) | String(文字列) | 数値・日付を文字列として扱いたいとき |
| CInt(値) | Integer(整数 −32,768~32,767) | 小数を整数に丸めたいとき(範囲が狭い点に注意) |
| CLng(値) | Long(長整数 −2,147,483,648~2,147,483,647) | 大きな整数を扱うとき。CIntの代わりに使うのが安全 |
| CDbl(値) | Double(倍精度浮動小数点数) | 高精度の小数演算が必要なとき |
| CSng(値) | Single(単精度浮動小数点数) | 精度が低くてよい場合の小数。CDblが一般的 |
| CCur(値) | Currency(通貨型 小数4桁) | 金額計算で浮動小数点誤差を避けたいとき |
| CDate(値) | Date(日付・時刻) | 文字列や数値を日付型に変換するとき |
| CBool(値) | Boolean(True / False) | 数値や文字列を真偽値に変換するとき |
| CVar(値) | Variant(汎用型) | 型を明示しないが処理が必要な特殊ケース |
変換できない値(例:数値に変換できない文字列「あいう」をCIntに渡す)を渡すと「データ型が変換できません」エラーが発生します。入力値が不定の場合はIIf・IsNumeric・IsDate関数で事前チェックを挟むと安全です。
CStr関数:数値・日付を文字列に変換する
構文と動作
CStr(値または式)
数値・日付・真偽値など、文字列以外の値をString型の文字列として返します。Format関数と異なり書式コードを指定しないため、変換結果はAccessの既定表示に依存します。書式を制御したい場合はFormat関数を使ってください。
クエリでの実践例
想定例:受注番号(数値型)と品名(テキスト型)を「&」演算子で連結して表示ラベルを作りたい場合、数値型フィールドをそのまま&で結ぼうとすると型エラーになります。CStrで文字列に変換してから連結します。
伝票ラベル: CStr([受注番号]) & " " & [品名]
このように演算フィールドの式の中でCStrを使うと、数値を文字列として扱えます。結果は「12345 コピー用紙A4」のような文字列になります。
日付を文字列フィールドと連結する場合:
ラベル: CStr([受注日]) & " 受注分"
CStr([受注日])はAccessの既定書式(例:2026/11/01)で日付を文字列化します。表示書式を指定したいときはFormat([受注日], "yyyy年m月d日")を使ってください。
フォームでの活用
フォームのテキストボックスのコントロールソースに=CStr([ID番号]) & "番"のように記述すると、数値型フィールドの値を文字列として表示できます。フォームの表示専用ラベルを動的に組み立てる場合に役立ちます。
CInt・CLng関数:文字列・小数を整数に変換する
構文と動作
CInt(値または式) ' −32,768~32,767の整数
CLng(値または式) ' −2,147,483,648~2,147,483,647の長整数
どちらも小数部分を四捨五入して整数を返します。CIntは扱える範囲が狭いため、IDや件数のような大きくなりうる数値にはCLngを使うほうが安全です。
四捨五入の仕様:CInt・CLngはいわゆる「銀行丸め(偶数丸め)」を採用しています。0.5の場合は偶数側に丸めます(例:CInt(2.5) → 2、CInt(3.5) → 4)。通常の四捨五入が必要な場合はInt(値 + 0.5)またはRound関数を使ってください。
クエリでの実践例
想定例:外部CSVをインポートした際に単価フィールドがテキスト型になってしまい、金額計算(単価×数量)でエラーが出る場合:
金額: CLng([単価]) * [数量]
CLngでテキスト型の単価を整数に変換してから乗算します。ただし[単価]フィールドに数値に変換できない文字(例:「未定」)が含まれているとエラーになるため、IsNumericで事前チェックするのが安全です:
金額: IIf(IsNumeric([単価]), CLng([単価]) * [数量], 0)
CDbl・CSng・CCur関数:小数・通貨の精度を制御する
構文と動作
CDbl(値または式) ' 倍精度浮動小数点(精度約15桁)
CSng(値または式) ' 単精度浮動小数点(精度約7桁)
CCur(値または式) ' 通貨型(小数4桁まで正確に保持)
金額計算にはCCurが推奨されます。浮動小数点型(CDbl・CSng)は2進数で内部表現するため、0.1×3のような計算で微小な誤差が生じることがあります。CCurは固定小数点演算で小数4桁まで正確に保持するため、金額の累積計算に適しています。
クエリでの実践例
想定例:消費税率(テキスト型で「0.10」として格納されている)を使って税額を計算する場合:
税込金額: CCur([税抜金額]) * (1 + CDbl([税率]))
税抜金額をCCurで通貨型に、税率をCDblで小数に変換してから演算します。結果はCCur型の通貨値になるため、小数誤差を防いだ金額計算ができます。
CDate関数:文字列を日付型に変換する
構文と動作
CDate(値または式)
文字列や数値をDate型(日付・時刻)に変換します。Accessが認識できる日付書式(例:「2026/11/01」「2026-11-01」「November 1, 2026」)であれば変換可能です。認識できない書式の文字列を渡すと「データ型が変換できません」エラーが発生します。
変換が可能かどうかを事前に確認するにはIsDate関数を使います。IsDate(値)がTrueを返す場合のみ変換する書き方が安全です。
クエリでの実践例
想定例:「注文日」フィールドがテキスト型で「2026/11/01」形式の文字列として格納されている場合に、DateDiff関数で今日からの経過日数を計算したい:
経過日数: DateDiff("d", CDate([注文日]), Date())
CDateで文字列をDate型に変換してからDateDiff関数に渡します。IsDateで事前チェックしてNullやエラー値を除外するとさらに堅牢です:
経過日数: IIf(IsDate([注文日]), DateDiff("d", CDate([注文日]), Date()), Null)
CDateで年月日を組み立てる
年・月・日が別々のフィールドに格納されている場合、文字列で組み立ててからCDateで変換できます:
完成日: CDate(CStr([年]) & "/" & CStr([月]) & "/" & CStr([日]))
CBool関数:数値・文字列を真偽値に変換する
CBool(値)は数値0をFalse、0以外の数値をTrueに変換します。文字列は「True」「False」「Yes」「No」の表記が認識されます。
想定例:数値型の「フラグ」フィールド(0 or 1)をYes/No型のコントロールで表示したい場合に演算コントロールのコントロールソースとして使います:
=CBool([フラグ])
チェックボックスコントロールのコントロールソースにCBool式を設定すると、数値0でチェックなし・1以上でチェックありと表示できます。ただし書き込みはできなくなるため読み取り専用のコントロールとして使います。
Val関数・Str関数との違い
古いAccessのVBAコードではVal関数とStr関数が使われることがあります。動作がCInt・CStrとやや異なるため違いを把握しておきましょう。
| 関数 | 動作の特徴 | CInt/CStrとの違い |
|---|---|---|
| Val(文字列) | 文字列の先頭から数値に変換できる部分だけを取り出す | 「12abc」→ 12のように途中で止まる。エラーを出さない代わりに意図しない部分変換が起きる |
| Str(数値) | 数値を文字列に変換する。正の数の前に半角スペースが付く | CStrはスペースを付けない。日本語環境ではCStrが推奨 |
新規にコードを書く場合はVal・StrよりもCInt・CLng・CStrを使うほうがエラーを適切に検出できて安全です。既存コードのVal・Strはそのまま動くので無理に書き換える必要はありませんが、動作の違いを把握しておくことが重要です。
型変換が必要な代表的な場面
場面1:外部データのインポート後に型が崩れる
CSVやExcelファイルをインポートすると、数値フィールドがテキスト型としてインポートされることがあります。この状態のままクエリで四則演算を行うと型エラーが発生します。
よくあるつまずき:テーブルの「金額」列がテキスト型になっており、[金額] * 1.1という式で「式のデータ型が一致しません」エラーになる。
対処法:テーブルをデザインビューで開いてフィールドのデータ型を「数値型」または「通貨型」に変更するのが根本解決です。テーブル構造を変えられない場合はクエリ側でCCur([金額]) * 1.1のように変換します。
場面2:パラメータクエリで型が一致しない
フォームのテキストボックスをパラメータとして使うパラメータクエリで、フォームから渡った値がテキスト型として扱われ、数値型フィールドとの比較で「型が一致しません」エラーが出る場合があります。
対処法:クエリの条件式でCLng([Forms]![フォーム名]![テキストボックス名])のように型変換してから比較します:
条件(クエリデザインの抽出条件行):
CLng([Forms]![F_検索]![txt社員番号])
場面3:VBAでRecordsetを使ってフィールドに書き込む
VBAのRecordsetでテーブルにデータを書き込む際、変数の型とフィールドのデータ型が合っていないとエラーが発生します。
rs!単価 = CCur(txtSingle価.Value)
rs!受注日 = CDate(txtDate.Value)
rs!社員ID = CLng(txtID.Value)
フォームのテキストボックスから取得した値はVariant型(文字列として扱われることが多い)です。テーブルのフィールド型に合わせた型変換関数を挟むことで書き込みエラーを防げます。
よくある型エラーと対処法
| エラーメッセージ | 主な原因 | 対処法 |
|---|---|---|
| 式のデータ型が一致しません | テキスト型フィールドと数値型フィールドを比較・演算しようとしている | CInt・CLng・CDbl等で数値型に変換してから演算する |
| データ型が変換できません | 変換できない値(数値でない文字列など)を型変換関数に渡している | IsNumericやIsDateで事前チェックし、変換できない場合はNullや0を返す |
| 型が一致しません(VBA) | 変数の型とフィールドまたはプロパティの要求型が合っていない | 適切な型変換関数を挟んでから代入する |
| オーバーフローしました | CIntに32,767を超える値を渡した | CIntの代わりにCLngを使う |
| 不正な日付形式です | CDateにAccessが認識できない書式の文字列を渡した | IsDate(値)がTrueの場合のみCDateを呼ぶ。フォーマットを統一する |
MOS Access試験での型変換関連ポイント
MOS Access 365(MO-500)の試験では、主にクエリ(「クエリの作成と変更」)やフォーム・レポート(「フォームの作成と変更」「レポートの作成と変更」)の出題領域で型変換関数が間接的に問われます。出題範囲に含まれます。分野別の出題数・配点は公表されていません。
試験で押さえておくべき型変換の知識は以下の通りです。
- 演算フィールドで型変換関数を使う:デザイングリッドの「フィールド」行に「列名: CInt([フィールド名])」のように記述できること
- IsNumeric・IsDateで安全チェックを行う:IIfと組み合わせて変換前に型チェックする基本パターンを理解していること
- CDateで文字列日付を日付型に変換する:文字列フィールドを日付比較に使うときにCDateを挟む操作を知っていること
- 型エラーの意味を理解する:「式のデータ型が一致しません」「型が一致しません」の原因を理解し、型変換で解決できること
MOS試験 型変換関数チェックリスト
| 確認ポイント | 操作内容 | 難易度 |
|---|---|---|
| CStrで数値を文字列に変換して連結する | 演算フィールドで CStr([数値フィールド]) & “文字” の形式で記述できる | ★☆☆ |
| CLngで文字列を整数に変換して演算する | CLng([テキストフィールド]) * [数量]の式をデザイングリッドに記述できる | ★★☆ |
| CDateで文字列日付を日付型に変換する | DateDiff等の日付関数の引数にCDate([テキスト日付])を使える | ★★☆ |
| IsNumeric・IsDateで型チェックを行う | IIf(IsNumeric([値]), CLng([値]), 0)の形式で安全な変換式を書ける | ★★☆ |
| 型エラーの原因を特定して修正する | 「式のデータ型が一致しません」エラーを見て、型変換関数の挿入で解決できる | ★★☆ |
まとめ:型変換関数でデータ型エラーを確実に防ぐ
本記事のポイントをまとめます。
- 型変換関数の一覧:CStr(文字列)・CInt(整数)・CLng(長整数)・CDbl(倍精度小数)・CCur(通貨)・CDate(日付)・CBool(真偽値)が主要な関数。関数名の「C」はConvertの意味
- CStrで文字列連結を安全に:数値・日付フィールドを&演算子で文字列と結合するときはCStrで変換してから使う
- CLngをCIntより優先する:CIntは−32,767~32,767の範囲制限があり、IDや件数の計算ではオーバーフローのリスクがある。CLngが安全
- 金額計算にはCCur:浮動小数点の微小誤差を避けるため金額はCCurで通貨型に変換してから演算する
- CDateの前にIsDateでチェック:変換できない文字列を渡すとエラーになる。IIf(IsDate([値]), CDate([値]), Null)が定番パターン
- Val・Strは古い書き方:既存コードではそのままでよいが新規コードにはCInt・CStrを使う
- 型エラーの根本解決:テーブルのフィールド型をデータの実態に合わせて正しく設定することが最優先。クエリでの型変換はあくまで対症療法
型変換関数は地味な存在ですが、Accessで実務データを扱ううちに必ず必要になる知識です。外部データのインポート、フォームからのパラメータ受け渡し、VBAでのRecordset操作——どの場面でも「型が合わない」という問題は繰り返し現れます。CStr・CLng・CDbl・CDateの4つを押さえておくだけでも、大半の型エラーを自力で解決できるようになります。MOS試験対策としても、クエリ演算フィールドで型変換式を書く練習を繰り返しておきましょう。
PR
Microsoft 365対応のMOS試験対策テキスト。MOS Access・Excel・Wordを含むシリーズ全体を網羅しており、演算フィールドの設定や型変換関数を含むクエリ操作の模擬問題で繰り返し練習できます。試験前の総仕上げに最適です。
PR
改善Excel パフォーマンスを底上げする仕事改善・効率化テクニック
データ型の扱いや型変換の考え方はExcelとAccessに共通する実務スキルです。データの品質管理・型の統一・変換処理の設計など、業務でデータを「正しく扱う」ための視点が体系的に学べる一冊です。Accessのクエリ設計にも役立つ考え方が身につきます。
