【無料配信♪】Renta !全タテコミ作品第1話

先日教えて頂いたところから自分なりに複数検索をする方法を考えて書いてみたのですが、これだとテキストボックスに複数検索条件を入力するとSQLの構文エラーになってしまいうまくいきません。
先日教えて頂いた方、見ていたらまたアドバイスを頂けたら助かります。

Private Sub コマンド11_Click()

'変数の設定
Dim myDB As DAO.Database
Dim myRS As Recordset
Dim strCnd As String
Dim strWhr As String
Dim strSQL As String


'定数の宣言
Const conSQL As String = "Select * From T_障害票マスタ"




' テキストボックスの値を確認
' Nz関数を使用して、テキストとして扱える空文字に変換
strCnd = Nz(Me!テキスト1, "") '←◆コントロールの値を参照◆

'「テキスト1」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
'条件指定時は曖昧検索
strWhr = strWhr & " " & strWhi & " 起票日 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト3, "") '←◆コントロールの値を参照◆

'「テキスト3」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
'条件指定時は曖昧検索
strWhr = strWhr & " And 依頼者 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト5, "") '←◆コントロールの値を参照◆

'「テキスト5」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
'条件指定時は曖昧検索
strWhr = strWhr & " And 部署 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト7, "") '←◆コントロールの値を参照◆

'「テキスト7」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
'条件指定時は曖昧検索
strWhr = strWhr & "And 社員番号 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト9, "") '←◆コントロールの値を参照◆

'「テキスト9」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
'条件指定時は曖昧検索
strWhr = strWhr & "And 対象システム Like '*" & strCnd & "*'"
End If



'SQL文を作成
strSQL = conSQL & vbCrLf & strWhr

'自身のレコードソースに設定
Me.RecordSource = strSQL

'検索結果の表示
DoCmd.OpenForm ("データ修正画面")
Forms("データ修正画面").RecordSource = strSQL

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>「パラメータの入力」という~


「依頼者」というフィールドがDB(あるいはクエリ)上に存在しない
からです。テーブル(あるいはクエリ)設計を確認してください。

前にも回答したように修正すべきです。

If strCnd <> "" Then
strWhr = strWhr & " AND 起票日 = '" & strCnd & "'"
End If
           ↓
If strCnd <> "" Then
  If strWhr <> "" Then strWhr = strWhr & " AND "
  strWhr = strWhr & "起票日=#" & strCnd & "#"
End If

If strCnd <> "" Then
strWhr = strWhr & "And 社員番号 = '" & strCnd & "'"
End If
           ↓
If strCnd <> "" Then
  If strWhr <> "" Then strWhr = strWhr & " AND "
  strWhr = strWhr & "社員番号=" & strCnd
End If

If strCnd <> "" Then
strWhr = strWhr & " And 部署 Like '*" & strCnd & "*'"
End If
           ↓
If strCnd <> "" Then
  If strWhr <> "" Then strWhr = strWhr & " AND "
  strWhr = strWhr & "部署 Like '*" & _
  Replace(strCnd, "'", "''") & "*'"
End If
★依頼者、対象システム も同じ

If (Len(strWhr) > 0) Then strWhr = " WHERE " & Mid(strWhr, 6)
           ↓
If strWhr <> "" Then strWhr = " WHERE " & strWhr

DoCmd.OpenForm ("データ修正画面")★不要
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
まさにそのとおりでした。
テーブルのフィールドを確認したら存在しないフィールドを指定してました。
本当に助かりました。
ありがとうございます。
また何かありましたらよろしくお願いします。

お礼日時:2009/11/06 16:24

幾つか問題点があります。


(1)起票日
これは日付型ではないですか?日付型では以下のような書式です。
起票日=#2009/11/4# ← 文字列は'で囲み、日付は#で囲む。
また、Like演算子は使えません。
(2)" And 依頼者 Like
最初の条件かも知れないのに、いきなり"And"はマズイでしょう。
常に、前に条件が有るか無いかを確認して、"And"の要否を決める
必要があります。
(3)社員番号 Like '*"
社員番号が文字型なら、これでも良いのですが、数値ですと、形式が
一致しないのでエラーになります。また、Like演算子は使えません。
(4) Like '*" & strCnd & "*'"
指定文字列の中に'(アポストロフィ)が含まれると、文字列が終端
してしまい、残りの文字が意味不明になってしまいます。
strCnd = Replace(strCnd, "'", "''") このようにして、'は二重化
しておく必要があります。
(5)その他
DoCmd.OpenForm ("データ修正画面") これは構文エラーでは?

Me.RecordSource = strSQL
Forms("データ修正画面").RecordSource = strSQL

意味が分かりません。普通、帳票フォームのフォームヘッダ等に
条件指定テキストボックスを設けて、自身のRecordSourceを変更
するか、単票フォームにサブフォームを埋め込み、サブフォームのRecordSourceを変更するかのいずれかが多く用いられる手法です。
まぁ、無いこともないでうか・・・

以上の点に注意して、プログラムしてみてください。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。
アドバイスを元に下記のようにしたんですが、
依頼者を入力して実行すると「パラメータの入力」というメッセージBOXが出てきてしまい再度依頼者を入力する形になります。
それを未入力のまま「OK」を押すと今度は検索情報が表示されなくなります。
これはどういうことなのでしょうか?
よろしければ教えてください。

' テキストボックスの値を確認
' Nz関数を使用して、テキストとして扱える空文字に変換
strCnd = Nz(Me!テキスト1, "") '←◆コントロールの値を参照◆

'「テキスト1」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
strWhr = strWhr & " AND 起票日 = '" & strCnd & "'"
End If

strCnd = Nz(Me!テキスト3, "") '←◆コントロールの値を参照◆

'「テキスト3」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
strWhr = strWhr & " AND 依頼者 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト5, "") '←◆コントロールの値を参照◆

'「テキスト5」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
strWhr = strWhr & " And 部署 Like '*" & strCnd & "*'"
End If

strCnd = Nz(Me!テキスト7, "") '←◆コントロールの値を参照◆

'「テキスト7」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
strWhr = strWhr & "And 社員番号 = '" & strCnd & "'"
End If

strCnd = Nz(Me!テキスト9, "") '←◆コントロールの値を参照◆

'「テキスト9」の入力値を元に、Where条件句を作成
If strCnd <> "" Then
strWhr = strWhr & "AND 対象システム Like '*" & strCnd & "*'"
End If

If (Len(strWhr) > 0) Then strWhr = " WHERE " & Mid(strWhr, 6)
'SQL文を作成
strSQL = conSQL & vbCrLf & strWhr
Debug.Print strSQL
'自身のレコードソースに設定
Forms("データ修正画面").RecordSource = strSQ
'検索結果の表示
DoCmd.OpenForm ("データ修正画面")

お礼日時:2009/11/05 15:01

はじめまして(だと思います)



私の書き方が参考になれば

抽出条件が全て AND 接続であることから以下の様に書きます。

  Dim sWhere As String

  sWhere = ""
  If (Len(Nz(Me.txt1)) > 0) Then
    sWhere = sWhere & " AND XXX1 Like '*" & Me.txt1 & "*'" ' ☆
  End If
  If (Len(Nz(Me.txt2)) > 0) Then
    sWhere = sWhere & " AND XXX2 Like '*" & Me.txt2 & "*'"
  End If
  If (Len(Nz(Me.txt3)) > 0) Then
    sWhere = sWhere & " AND XXX3 Like '*" & Me.txt3 & "*'"
  End If
  If (Len(sWhere) > 0) Then sWhere = " WHERE " & Mid(sWhere, 6) '★

テキストボックス txt1 ~ txt3 をチェックして、文字があれば条件を生成します。

みそは、sWhere に条件を作っていきますが、1つ目の生成(☆)でも、先頭に AND を付加します。
これは、どの条件で生成されていても ★ 部分で、先頭の AND を削除した形で
WHERE を作成するためのものになります。
( AND ・・・・・・ AND ・・・・・・・ を WHERE ・・・・・・ AND ・・・・・・・ へ)

で、strSQL = conSQL & sWhere として完成になります。


これを踏まえて、ご質問の

> '「テキスト1」の入力値を元に、Where条件句を作成
> If strCnd <> "" Then
> '条件指定時は曖昧検索
> strWhr = strWhr & " " & strWhi & " 起票日 Like '*" & strCnd & "*'"
> End If

strWhi が何者か?わかりません。
"WHERE" であるのなら、If でスキップしたら "WHERE" は存在しないことになります。
後を見ても "WHERE" を付けているところは見当たりません。

strSQL = conSQL & vbCrLf & strWhr
の後にでも、
Debug.Print strSQL
として、どのような文字列が生成されているか確認した方が良いと思います。
(もしくは、MsgBox で strSQL を表示させるとか)

strSQL を2か所の RecordSource に設定しているようですが、
何をされたいのかわからないので、ここについてはコメントできません。

※VBAへのコメントは、処理を読むのに邪魔にならない程度がいいと思います。
'条件指定時は曖昧検索
とかは要らないと思います。(逆に、あると読みにくいと思います)
・・・・Like '*" & strCnd & "*'"
を見ればわかるので、、
    • good
    • 0
この回答へのお礼

詳しいご回答ありがとうございます。
アドバイスのおかげでとりあえずSQL構文のエラーは回避できましたがまだわからないことがあるのでよかったらまた教えてください。

お礼日時:2009/11/05 15:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

Q【VB】コンボボックスにデータベースから取り出した値を入れたい

VB2005です。

表題の通りですがやり方がよくわかりません。
データベースに接続し、
SQLで重複しない値を取り出すところまではできています。

SQL=SELECT DISTINCT FieldName FROM TableName

VB6の時はこんなソースでした
Do Until rs.EOF
   Combo1.AddItem.Fields("FieldName")
   rs.MoveNext
Loop

VB2005ではどう書くのでしょう?
よろしくご教授ください。

Aベストアンサー

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", dbFilePath)
  Dim sql As String = "SELECT DISTINCT FieldName FROM TableName"
  Dim conn As New OleDbConnection(connectionString)
  Dim query As New OleDbCommand(sql, conn)

  Try
    conn.Open()
    Dim reader As OleDbDataReader = query.ExecuteReader()
    While (reader.Read())
      Me.ComboBox1.Items.Add(reader.Item("FieldName"))
    End While
    reader.Close()
  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    conn.Close()
  End Try

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Sourc...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

Qセルの値を取得してSQL文に組み込みたい

VBAで、ADOを使ってSQLServerに接続しています。
データベースからSQL文でデータを取得してセルに表示させています。
そこで、今はwhere 月 = '4月' …等としているのですが
4月の部分をA1等にして、セルから取得して可変できるようにしたいのです
どういうSQL文を書けば実現できるでしょうか?

Aベストアンサー

例えば
strSQL = "Select * From xxx "
strSQL = strSQL & "where 月 = '" & Range("A1") & "'"

参考にして下さい。

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング