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

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

ただいまの
回答率

87.79%

Access 2つのご質問 ①エラー「バリアント型ではない変数にNULL値を代入しようとしました」を解決したい ②サブフォームで、2行目以降のレコードを変更するとそれまでのレコードがすべて同じように変

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,203

score 34

やりたいこと

①エラー「バリアント型ではない変数にNULL値を代入しようとしました」を解決したい
②サブフォームで、2行目以降のレコードを変更するとそれまでのレコードがすべて同じように変わってしまうのを避けたい

なお、記述したVBAは以下のサイトを参考にしています。
コンボボックスのリストを入力値で制限する

詳細

Access2007-2016で勤怠管理フォームを作成しています。以下の画像のように(画像削除:2021/1/11)、メインフォーム「F_勤務時間フォーム」とサブフォーム「SF_詳細入力フォーム」が1つのフォームに表示されており、テーブルの関係は1対多です。
〇詳細入力テーブル
・詳細No:オートナンバー(主キー、フォームには非表示)
・クライアントID:数値(外部キー)
・タスクID:数値(外部キー)
・稼働時間:数値
・稼働分:数値
・コメント:テキスト

※参考
〇T_クライアントテーブル
・クライアントID:オートナンバー(主キー)
・クライアント名:テキスト

ここで、サブフォーム【詳細入力】のクライアントIDを入力するために、左から2番名に以下のようなコンボボックスを追加しています。イベント処理で、「cmb_クライアント名検索」からクライアント名を選択すると、そのクライアントのIDが、【詳細入力】のクライアントIDに入るようにしています。

※最初はクライアントID自体をコンボボックスにしようかとも考えたのですが、結局クライアントIDからでしか検索できなかったため、クライアント名で検索できるように今回の手法をとっています。

〇cmb_クライアント名検索
・コントロールソース:なし
・値集合ソース:クライアント名,クライアントID
・列数:2
・列幅:3cm,5cm

イベント内容

Private Sub cmb_クライアント名検索_Change()
    Dim stSQL As String

    stSQL = "SELECT クライアント名 FROM T_クライアントテーブル WHERE クライアント名 Like '*" & Me.cmb_クライアント名検索.Text & "*';"
    Me.cmb_クライアント名検索.RowSource = stSQL

    If blClick Then
      blClick = False
    Else
      Me.cmb_クライアント名検索.Dropdown
    End If

  Me.クライアントID = Me.cmb_クライアント名検索.Column(1)

End Sub
Private Sub cmb_クライアント名検索_Click()
 blClick = True
End Sub
Private Sub cmb_クライアント名検索_KeyDown(KeyCode As Integer, Shift As Integer)

 If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Then
        Me.cmb_クライアント名検索.OnChange = ""
    Else
        Me.cmb_クライアント名検索.OnChange = "[イベント プロシージャ]"
    End If

End Sub
Private Sub cmb_クライアント名検索_LostFocus()

 Me.cmb_クライアント名検索.RowSource = _
        "SELECT クライアント名, クライアントID " & _
        " FROM T_クライアントテーブル ORDER BY クライアントID;"
End Sub

やりたいこと①

ここで「cmb_クライアント名検索」からクライアント名を選択すると、「バリアント型ではない変数にNULL値を代入しようとしました」とのエラーが発生してしまいます。

おそらく変更時イベントの「Me.クライアントID = Me.cmb_クライアント名検索.Column(1)」が原因なのですが、メッセージボックスで「Me.cmb_クライアント名検索.Column(1)」を表示するときちんとクライアントIDが出てきます。なぜこのようなエラーが発生してしまうのでしょうか。

やりたいこと②

いったん①のエラー個所をなくし、クライアントIDは手動で打ち込むものとします。
1行目のレコードを打ち込むと勝手に2行目にも同じ値が入り、
2行目のレコードを変更すると
1行目の内容も一緒に変わってしまいます。「cmb_クライアント名検索」を、1行単位で行うにはどうすればよいのでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

コンボボックスのプロパティを下記のように設定してください。

cmb_クライアント名検索

  • コントロールソース: クライアントID
  • 値集合ソース: SELECT クライアント名, クライアントID FROM T_クライアントテーブル ORDER BY クライアント名;
  • 連結列: 1
  • 列数: 2
  • 列幅: 3cm;5cm

この設定で、ボックスにはクライアント名か表示されますが、コントロールソースのフィールドには 連結列:1で指定した2列目(クライアントID) の値が格納されます。

こうすれば、コンボボックスで名前を選択すれば、クライアントIDのテキストボックスには自動でIDが表示されます。

このコンボボックスの使い方が理解できれば、クライアントIDのテキストボックスもコンボボックスにして、IDでも名前でもリストから選択できるようになります。詳細は下記を参照してください。

コードでも名称でも入力できるコンボボックス - hatena chips

あとは、cmb_クライアント名検索の変更時のイベントプロシージャを下記のように変更してください。

Private Sub cmb_クライアント名検索_Change()
    Dim stSQL As String

    stSQL = "SELECT クライアント名, クライアントID FROM T_クライアントテーブル " & _
            "WHERE クライアント名 Like '*" & Me.cmb_クライアント名検索.Text & "*' " & _
            "ORDER BY クライアント名;"
    Me.cmb_クライアント名検索.RowSource = stSQL

    If blClick Then
      blClick = False
    Else
      Me.cmb_クライアント名検索.Dropdown
    End If

’ Me.クライアントID = Me.cmb_クライアント名検索.Column(1) ←これは削除してください。
End Sub

これでいけるはずです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/27 14:28

    コントロールソースのフィールドには 連結列:1で指定した2列目(クライアントID) の値が格納されます。>>>連結列:1ではなく2にしたところ、思い通りの操作を行うことが出来ました。これまで連結列という概念を理解していませんでしたが、おっしゃる通りできることの幅が広がった気がします。ありがとうございます。

    キャンセル

0

cmb_クライアント名検索のコントロールソースが空だと全行同じ値になります。
テーブルに検索項目の列を追加してコントロールソースを入れましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • トップ
  • VBAに関する質問
  • Access 2つのご質問 ①エラー「バリアント型ではない変数にNULL値を代入しようとしました」を解決したい ②サブフォームで、2行目以降のレコードを変更するとそれまでのレコードがすべて同じように変