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

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

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

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

Access

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

SQL

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

Q&A

解決済

3回答

3695閲覧

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

nekomura

総合スコア132

VBA

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

Access

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

SQL

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

0グッド

0クリップ

投稿2016/03/14 08:15

よろしくお願いします。

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

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

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

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

Option

1 2'##################################################################### 3'# Name : データ取得_Click 4'# Description : 入力の画面に対し管理システムより指定したデータの取込 5'##################################################################### 6Private Sub データ取得_Click() 7 ' On Error GoTo Err_データ取得_Click 8 9 '*****DB接続変数定義***** 10 Dim DB As Database 11 Dim q1 As Recordset, q2 As Recordset 12 Dim SQLCommand As String 'データベース接続文字列を取得するSQL文 13 Dim strConnection As String 'データベース接続文字列 14 Dim strCount As Integer 'データ件数 15 Dim objCon As New ADODB.Connection 16 Dim objRs As New ADODB.Recordset 17 Dim dbCom As ADODB.Command 18 19 Set DB = CurrentDb() 20 21 'データベース接続文字列を取得するSQL文 22 SQLCommand = "SELECT ID, Value FROM AccessTable WHERE ID = 1" 23 Set q1 = DB.OpenRecordset(SQLCommand) 24 25 '取得したデータベース接続文字列 26 strConnection = q1!Value 27 28 29 'データ件数を取得するSQL文 30 SQLCommand = "SELECT ID, Value FROM AccessTable WHERE ID = 2" 31 Set q2 = DB.OpenRecordset(SQLCommand) 32 33 '取得したデータ件数 34 strCount = q2!Value 35 36 37 '*****フォーム変数定義***** 38 Dim invNo As Variant 'invoiceNo 39 Dim invDisp As Variant 'invoiceDisplay 40 41 42 invNo = Me.invoiceNo 43 invDisp = Me.invoiceDisplay 44 45 '検索条件が未入力の場合 46 If IsNull(invNo) And IsNull(invDisp) Then 47 MsgBox "検索条件を指定してください" 48 Exit Sub 49 50 51 'テキストボックスに値が両方、またはいずれかが入力されている場合 52 ElseIf Not IsNull(invNo) Or Not IsNull(invDisp) Then 53 54 55 '接続文字列を取得しSQLサーバーへ接続 56 objCon.ConnectionString = strConnection 57 58 59 strSql = "SELECT COUNT (CountryCode) FROM tbmCountry " 60 objCon.Open 61 62 63 //strSql = sql文 、 strCount = 数値 の為型が違うとエラーが出る。 64 //strSqlの値を、sql文そのものではなく、sql文で取ってきた列の数を入れて、演算子で比較したい 65 If (strSql >= strCount) Then 66 MsgBox "検索条件を指定してください" 67 Exit Sub 68 69 70 objRs.Close 71 objCon.Close 72 73 Set objRs = Nothing 74 Set objCon = Nothing 75 76 77 78 End If 79 80 End If 81 82 83

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

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

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

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

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

ogaaaan

2016/03/14 08:29

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

2016/03/14 09:41

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

回答3

0

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

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

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

投稿2016/03/14 11:13

lilithchan

総合スコア249

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

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

nekomura

2016/03/15 01:10

lilithchan様 なるほど…。 そうですよね、申し訳ありませんでした。 どうしてエラーとなるかが理解できておらず、ついそのまま試しては焦っておりました、反省です。 未熟な質問にもかかわらず、このように真摯に回答頂きとても感謝しております。 ちょっとまだ解決に至ってないので、ご指摘のようにもう少し自身でも分析してみます。 またご報告させていただきたいのでどうぞ引き続きよろしくお願いいたします。
guest

0

ベストアンサー

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

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

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

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

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

■以下追記

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

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

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

投稿2016/03/14 09:53

編集2016/03/14 09:57
tkturbo

総合スコア5572

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

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

nekomura

2016/03/14 10:30

tkturbo様 申し訳ありません。 そして何度もご回答頂き誠に感謝しております。 下記の用に順番を変更したのですが、依然.Valueはコンパイルエラーのままです(泣) ’’’ 'テキストボックスに値が両方、またはいずれかが入力されている場合 ElseIf Not IsNull(invNo) Or Not IsNull(invDisp) Then Dim objCon As New ADODB.Connection Dim objRs As New ADODB.Recordset // Dim objCom As ADODB.Command '接続文字列を取得しSQLサーバーへ接続 objCon.ConnectionString = strConnection strSql = "SELECT COUNT (CountryCode) FROM tbmCountry" ' WHERE ECountryCode LIKE '_%' " objRs.Open strSql, objCon, adOpenKeyset, adLockOptimistic objCon.Open Set objRs = objCon.Execute(strSql) Call objRs.MoveFirst objRs.Fields(0).Value '取得した列数が、定義したデータ件数より多い場合 If (strSql >= strCount) Then MsgBox "検索条件を指定してください", vbInformation, "kts請求システム" Exit Sub ’’’ それとも、Commandメソッド?などを使用するべきでしょうか。 もしご教示いただければ幸いです。
twck

2016/03/15 00:05 編集

tkturboさんが「Openして」と言っているのは Connection のことであって Recordset のことではありません。 lilithchanさんの回答を1つ1つ説明すると以下のようになります。 「①DBとの接続を確立する」は objCon.ConnectionString = strConnection objCon.Open 「②SQLを実行してレコードセットを取得する」は strSql = "SELECT COUNT(CountryCode) FROM tbmCountry" Set objRs = objCon.Execute(strSql) もしくは strSql = "SELECT COUNT(CountryCode) FROM tbmCountry" Set objRs = New ADODB.Recordset objRs.Open strSql, objCon, adOpenKeyset, adLockOptimistic 「③レコードセットから該当カラムの値を取得する」は If objRs.Fields(0).Value >= strCount Then つまり以下のようになります。 objCon.ConnectionString = strConnection objCon.Open strSql = "SELECT COUNT(CountryCode) FROM tbmCountry" Set objRs = objCon.Execute(strSql) If objRs.Fields(0).Value >= strCount Then どうでしょう?分かりますか? lilithchanさん と tkturboさん が回答を書いてくれていますが、 nekomuraさん にはまだそれを理解できるだけの知識が無いようです。 その知識ではこのプログラムを作っていくことは不可能なので、 まずは VBAの入門書を 1冊 読むなりして、基礎知識を付けてください。 今の状態は「足し算も出来ないのに分数の掛け算を教えてほしいと言ってる」ようなものです。 回答している人も「分数の掛け算を教えてほしいと言ってきたのだから、四則演算くらいは分かるのだろう」と思って回答しているので、当然、nekomuraさんが読んでも理解できないのです。
nekomura

2016/03/15 01:12

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

2016/03/15 01:15

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

2016/03/15 08:42

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

0

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

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

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

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

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

投稿2016/03/14 08:28

lilithchan

総合スコア249

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

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

nekomura

2016/03/14 09:07

lilithchan様 いつもありがとうございます。 また、早々のご回答に感謝いたします。 前回の回答者様と、lilithchan様のアドバイスを参考に、下記コードを書いてみたのですが、 コメントの部分でエラーになってしまいます。 大変申し訳ございませんが、今一度ご教授願えませんでしょうか。 ''' '接続文字列を取得しSQLサーバーへ接続 objCon.ConnectionString = strConnection strSql = "SELECT COUNT (CountryCode) FROM tbmCountry WHERE ECountryCode LIKE '_%' " Set objRs = objCon.Execute(strSql) //括弧の部分でコンパイルエラー ”メソッドまたはデータメンバーが見つかりません” objRs.[colCountryCode].Value objRs.Open strSql, objCon, adOpenKeyset, adLockOptimistic objCon.Open If (strSql >= strCount) Then MsgBox "検索条件を指定してください", vbInformation, "kts請求システム" Exit Sub objRs.Close objCon.Close Set objRs = Nothing Set objCon = Nothing End If End Sub '''
tkturbo

2016/03/14 09:13

「objRs(1).Value」とかで取れないですか?
tkturbo

2016/03/14 09:15

「objRs.Fields(0).Value」かもしれぬ。
nekomura

2016/03/14 09:19

tkturbo様 いつも本当にありがとうございます。 objRs.[colCountryCode].Value を、 objRs(1).Value と書き換えたところ、 .Valueのところで”プロパティの使い方が不正です” と、コンパイルエラーが出てしまいました。。。 どうすればいいのか、どうぞ今一度ご教示いただけませんか。 たびたびご迷惑をおかけして申し訳ないのですが。
nekomura

2016/03/14 09:22

tkturbo様 すみません、こちらも試させていただきました。 ありがとうございます。 objRs.Fields(0).Value やはり、.Valueのところで”プロパティの使い方が不正です”と出てしまいます…。 何か私が余計な記述をしているのでしょうか。。。
tkturbo

2016/03/14 09:31

Re:nekomuraさん デバッガ+ウォッチ式に「objRs.Fileds(0)」を指定で実行したらウォッチ式の結果はどうなります?
nekomura

2016/03/14 09:39

tkturbo様 誠にありがとうございます。。。 <モジュールはコンパイルできません>empty型 との結果です。
twck

2016/03/14 09:48

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

2016/03/14 10:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問