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

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

ただいまの
回答率

90.40%

  • VBA

    2457questions

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

  • Access

    638questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,332

nekomura

score 124

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

データベースに格納されている文字列を、初めに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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ogaaaan

    2016/03/22 15:15

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

    キャンセル

  • nekomura

    2016/03/22 15:19

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

    キャンセル

回答 3

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/22 15:40

    ogaaaan様
    いつもありがとうございます。

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

    キャンセル

  • 2016/03/24 15:02

    ogaaaaan様
    いつもいつもありがとうござます。

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

    キャンセル

checkベストアンサー

+1

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

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

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

' 必須と数値チェックをしたい場合は、Tagに「Required Numeric」を設定する。
' ※ここでは半角スペース区切りでの例としています。
Dim chkArr() As String
Dim idx As Long

For Each inputItem In Forms![フォーム1].Controls
  chkArr = Split(inputItem.Tag, " ")

  ' Tagを半角スペースで分割してループ
  For idx = Lbound(chkArr) To Ubound(chkArr)
      If chkArr(idx) = "Required" Then
        If IsNull(CtinputItemrl.Value) Then
          MsgBox "必須入力です", vbOKOnly
          inputItem.SetFocus
          Cancel = True
          Exit Sub
        End If
      End If

      If chkArr(idx) = "Numeric" Then
        If Not IsNumeric(CtinputItemrl.Value) Then
          MsgBox "数値以外入力できません。", vbOKOnly
          inputItem.SetFocus
          Cancel = True
          Exit Sub
        End If
     End If

     ' ほかにチェックしたい内容があれば続けてチェック内容を記載
  Next

Next

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/24 14:58

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

    こちらをもとに、なんとか解決できそうです。
    ありがとうございました。

    キャンセル

  • 2016/03/24 17:15

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

    キャンセル

  • 2016/03/28 09:43

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

    キャンセル

+1

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/23 13:18

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

    キャンセル

  • 2016/03/24 15:01

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

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • VBA

    2457questions

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

  • Access

    638questions

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

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