質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

2718閲覧

Access VBA フォーム1の値をフォーム2に反映させる際に、型が合っているか事前チェックがしたい

nekomura

総合スコア132

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2016/03/22 05:41

編集2016/03/22 05:42

よろしくお願いいたします。

データベースに格納されている文字列を、初めにMeフォームのテキストに取得します。
そのMeフォームのテキストの値を、フォーム1テキストに、ボタンで取り込むシステムを作りました。

Forms![フォーム1]![テキスト1] = Me![テキスト2]
上記の処理内容が17項目あります。

Meのテキストボックスの値をformsに反映させていくのですが、
その前に、値のチェック処理がしたいのです。
チェック処理は、17回するのでは無く、一気にできればと思っています。

実現したい内容は下記です。

①If Meに値が入っていたら
②●MeとFormsの形式は合っているか
→合っているならそのままMeの値をFormsに反映
③○Else
→Msg ”型が違います”

④If Meに値が入っていなければ
⑤●そのFormsの項目が入力必須項目であった場合

** →Msg ”入力してください”
⑥○Else
→その型の初期値を設定**
とういう処理をしたいのですが、このロジックをうまくコードに書き出せません。
どうか、ご教示いただけますでしょうか。

ちなみに、①のMeに値が入っているかどうかの処理は、フォームのプロパティ「タグ」に入力必須項目の意味としてRequiredという値を記入し、
下記コードを考えてみました。
併せてアドバイスいただければ幸いです。

For Each inputItem In Forms![フォーム1].Controls If inputItem.Tag = "Required" Then If IsNull(CtinputItemrl.Value) Then MsgBox "必須入力です", vbOKOnly inputItem.SetFocus Cancel = True Exit Sub End If End If

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogaaaan

2016/03/22 06:15

ん?バリデーションがしたいってことかな?型チェックだけ?
nekomura

2016/03/22 06:19

ogaaaan様 いつも大変お世話になっております。 バリデーションの意味を調べましたが、今回は型と、nullかどうかのチェックがしたく存じます。 可能であれば、表題の件ご教示いただければ幸いです。
guest

回答3

0

IsString()は無いので、TypeName()関数つかうといいかもしれないすね。
バリアント前提ですが。

http://officetanaka.net/excel/vba/cell/cell02.htm

で、IsNullとこのTypeName関数つかって関数つくっておけば、
処理自体は1個ですみます。

あとはチェックしたいエレメント分、ループでその関数呼び出せばOKかと。

投稿2016/03/22 06:28

ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/03/22 06:40

ogaaaan様 いつもありがとうございます。 ご回答に質問なのですが、 Dim checkValue As Variant   checkValue = TypeName(Me.テキスト名)   ←これを、必要エレメント数分記述し、ループでこの関数(checkValue )を呼び出すということでしょうか。 重ね重ねの質問で恐縮ですが、お答えいただければ幸いです。
nekomura

2016/03/24 06:02

ogaaaaan様 いつもいつもありがとうござます。 関数の使い方や、URLの貼り付け、とても勉強になります。 いつも迅速且つ的確なアドバイスを頂けて本当に感謝です!
guest

0

ベストアンサー

入力項目はテキストボックスですよね。
そもそも.value値がNullになることはないような・・・
(AccessVBAは詳しくないのでお門違いだったらスミマセン)
必須チェックしたいなら、
CtinputItemrl.Value == "" または Len(CtinputItemrl.Value) == 0 じゃないでしょうか。

また、テキストボックスだったら入力された内容は全てString型になるかと。
その上で内容が数値であればIsNumericでTrueになるし、日付であればIsDateでTrueになるんじゃないでしょうか。

と言うわけで、型チェックは↓の感じになるかと思います。

VBA

1' 必須と数値チェックをしたい場合は、Tagに「Required Numeric」を設定する。 2' ※ここでは半角スペース区切りでの例としています。 3Dim chkArr() As String 4Dim idx As Long 5 6For Each inputItem In Forms![フォーム1].Controls 7 chkArr = Split(inputItem.Tag, " ") 8 9 ' Tagを半角スペースで分割してループ 10 For idx = Lbound(chkArr) To Ubound(chkArr) 11 If chkArr(idx) = "Required" Then 12 If IsNull(CtinputItemrl.Value) Then 13 MsgBox "必須入力です", vbOKOnly 14 inputItem.SetFocus 15 Cancel = True 16 Exit Sub 17 End If 18 End If 19 20 If chkArr(idx) = "Numeric" Then 21 If Not IsNumeric(CtinputItemrl.Value) Then 22 MsgBox "数値以外入力できません。", vbOKOnly 23 inputItem.SetFocus 24 Cancel = True 25 Exit Sub 26 End If 27 End If 28 29 ' ほかにチェックしたい内容があれば続けてチェック内容を記載 30 Next 31 32Next

テキストエディタで書いた上に動作確認してないので動かなかったらすみません。

投稿2016/03/23 03:23

編集2016/03/23 03:33
lilithchan

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/03/24 05:58

lilithchan様 いつもお世話になっております。 コードまで書いていただき本当にありがとうございます。 まだ、初心者なのでこういったサンプルコードがあるととても助かります。 こちらをもとに、なんとか解決できそうです。 ありがとうございました。
lilithchan

2016/03/24 08:15

前に比べて質問内容、コードともにめっちゃレベル上がってると思いますよ! 頑張ってください。
nekomura

2016/03/28 00:43

lilithchan さん 嬉しい励ましのお言葉、ありがとうございます。 まだまだ拙い内容ですが、どうぞ今後ともご教示のほどよろしくお願いいたします。
guest

0

http://www.geocities.jp/cbc_vbnet/function/datakata.html

この辺が参考になるかと思いますが、

  • Null チェック: IsNull関数
  • 型チェック : ogaaaanさんがおっしゃるような TypeName関数もしくは IsNumeric関数等それぞれの型に合わせた関数

を使うことで、チェックはできると思います。

nekomuraさんの書かれているコードのNullチェックの分岐内で、Nullの場合の処理は書かれているので Else としてNullじゃない場合に型をチェックするようにされてはいかがでしょうか。
(Typoがいくつかあるようなのでそれは直すとして)

投稿2016/03/22 14:43

編集2016/03/22 14:44
kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/03/23 04:18

本題からそれ気味の、プログラム的な解決ではないですが、Accessのフォームという事であれば、テキストボックス自体に制約をかけるのも1つの方法です。 入力規則や書式の利用である程度の規制はできるとおもいます。
nekomura

2016/03/24 06:01

kaz.Suenaga いつもお世話になっております。 Accessの標準機能を使用することも、視野に入れて使いこなしていきたいと思います。 関数がたくさんあって難しいですが、kaz.Suenagaさんのように丁寧に教えていただくととても勉強になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問