• ベストアンサー

データの抽出で

VB6.0 SQLSERVER  ID  品名  数量 コード 1  りんご  5  A-1 2  りんご  8  A-2 3 りんご  3  B-1 4  みかん  5  A-2 済みません。うまく説明できないのですが IDとコードの二つを抽出条件にしたいのです。 例えば1とコードA-1なら 1りんご5A-1を IDだけとかコードだけを条件にしたら うまく抽出できるのですが 2つになると「型が一致しません」とエラーになってしまいます。 お願いします。 教えてください。 Public Sub GetYukouzaiSuu(Optional Result As Boolean = True) Dim sSQL As String Dim dYukouzaiSuu As Double sSQL = ("品番=" + pvBase.CvtSQL(txtHinban.Text)) AND ("棚番=" + pvBase.CvtSQL(txtTanaban.Text)) dYukouzaiSuu = pvBase.CvtDbl(pbAdo.Lookup("m_zaiko", "isnull(実在庫数,0)-isnull(引当数,0)", sSQL)) numYukouzaiSuu.Value = MaxValueCheck(dYukouzaiSuu, numYukouzaiSuu.MaxValue) If pvBase.CvtLng(txtSeihinID.Text) = 0 Then If pvBase.StrLen(txtHinban.Text) > 0 Then labHinbanSt.Caption = "!" End If Else labHinbanSt.Caption = "" End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • NYOI
  • ベストアンサー率58% (56/96)
回答No.3

いまいちソースから処理が読み取れないけど、 sSQL = "品番 = " & pvBase.CvtSQL(txtHinban.Text) & " AND " & "棚番 = " & pvBase.CvtSQL(txtTanaban.Text) とすればいいんじゃないのかな、。 pvBase.CvtSQL()が何をしてくれる関数かわからないけど…。('→''とかにコンバートしてくれるとか?) もし品番や棚番が文字型のカラムだったら sSQL = "品番 = '" & pvBase.CvtSQL(txtHinban.Text) & "' AND " & "棚番 = '" & pvBase.CvtSQL(txtTanaban.Text) & "'" 余談ですが、文字列の連結は"+"ではなく"&"を使ったほうがよいです。

aki08102001
質問者

お礼

ありがとうございます。 うまくいきました。 感謝です。

その他の回答 (2)

  • MySalt
  • ベストアンサー率25% (1/4)
回答No.2

sSQL = ("品番=" + pvBase.CvtSQL(txtHinban.Text)) AND ("棚番=" + pvBase.CvtSQL(txtTanaban.Text)) の「AND」のところですが、VB6のエディタでは青色で「And」と表示されていませんか? 正しくは、 sSQL = "品番=" + pvBase.CvtSQL(txtHinban.Text) + "AND " + "棚番=" + pvBase.CvtSQL(txtTanaban.Text) なのではないかと思います。pvBaseやCvtSQLが何者なのかわからないので断定はできませんが。 書いているコードの、どこまでがSQL文でどこまでがVBのコードなのかに気をつけて見直して みるといいと思います。

aki08102001
質問者

お礼

ありがとうございます うまく出来ました 感謝です。

  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.1

コードからは、どのようなSQL文が発行されているか、 判断できません。 「型が一致しない」というのは、例えば数値フィールドの検索条件に 文字を指定した場合などに起きますし、文字フィールドをLong型などに 変換しようとした場合でも起きます。 「コード」と呼ばれるフィールドは、文字フィールドになりますから、 数値としての処理をしているとエラーとなります。

関連するQ&A

  • 日付によるデータ抽出について

    日付によるデータ抽出について 環境: ACCESS2000 状況: メインフォーム(テキスト期間A、テキスト期間B、テキスト品番、検索ボタン)    サブフォーム(データシート)    管理テーブル( 品番  /  レンタル日  /  返却日)    ※管理テーブルは他テーブルのコピー用 やりたい事: 簡潔にいうと期間と品番による抽出。       但し、テキスト期間Bが空白の場合、テキスト期間A以降のデータ抽出。          テキスト期間Aが空白の場合、テキスト期間B以前のデータ抽出。       さらに、テキスト品番が空白の場合、期間のみでの抽出。    コード: Private Sub 検索ボタン_Click()  Dim db As DAO.Database   Set db = CurrentDb   db.Execute "DELETE * FROM 管理テーブル"   db.Execute "INSERT INTO 管理テーブル SELECT * FROM 他テーブル"  Dim 抽出条件 As String   If IsNull(Me!テキスト期間A)=False And IsNull(Me!テキスト期間B)=True And IsNull(Me!テキスト品番)= True Then    抽出条件 = "[レンタル日] <= '" & Me!テキスト期間A & "'"   End If   If IsNull(Me!テキスト期間A)=True And IsNull(Me!テキスト期間B)=False And IsNull(Me!テキスト品番)= True Then    抽出条件 = "[レンタル日] >= '" & Me!テキスト期間B & "'"   End If   If IsNull(Me!テキスト期間A)=False And IsNull(Me!テキスト期間B)=False And IsNull(Me!テキスト品番)= True Then    抽出条件 = "[品番] <= '" & Me!テキスト品番 & "'"   End If   If IsNull(Me!テキスト期間A)=False And IsNull(Me!テキスト期間B)=True And IsNull(Me!テキスト品番)= False Then    抽出条件 = "[レンタル日] >= '" & Me!テキスト期間A & "'" And "[品番]='" & Me!テキスト品番 & "'"   End If   If IsNull(Me!テキスト期間A)=False And IsNull(Me!テキスト期間B)=False And IsNull(Me!テキスト品番)= False Then    抽出条件 = "[レンタル日] Between " $ Me!テキスト期間A & " & Me!テキスト期間B And "[品番] = '" & Me!テキスト品番 & "'"   End If Me!サブフォーム.Form.Filter = 抽出条件 ← 実行時エラー2465 指定した式で参照されている'サブフォーム'フィールドが見つかりません。 Me!サブフォーム.Form.FilterOn = True End Sub 上記エラーが出てしまうのですが、まだまだ未熟で どこが悪いかわからなくて困っております。 間違っていたりと上手くないコードだとは思いますが ご教授の程宜しくお願い致します。   

  • 複数条件でのレコード抽出について

    いつも大変お世話になっています。 複数条件でのレコード抽出で教えていただけますでしょうか? 下記のようなサンプルコードを見つけ、実際に抽出できることを確認しました。 ただ、テーブル名:学生名簿の 身長と体重のデータ型が数値型である必要が あるようで、他の型では Set rs = CurrentDb.OpenRecordset(SQL) でエラー となってしまいます。テキスト型の入力でエラーが出ないように記述するには どうしたらよいのでしょうか? Access2010、Win7を使用しています。 サンプルコードは身長と体重を入力し、条件にあった内容をテキスト1に出力する コードです。 ーーサンプルコードーー Option Compare Database Private Sub コマンド8_Click() Dim SQL As String Dim rs As Recordset If IsNull(Me!テキスト2) Then MsgBox "抽出する身長を入力してください。" Me!テキスト2.SetFocus Exit Sub End If If IsNull(Me!テキスト3) Then MsgBox "抽出する体重を入力してください。" Me!テキスト3.SetFocus Exit Sub End If Me!テキスト1 = Null SQL = "SELECT 学生ID,身長,体重 FROM 学生名簿 WHERE 体重>=" & Me!テキスト3 & " AND 身長>=" & Me!テキスト2 Set rs = CurrentDb.OpenRecordset(SQL) Do Until rs.EOF Me!テキスト1 = Me!テキスト1 & rs![学生ID] & ": " & rs![身長] & " " & rs![体重] & vbCrLf rs.MoveNext Loop Set rs = Nothing End Sub

  • 文字列連結演算子を使った繰り返し(ループ)について

    Text1・Command1・Label1 と並んだBoxでText1に数字を入力しCommand1を押すと漢数字(一,二…)となるプログラムなのですが、一桁ずつ求めて行き最後に文字列連結演算子を使って求める場合はどのようにしたらよいのでしょうか? エラーが出るのでどこかが変なんだと思うのですが、何度みてもわからなくて。。。今途中の段階ですが当方がやったところまでを乗せておきますので。違うところや付け足すところなど指摘したり教えていただけたらと思っています。よろしくお願いします。 Private Sub Command2_Click() Dim a As Integer Dim b As String a = Val(Text1.Text) For x = 1 To 5 If a = 1 Then Label1.Caption = "一" ElseIf a = 2 Then Label1.Caption = "二" ElseIf a = 3 Then Label1.Caption = "三" ElseIf a = 4 Then Label1.Caption = "四" ElseIf a = 5 Then Label1.Caption = "五" ElseIf a = 6 Then Label1.Caption = "六" ElseIf a = 7 Then Label1.Caption = "七" ElseIf a = 8 Then Label1.Caption = "八" ElseIf a = 9 Then Label1.Caption = "九" Else Label1.Caption = "〇" sText1 = "1" & "2" & "3" & "4" & "5" & "6" & "7" & "8" & "9" sLabel1 = "一" & "二" & "三" & "四" & "五" & "六" & "七" & "八" & "九" End If End Sub

  • EXCEL VBA データ抽出について

    ユーザーフォームを利用して、データの管理を行なっております 各データには、コードを設定しており 検出時に利用しています フォームでコードを入力する際には 前半(年・月) 後半(No.)で2か所に分けて入力しており 以下、コード前半⇒ コード1     コード後半⇒ コード2  ・・・としておきます シートへの転記も、コード1はA列・コード2はB列に分けて書き込んでいます 以下は、コードからデータを検出し、その内容をテキストボックスへ表記するように 書いたコードですが、コード1のみでの検索になっております コード2をどのように組み込めばいいのか、わからずとても困っています。 シート名 AllDate コード1 TextBox36    (A列) コード2 TextBox37    (B列) 1行目は項目名になっており、2行目からデータが蓄積されています。 また新規で登録した場合には、空欄最下部へフォームからシートへ転記されるように設定しています   ============================ Worksheets("AllDate").Activate Dim i As Long, kb As String If TextBox36.Text = "" Then MsgBox "検索する番号を入力してください" Exit Sub End If For i = 2 To Range("A1").CurrentRegion.Rows.Count If Cells(i, 1).Text = TextBox36.Text Then kb = TextBox36.Text Exit For End If Next If kb = "" Then MsgBox "指定した番号はありません" Exit Sub Else Call ReadRecord(kb) End If TextBox36.Text = "" TextBox37.Text = "" End Sub Sub ReadRecord(kb As String) Dim rw As Long Set kRange = Range("A1").CurrentRegion.Columns(1).Find(What:=kb, LookAt:=xlWhole) If kRange Is Nothing Then MsgBox "データがありません" Exit Sub End If rw = kRange.Row TextBox1.Text = Cells(rw, 1).Value TextBox2.Text = Cells(rw, 2).Value TextBox3Text = Cells(rw, 3).Value TextBox4.Text = Cells(rw, 4).Value =============================== また自分なりにも何とか模索しており、フィルターを使う方法も考えておりますが 何分まだまだ初心者LVの為、 こちらも難航しております。 フィルタを使用する場合 TextBox36の値で、A列にて抽出 抽出されたデータから、さらに TextBox37の値で、B列にて抽出 重複データは存在しないので、A2行へ常に1件のデータが残り それをセル指定で、テキストボックスへ転記さようと考えています。 また、修正⇒上書き作業も必要なので フィルタで抽出したデータをテキストボックスへ表示させ 修正後、同様にA2行へ書き込み その後、フィルター解除がいいのかな?と思っています。 長々となり恐縮なのですが 方法のオススめ コードのご教授など お力をお貸しいただけないでしょうか? よろしくお願いいたします!!

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

  • 「:」を使えば、一行のコードにできるわけではない?

    「:」を使えば、一行のコードにできるわけではないのですか? ifステートメントを1行にしたいのですが Sub test() Dim a As String a = "aiu" If a Like "*i*" Then: Stop: End If End Sub これだと End If に対応する If ブロックがありません。 となってしまいます。 ちゃんと、 Sub test() Dim a As String a = "aiu" If a Like "*i*" Then Stop End If End Sub こうしないとダメですか? なぜ、:は使えないのですか? よろしくお願いします。

  • プログレスバーで

    VB6.0 SQL SERVER WinXPです。 UPDATEの処理の時に進行状況を表示したいのですが うまく動かずバーが真っ白のままです。 教えてください。 lCount = pbAdo.RsRecordCount(rc) With pvBase If rc.EOF = False Then picBar.Width = 0 labCount.Caption = "" labCount.Visible = True End If If rc.RecordCount Then rc.MoveFirst Do While Not rc.EOF sSQL = " UPDATE m_zaiko SET " sSQL = sSQL & " 実在庫数=" & .CvtSQL(dblZaikoSuu, CVT_DBL) sSQL = sSQL & " WHERE " sSQL = sSQL & " 品番=" & .CvtSQL(strHinban, CVT_STR) sSQL, lRet, adExecuteNoRecords + adCmdText picBar.Width = (picProgress.Width / lCount) * i labCount.Caption = CStr(i) & "/" & CStr(lCount) rc.MoveNext i = i + 1 DoEvents Loop Set rc = Nothing End With

  • Accessフォームでの複数条件検索

    検索用テキストが4つとコンボボックスが1つあり、検索ボタンというコマンドボタンを押すと 該当するレコードを表示させるフォームを作りました。 以下がそのVBAです。 Private sub 検索ボタン_click() Dim strfilter As String, strexp As String, aryope As Variant If Not IsNull (me.一) Then strfilter = "And 出版社 Like '*" & Me.一 & "*'" End If If Not IsNull (me.コンボ62) Then strfilter = "And 種類 Like '*" & Me.コンボ62 & "*'" End If If Not IsNull (me.三) Then strfilter = "And 番号 Like '*" & Me.三 & "*'" End If If Not IsNull (me.四) Then strfilter = "And 発刊日 = # " & Format (me.四. "yyyy-mm-dd") & "#" End If If Not IsNull (me.一) Then strfilter = strfilter & " AND " & BuildCritera ( "タイトル", dbText, "*" Replace ( me.五, "", "*AND*") & "*") End If 改正したいことは   1. 検索用テキストボックスに入力された値全てを満たすレコードを表示したい(現在は例えば     出版社、タイトル、番号の3つを入力するとそれぞれの項目にヒットする物がすべて検出さ     れる)   2. テキストボックス[三]の番号は完全一致で抽出したい(26を抽出したいのに126や2673     等も抽出されてしまう)   3. テキストボックス[四]の発刊日は西暦表示から和暦で入力して検索したい     (テキストボックス[四]をコンボボックスに変え、西暦・和暦両方表示にし、[四A]を追加して     月日という名前にしてこれら年月日をくっつけて完全一致で検索する方法を考えましたが     記述がわかりません)   5.タイトルがWeb検索の様に複数曖昧検索ができない     中途半端な検索で抽出してる状態です。     どなたか手直しいただけますでしょうか? 

  • 抽出後にすべて表示

    こんにちわ。教えて下さい。VBAに関しては初心者です。。。 今下記のコードによって、抽出をしていますが、これを コマンドボタンをクリックすることによって、すべて表示させたいと 思っています。いろいろ調べましたが、オートフィルタから全てを 表示するのはできるのですが、オートフィルタの設定をしていないので、すべて表示ができません。 どのようにすればいいか、教えていただけますでしょうか。。。 Private Sub CommandButton1_Click() Call 検索 Unload Me End Sub Private Sub UserForm_Initialize() 'A列 作業項目をComboBox1 へ登録 Dim i As Long With Sheets("リスト1") i = .Cells(.Rows.Count, "a").End(xlUp).Row ComboBox1.List = .Range("A2:A" & i).Value End With End Sub Sub 検索() Dim i&, j&, F As Boolean, tmp Dim n As Integer With Sheets("シート") tmp = .Cells(1, 1).CurrentRegion.Value For i = 4 To UBound(tmp) For j = 4 To UBound(tmp, 2) Step 6 If tmp(i, j) = ComboBox1.Value Then F = True Exit For End If Next If F = False Then .Rows(i).Hidden = True F = False Next End With End Sub

専門家に質問してみよう