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

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

ただいまの
回答率

90.35%

  • SQL

    3225questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VBA

    2541questions

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

  • Access

    659questions

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

Access VBA  フォーム作成 検索条件

解決済

回答 3

投稿

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

nekomura

score 130

よろしくお願いします。

フォーム画面にボタンとテキストボックスを用意して、    
 'invoiceNo と'invoiceDisplay としたテキストボックスに検索条件を入力し、    
ボタンを押下すると、accessで作ったテーブル(AccessTable )のデータ(接続文字列)を使って、   
SQLサーバにあるテーブル(tbmCountry)の内容を取得し、フォーム上のリストに反映されるようにしています。 

コード内でコメントアウトしているIF文が今回手詰まりになっているところです。
テキストボックスのいずれかに値が入っていれば、where句で取得した列数と、変数に代入している数値を演算子で比較し、msgボックスを出す機能を実装したいのですが、コメントにあるように型が合わずエラーになります。

つまり、変数strSqlに、SQL文ではなく、SQL文で取得した列数を格納したいのです。

調べたのですが、なかなかしっくりくるものが無く、有職者の方よりご回答いただければ幸いです。

'#####################################################################
'# Name         : データ取得_Click
'# Description  : 入力の画面に対し管理システムより指定したデータの取込 
'#####################################################################
Private Sub データ取得_Click()
      '  On Error GoTo Err_データ取得_Click

 '*****DB接続変数定義*****
 Dim DB                 As Database
 Dim q1                 As Recordset, q2 As Recordset
 Dim SQLCommand         As String   'データベース接続文字列を取得するSQL文
 Dim strConnection      As String       'データベース接続文字列
 Dim strCount           As Integer      'データ件数
 Dim objCon             As New ADODB.Connection
 Dim objRs              As New ADODB.Recordset
 Dim dbCom              As ADODB.Command

    Set DB = CurrentDb()

    'データベース接続文字列を取得するSQL文
    SQLCommand = "SELECT ID, Value FROM AccessTable WHERE ID = 1"
    Set q1 = DB.OpenRecordset(SQLCommand)

    '取得したデータベース接続文字列
    strConnection = q1!Value


    'データ件数を取得するSQL文
    SQLCommand = "SELECT ID, Value FROM AccessTable WHERE ID = 2"
    Set q2 = DB.OpenRecordset(SQLCommand)

    '取得したデータ件数
    strCount = q2!Value


 '*****フォーム変数定義*****
  Dim invNo     As Variant         'invoiceNo
  Dim invDisp   As Variant         'invoiceDisplay


    invNo = Me.invoiceNo
    invDisp = Me.invoiceDisplay

   '検索条件が未入力の場合
   If IsNull(invNo) And IsNull(invDisp) Then
        MsgBox "検索条件を指定してください"
       Exit Sub


     'テキストボックスに値が両方、またはいずれかが入力されている場合
      ElseIf Not IsNull(invNo) Or Not IsNull(invDisp) Then


           '接続文字列を取得しSQLサーバーへ接続
           objCon.ConnectionString = strConnection


          strSql = "SELECT COUNT (CountryCode) FROM tbmCountry "
           objCon.Open


         //strSql = sql文 、   strCount = 数値 の為型が違うとエラーが出る。
         //strSqlの値を、sql文そのものではなく、sql文で取ってきた列の数を入れて、演算子で比較したい
     If (strSql >= strCount) Then
                     MsgBox "検索条件を指定してください"
              Exit Sub     


           objRs.Close
           objCon.Close

           Set objRs = Nothing
           Set objCon = Nothing



        End If

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • ogaaaan

    2016/03/14 17:29

    『調べたのですが』←調べた内容も簡単で良いので書いてもらえるといいかと。『なかなかしっくりくるものが無く』←どういう状態がゴールなんでしょう?

    キャンセル

  • 退会済みユーザー

    2016/03/14 17:32

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • nekomura

    2016/03/14 18:41

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

    はい、大変失礼いたしました。
    うまくコードが書けずあせってしまい抽象的な表現をしてしまいました。
    ご指摘ありがとうございます。
    後ほど本文は修正し、以後気をつけますのでよろしくお願いいたします。

    キャンセル

回答 3

checkベストアンサー

+2

元回答の方への通知が大変なことになりそうなので、こちらで続きを書いてきます。

本来、「ADODB.RecordSet#Fields」ってのは取得したデータ行の各項目を取得できるプロパティです。

まずは、「objRs.Fields」をウォッチ式に入れてデバッグしたらどうなるか見てみましょう。

その結果がEmptyであれば、選択結果へのカーソル位置がおかしいのかもしれません。

その場合、上のウォッチ式の前の行に「call objRs.MoveFirst()」を突っ込んでみてからデバッグしてみてください。

■以下追記

lilithchanさんの回答に対するコメント内ソース見てたら、「objCon.Open」の前に「Set objRs = objCon.Execute」してるじゃないすか。
lilithchanが回答で書かれてる

①DBとの接続を確立する 
②SQLを実行してレコードセットを取得する 
③レコードセットから該当カラムの値を取得する

の部分、ちゃんと守りましょうよ。
Openして、Executeして、値取得ですよ。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/15 10:12

    tkturbo様

    未熟な質問にもかかわらず、このように真摯に回答頂きとても感謝しております。
    何度もご回答頂き、本当に助かっておりますことは事実です。
    ちょっとまだ解決に至ってないので、ご指摘のようにもう少し自身でも分析してみます。
    またご報告させていただきたいのでどうぞ引き続きよろしくお願いいたします

    キャンセル

  • 2016/03/15 10:15


    twck 様
    追記、ありがとうございます。
    低次元の質問にもかかわらず辛抱強くお答え頂き、感謝しています。
    もう少し勉強して、
    twck 様にお答えいただいたコードもじっくり読み解いていきたいと思います。
    またご報告させていただきたいのでどうぞ引き続きよろしくお願いします。

    キャンセル

  • 2016/03/15 17:42

    頑張ってくださいね。
    みんな最初はそこからです。

    キャンセル

+2

ちょっと前の質問でほかの方が回答されていた、

>「Set objRs = objCon.Execute (SQL文)」とかじゃだめですかね?

は試しましたか?
上記後にobjRs([カラム名]).valueで値はとれます。
質問文に書いてあるコードではDBとの接続を確立しただけでSQLが実行されていません。

SQLの結果を取得するには必ず以下の手順が必要です。
①DBとの接続を確立する
②SQLを実行してレコードセットを取得する
③レコードセットから該当カラムの値を取得する

上記が分からないままやってコードがごちゃごちゃになっているように思います。
まずは上記の手順を理解した上でコードを書いて見て下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/14 18:39

    tkturbo様
    誠にありがとうございます。。。

    <モジュールはコンパイルできません>empty型
    との結果です。

    キャンセル

  • 2016/03/14 18:48

    (横入り失礼)

    ではデバッガ+ウォッチ式で「objRs.Fileds」と「objRs」も見てもらえますか?
    それぞれどうなっていますか?

    キャンセル

  • 2016/03/14 19:03

    新しい回答枠の「■以下追記」のところで結論が出たので、このコメント欄はストップします。

    キャンセル

+2

tkturboさん、ありがとうございますw

そして、
objRs.Fields(0).Valueをそのまま使ってもだめです。
なにか変数にいれないと。

言われた事をそのままやってエラーになりました教えて下さいではなく、
何が悪いのか自分でも分析・調査しないと・・

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/15 10:10

    lilithchan様
    なるほど…。
    そうですよね、申し訳ありませんでした。
    どうしてエラーとなるかが理解できておらず、ついそのまま試しては焦っておりました、反省です。

    未熟な質問にもかかわらず、このように真摯に回答頂きとても感謝しております。
    ちょっとまだ解決に至ってないので、ご指摘のようにもう少し自身でも分析してみます。
    またご報告させていただきたいのでどうぞ引き続きよろしくお願いいたします。

    キャンセル

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

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

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

  • SQL

    3225questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VBA

    2541questions

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

  • Access

    659questions

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