Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
VBA SQL 複数条件
投稿日時: 20/03/07 23:26:11
投稿者: チャンマン

AccessとExcelを連携した発注管理システムがあります。
簡単に構成をご案内致します。
■3つのマスタ
・商品マスタ   :商品コード、商品名……商品種別
・顧客マスタ   :顧客コード、顧客名……単価ランク
・顧客別単価マスタ:ランクコード、商品コード、ランク名、単価ランク、顧客別単価
 
下に掲載させて頂いているコードで、
ExcelユーザーフォームからComboBox1で商品コードを選択すると
TextBox1〜3に商品名、商品種別、定価が表示されます。
 
次にComboBox2から顧客コードを選択するとTextbox4に顧客コードに
対応した単価ランクが表示されます。
 
やりたいことは、ComboBox2で顧客コード選択した際、
Textbox4には、単価ランクではなく『顧客別単価』を表示させたいです。
自分でやってみたのは、
ComboBox2_Change() 顧客コードのプロージャーの
Selectの箇所に『顧客別単価』の列を追加し、Whereの箇所にComboBox1の内容を
追加してみたりしたのですが、SQLを理解していないためエラーになってしまいます。
顧客別単価の件は、あとからExcel関数をつかってシート上にて実現できるのですが、
数人で利用するので。VBAで処理できれば大変助かります。
 
何卒、ご教授の程、お願い致します。
 
________________________________________________________________________________
Private Sub ComboBox1_Change() '商品コード変更
  If Me.ComboBox1 <> "" Then
    Call DBconnect(True)
    strSQL = "SELECT * FROM 商品マスタ WHERE 商品コード = '" & Me.ComboBox1 & "';"
    adoRs.Open strSQL, adoCn 'SQLを実行して対象をRecordSetへ
    Me.TextBox1 = adoRs!商品名
    Me.TextBox2 = adoRs!商品種別
    Me.TextBox3 = adoRs!定価
    Call DBcut_off(True)
  End If
End Sub
_______________________________________
Private Sub ComboBox2_Change() '顧客コード変更
  If Me.ComboBox2 <> "" Then
    Call DBconnect(True)
    strSQL = _
    "SELECT 顧客別単価マスタ.単価ランク " & _
    "FROM 顧客マスタ INNER JOIN 顧客別単価マスタ " & _
    "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
    "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"
    adoRs.Open strSQL, adoCn
    Me.TextBox4 = adoRs!単価ランク
    Call DBcut_off(True)
  End If
End Sub
_________________________________________
 
※上記のコードを実行した際、イミディエイトで表示した内容です。
 TextBox4に単価ランクを表示させます。
++++++++++++++++++++++
?strSQL
 
SELECT 顧客別単価マスタ.単価ランク
FROM 顧客マスタ
INNER JOIN 顧客別単価マスタ
ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク
WHERE 顧客マスタ.顧客コード = 'T05';
 
++++++++++++++++++++++++++++++++++++++++

回答
投稿日時: 20/03/08 09:27:25
投稿者: WinArrow
投稿者のウェブサイトに移動

顧客別単価マスタ
を商品コードで抽出する条件を追加すればよいと思います。
 

引用:

    "SELECT 顧客別単価マスタ.単価ランク " & _

アンダーラインの部分は
顧客別単価マスタ.顧客別単価
に変更する
 
引用:

     "FROM 顧客マスタ INNER JOIN 顧客別単価マスタ " & _
     "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
     "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"

 
アンダーラインの部分を
(SELECT * FROM 顧客別単価マスタ WHERE 商品コード='" & TextBox1.Text & "')"
に変更してみてください。
 
私は、フィールド名をエリアスで使うことが多いので、もしかしたら、
顧客別単価マスタ側は、エリアスが必要かもしれません。
 
エリアスを使った例
    "SELECT 顧客別単価 " & _
     "FROM 顧客マスタ AS K1 INNER JOIN " &_
      ("SELECT 顧客別単価 FROM 顧客別単価マスタ WHERE 顧客コード = '" & Me.ComboBox2.Column(1) & "' AND 商品コード ='" & Me.Textbox1.Text & "') AS K2 " & _
     "ON K1.単価ランク = K2.単価ランク "
 
 
 

投稿日時: 20/03/08 22:10:30
投稿者: チャンマン

 WinArrow 様
ご回答頂きありがとうございます。早速試してみました。 
 
※私の勉強不足、能力不足にて、ご案内いただきました
 『顧客別単価マスタ側は、エリアスが必要かも』とご指摘頂いた内容は試しておりません。
 
結果は、JOIN操作の構文エラーが出てしまいます。
※ados!顧客別単価 = <JOIN操作の構文エラーです。> とコードのところに
 カーソルあてると表示されます。
 
何か、私が記述にミスしてしまったのでしょうか? 
再度、ご案内いただければ幸いです。
自分でも、ご教授頂いた内容をもとにSQL文を考えてみます。
宜しくお願い致します。
 
___________________________________________
Private Sub ComboBox2_Change() '顧客コード変更
  If Me.ComboBox2 <> "" Then
    Call DBconnect(True)
    strSQL = _
    "SELECT 顧客別単価マスタ.顧客別単価 " & _
    "FROM 顧客マスタ “ & _
“INNER JOIN (SELECT * FROM 顧客別単価マスタ” & _
“ WHERE 商品コード='" & TextBox2.Text & "') "
& _
    "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
    "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"
    adoRs.Open strSQL, adoCn
    Me.TextBox5 = adoRs!顧客別単価
    Call DBcut_off(True)
  End If
End Sub
____________________________________________
 
※上記のコードを実行した際、イミディエイトに表示された内容です。
+++++++++++++++++++++++++++++++++++++++
?strSQL
SELECT 顧客別単価マスタ.顧客別単価 FROM 顧客マスタ INNER JOIN (SELECT *
FROM 顧客別単価マスタ WHERE 商品コード=' **商品名** ') ON 顧客マスタ.
単価ランク = 顧客別単価マスタ.単価ランク WHERE 顧客マスタ.顧客コード = 'T05';
++++++++++++++++++++++++++++++++++++++++
 
 

回答
投稿日時: 20/03/09 09:59:16
投稿者: WinArrow
投稿者のウェブサイトに移動

>“ WHERE 商品コード='" & TextBox2.Text & "') "
↑の部分が、私の提示したものと違っています。
 
しかし、私も勘違いして「TextBox1.Text」と書いてしまいました。
Me.Combobox1.Textだと思います。
 
しかし、エラーの内容から、やはりエリアスを使わないいけないようなきがします。
 
サンプルを提示します。
Private Sub ComboBox2_Change() '顧客コード変更
  If Me.ComboBox2 <> "" Then
     Call DBconnect(True)
     strSQL = _
     "SELECT 顧客別単価 " & _
     "FROM 顧客マスタ INNER JOIN " & _
     "(SELECT * FROM 顧客別単価マスタ WHERE 商品コード='" & Me.ComboBox1.Text & "') AS 顧客別単価マスタ " & _
     "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
     "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"
     adoRs.Open strSQL, adoCn
     Me.TextBox4 = adoRs!顧客別単価
    Call DBcut_off(True)
   End If
 End Sub

回答
投稿日時: 20/03/09 14:21:17
投稿者: MMYS

SELECT句にフィールド名に指定
レコードセットに表示したいフィールド名を指定です。
 
Private Sub ComboBox2_Change() '顧客コード変更
  If Me.ComboBox2 <> "" Then
    Call DBconnect(True)
    strSQL = _
    "SELECT 顧客別単価マスタ.顧客別単価 " & _
    "FROM 顧客マスタ INNER JOIN 顧客別単価マスタ " & _
    "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
    "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"
    adoRs.Open strSQL, adoCn
    Me.TextBox4 = adoRs!顧客別単価
    Call DBcut_off(True)
  End If
End Sub

投稿日時: 20/03/09 18:08:51
投稿者: チャンマン

投稿者: WinArrow 様
ありがとうございます!!
 
作成頂きましたコードで顧客別に設定した単価が表示されました!!!!!!
本当にありがとうございます。
 
ここ数週間ず〜と色々試しておりましたが解決せず。半ばあきらめておりました。
単価ランクまでは出てくるので、そこに2つめの条件として商品コード必要なのは
理解していたのですがSQL文をどのように書けばよいのか手探り状態でした。
思い切って、こちらに相談させて頂きました。
 
ありがとうございます!!
 
 
 

引用:
Private Sub ComboBox2_Change() '顧客コード変更
  If Me.ComboBox2 <> "" Then
      Call DBconnect(True)
      strSQL = _
      "SELECT 顧客別単価 " & _
      "FROM 顧客マスタ INNER JOIN " & _
      "(SELECT * FROM 顧客別単価マスタ WHERE 商品コード='" & Me.ComboBox1.Text & "') AS 顧客別単価マスタ " & _
      "ON 顧客マスタ.単価ランク = 顧客別単価マスタ.単価ランク " & _
      "WHERE 顧客マスタ.顧客コード = '" & Me.ComboBox2.Column(1) & "';"
      adoRs.Open strSQL, adoCn
      Me.TextBox4 = adoRs!顧客別単価
    Call DBcut_off(True)
    End If
  End Sub
Very Happy Very Happy