Re:SALOON & VBA

ORACLE簡易検索ツール(EXCEL VBA)①



'==========(標準モジュール)======================
Option Explicit
'+------------------------------------------------------------------------------
'| 共通変数
'| 参照設定:Microsoft Activex Data Object X.X Library が必要
'+------------------------------------------------------------------------------
Public Ps_Host   As String      'ホスト
Public Ps_Sid    As String      'SID
Public Ps_User   As String      'ユーザ-
Public Ps_Pass   As String      'パスワード
Public OraCn    As ADODB.Connection 'コネクション
Public OraRs    As ADODB.Recordset 'レコードセット
Public ErrMsg    As String      'エラーメッセージ
'+------------------------------------------------------------------------------
'| 処理名    :ボタン「TABLE」
'+------------------------------------------------------------------------------
Sub テーブル一覧()
  On Error GoTo Err_Han
  ErrMsg = ""
' 画面固定
  Application.ScreenUpdating = False
  Application.Speech.Speak "TABLE LISTING"
' データベース接続
  Call PS_DbConn
  If ErrMsg <> "" Then GoTo TBL_END
  Dim stSQL As String
  Dim iRow  As String
' データ取得SQL編集
  stSQL = "select table_name from user_tables"
  If UserForm1.TextBox1.Text <> "" Then
   UserForm1.TextBox1.Text = StrConv(UserForm1.TextBox1.Text, vbUpperCase)
   stSQL = stSQL & " where table_name like '%" & UserForm1.TextBox1.Text & "%'"
  End If
' VIEWも対象としない場合以下をコメント
  stSQL = stSQL & " union select view_name as table_name from user_views"
  If UserForm1.TextBox1.Text <> "" Then
   UserForm1.TextBox1.Text = StrConv(UserForm1.TextBox1.Text, vbUpperCase)
   stSQL = stSQL & " where view_name like '%" & UserForm1.TextBox1.Text & "%'"
  End If
' テーブル名順に整列
  stSQL = stSQL & " order by table_name"
' 項目リストクリア
  Worksheets("COLUMN").Select
  Range(Range("A2:E2"), Selection.End(xlDown)).ClearContents
' テーブルリストクリア
  Worksheets("TBL").Select
  Range(Range("A2:C2"), Selection.End(xlDown)).ClearContents
' データを取得(レコードセットオプション:読み取り専用)
  Set OraRs = OraCn.Execute(stSQL)
  Worksheets("TBL").Range("A2").CopyFromRecordset OraRs
' リストボックス範囲の変更
  iRow = Cells(Rows.Count, 1).End(xlUp).Row
  If iRow < 2 Then iRow = 2
  Application.Names("テーブル一覧").RefersTo = "=TBL!$A$2:$A$" & iRow
  Worksheets("TBL").Range("A1").Select
TBL_END:
' データベース接続切断(NO COMMIT)
  Call PS_DbDisConn(False)
' 画面固定解除
  Application.ScreenUpdating = True
  If ErrMsg <> "" Then
   MsgBox ErrMsg
   Exit Sub
  End If
  Unload UserForm1
  UserForm1.Show
  Exit Sub
Err_Han:
  If ErrMsg = "" Then
   ErrMsg = Err.Description
  End If
  GoTo TBL_END
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :ボタン「COLUMN」
'+------------------------------------------------------------------------------
Sub 項目一覧()
  On Error GoTo Err_Han
  ErrMsg = ""
  If UserForm1.ListBox1.Value = "" Then
   Application.Speech.Speak "You don't select tables"
   MsgBox "テーブルが選択されていません!"
   Err.Raise 0
   Exit Sub
  End If
' 画面固定
  Application.ScreenUpdating = False
  Application.Speech.Speak "COLUMN LISTING"
' データベース接続
  Call PS_DbConn
  If ErrMsg <> "" Then GoTo ITEM_END
  Dim stSQL  As String
  Dim iRow  As Integer: iRow = 1
  Dim i    As Integer
  Dim j    As Integer: j = 0
  Dim k    As Integer: k = 0
  Dim stTblNo As String: stTblNo = ""
' 選択ありを数え、マークする
  For i = 0 To UserForm1.ListBox1.ListCount - 1
   If UserForm1.ListBox1.Selected(i) Then
     j = j + 1
     Worksheets("TBL").Cells(i + 2, 2).Value = 1  'FLG ON
   Else
     Worksheets("TBL").Cells(i + 2, 2).Value = ""  'FLG OFF
   End If
  Next i
' 項目リストクリア
  Worksheets("COLUMN").Select
  Application.Goto Reference:="項目一覧"
  Selection.ClearContents
  For i = 0 To UserForm1.ListBox1.ListCount - 1
   If UserForm1.ListBox1.Selected(i) Then
     If j > 1 Then              '複数テーブル選択か?
      k = k + 1
      stTblNo = "T" & k & "."
     End If
    ' データ取得SQL編集
    ' stSQL = "select '" & stTblNo & "' || column_name,data_type,data_length,data_precision,data_scale"
    ' stSQL = stSQL & " from user_tab_columns"
    ' stSQL = stSQL & " where table_name = '" & UserForm1.ListBox1.List(i) & "'"
    ' stSQL = stSQL & " order by column_id"
    ' データ取得SQL編集(↓ユーザー指定型)…user_tab_columnsで、複数の同名テーブルを引いてくる場合の改良型
     stSQL = "select '" & stTblNo & "' || column_name,data_type,data_length,data_precision,data_scale"
     stSQL = stSQL & " from all_tab_columns"
     stSQL = stSQL & " where table_name = '" & UserForm1.ListBox1.List(i) & "'"
     stSQL = stSQL & " and upper(owner) = '" & UCase(Ps_User) & "'"         '←スキーマ名
     stSQL = stSQL & " order by column_id"
    ' データを取得(レコードセットオプション:読み取り専用)
     Set OraRs = OraCn.Execute(stSQL)
     Worksheets("COLUMN").Range("A" & iRow + 1).CopyFromRecordset OraRs
     iRow = Cells(Rows.Count, 1).End(xlUp).Row
   End If
  Next i
  If iRow < 2 Then iRow = 2
' 数字項目の場合、整数部・小数部を項目長にする
  For i = 2 To iRow
   If Worksheets("COLUMN").Cells(i, 4).Value <> "" Then
     Worksheets("COLUMN").Cells(i, 3).Value = Worksheets("COLUMN").Cells(i, 4).Value _
                     & "," & Worksheets("COLUMN").Cells(i, 5).Value
   End If
  Next i
' リストボックス範囲の変更
  Application.Names("項目一覧").RefersTo = "=COLUMN!$A$2:$E$" & iRow
  Worksheets("COLUMN").Range("A2").Select
ITEM_END:
' データベース接続切断(NO COMMIT)
  Call PS_DbDisConn(False)
' 画面固定解除
  Application.ScreenUpdating = True
  If ErrMsg <> "" Then
   MsgBox ErrMsg
   Exit Sub
  End If
  Unload UserForm1
  UserForm1.Show
  Exit Sub
Err_Han:
  If ErrMsg = "" Then
   ErrMsg = Err.Description
  End If
  GoTo ITEM_END
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :ボタン「SQL実行」
'+------------------------------------------------------------------------------
Sub SQL実行()
  On Error GoTo Err_Han
  ErrMsg = ""
  If UserForm1.TextBox2.Text = "" Then
   Application.Speech.Speak "You don't set SQL"
   MsgBox "SQLが設定されていません!"
   Err.Raise 0
   Exit Sub
  End If
  Dim stSQL As String
  Dim i   As Integer
' 画面固定
  Application.ScreenUpdating = False
' データ取得SQL編集
  stSQL = UserForm1.TextBox2.Text
  If InStr(stSQL, "WHERE") = 0 And _
   InStr(stSQL, "UPDATE") = 0 And _
   InStr(stSQL, "INSERT") = 0 Then
   stSQL = StrConv(stSQL, vbUpperCase)
  End If
' データベース接続
  Call PS_DbConn
  If ErrMsg <> "" Then GoTo DATA_END
  If Left(stSQL, 6) = "SELECT" Then
  ' データを取得(レコードセットオプション:読み取り専用)
   Application.Speech.Speak "SELECT EXECUTE"
   Set OraRs = OraCn.Execute(stSQL)
  Else
   Application.Speech.Speak "UPDATE EXECUTE"
   OraCn.Execute (stSQL)
   GoTo HIST_ADD
  End If
' データシートクリア
  Worksheets("DATA").Select
  Cells.Clear
 
' 項目名展開
  For i = 0 To OraRs.Fields.Count - 1
   Worksheets("DATA").Cells(1, i + 1).Value = OraRs.Fields(i).Name
   Select Case OraRs.Fields(i).Type
     Case adChar
      Worksheets("DATA").Cells(2, i + 1).Value = "CHAR"
     Case adVarChar
      Worksheets("DATA").Cells(2, i + 1).Value = "VARCHAR2"
     Case adNumeric
      Worksheets("DATA").Cells(2, i + 1).Value = "NUMBER"
     Case adDate, adDBDate, adDBTime, adDBTimeStamp
      Worksheets("DATA").Cells(2, i + 1).Value = "DATE"
     Case Else
      Worksheets("DATA").Cells(2, i + 1).Value = OraRs.Fields(i).Type
   End Select
  Next i
  Rows("1:2").Interior.ColorIndex = 36
' データ展開
  Application.StatusBar = "データ展開中"
  Worksheets("DATA").Range("A3").CopyFromRecordset OraRs
  If Cells(Rows.Count, 1).Value <> "" Then
   Call CSV出力処理
  End If
  Application.StatusBar = False
HIST_ADD:
' 履歴追加
  Worksheets("HIST").Select
  Worksheets("HIST").Rows(1).Select
  Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  stSQL = Replace(stSQL, vbNewLine & " " & vbNewLine, vbNewLine)
  stSQL = Replace(stSQL, vbNewLine & vbNewLine, vbNewLine)
  Worksheets("HIST").Cells(1, 1).Value = Trim(stSQL)
  Worksheets("HIST").Cells(1, 2).Value = Ps_Host
  Worksheets("HIST").Cells(1, 3).Value = Ps_Sid
  Worksheets("HIST").Cells(1, 4).Value = Ps_User
' リストボックス範囲の維持(変えない)
  Application.Names("実行履歴").RefersTo = "=HIST!$A$1:$A$20"
' データシート表示
  ActiveWindow.WindowState = xlNormal
  Worksheets("DATA").Select
  Worksheets("DATA").Range("A1").Select
DATA_END:
' データベース接続切断
  Select Case Left(stSQL, 6)
   Case "UPDATE", "DELETE", "INSERT"
     Call PS_DbDisConn(True)
   Case Else
     Call PS_DbDisConn(False)
  End Select
' 画面固定解除
  Application.ScreenUpdating = True
  If ErrMsg <> "" Then
   MsgBox ErrMsg
   Exit Sub
  End If
  If Left(stSQL, 6) = "SELECT" Then
   UserForm1.Hide
  Else
   Unload UserForm1
   UserForm1.TextBox2.Text = stSQL
   UserForm1.Show
  End If
  Exit Sub
Err_Han:
  If ErrMsg = "" Then
   ErrMsg = Err.Description
  End If
  GoTo DATA_END
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :ボタン「SAVE」
'+------------------------------------------------------------------------------
Sub データセーブ()
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename("DATA.xls", "Excel ブック(*.xls),1")
  If FileName <> False Then 'ダイアログでキャンセルを選ぶとFALSEで抜ける
   Sheets("DATA").Copy
   ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlExcel8, _
              ReadOnlyRecommended:=False, CreateBackup:=False
   ActiveWindow.Close
  End If
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :CSV出力処理
'+------------------------------------------------------------------------------
Sub CSV出力処理()
  Application.Speech.Speak "Do You want to write a CSV file?"
  If MsgBox("検索件数がシート行限界に達しました" & vbNewLine & _
       "CSVに出力しますか?", vbYesNo) = vbNo Then Exit Sub
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename("DATA.csv", "CSV ファィル(*.csv),1")
  If FileName = False Then Exit Sub 'ダイアログでキャンセルを選ぶとFALSEで抜ける
  Dim outFF  As Integer      ' FreeFile値
  Dim Buf   As String: Buf = ""
  Dim i    As Integer
  Dim j    As Long: j = 0
  outFF = FreeFile
  Open FileName For Output As #outFF
  For i = 0 To OraRs.Fields.Count - 1
   If i > 0 Then Buf = Buf & ","
   Buf = Buf & OraRs.Fields(i).Name
  Next i
  Print #outFF, Buf
  OraRs.MoveFirst
  Do While Not OraRs.EOF
   If OraRs.Fields(0).Type = adNumeric Then
     Buf = OraRs.Fields(0).Value
   Else
     Buf = """" & OraRs.Fields(0).Value & """"
   End If
   For i = 1 To OraRs.Fields.Count - 1
     If OraRs.Fields(i).Type = adNumeric Then
      Buf = Buf & "," & OraRs.Fields(i).Value
     Else
      Buf = Buf & ",""" & OraRs.Fields(i).Value & """"
     End If
   Next i
   Print #outFF, Buf
   j = j + 1
   If j = Int(j / 100) * 100 Then
     Application.StatusBar = "CSV RECORD(現在 " & j & "件目)"
   End If
   OraRs.MoveNext
  Loop
  Close #outFF
  Application.Speech.Speak "A CSV file writing is completed"
  MsgBox FileName & vbNewLine & "に " & j & " 件出力しました"
  Application.StatusBar = False
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :データベース接続
'| 処理内容   :データベースに接続する
'| 引数     :なし
'| 返値     :なし
'| 備考     :実行時エラーは上位処理でハンドル
'+------------------------------------------------------------------------------
Private Sub PS_DbConn()
  On Error GoTo Err_Han
  Dim i As Integer
' 共通変数・ホスト、ユーザ、パスワードのいずれかに入力がない場合
  If Ps_Host = "" Or Ps_Sid = "" Or Ps_User = "" Or Ps_Pass = "" Then
   i = 2
   Do While Worksheets("USER").Cells(i, 1).Value <> ""
     If UserForm1.ComboBox1.Value = Worksheets("USER").Cells(i, 1).Value Then
      Ps_Host = Worksheets("USER").Cells(i, 2).Value 'ホスト
      Ps_Sid = Worksheets("USER").Cells(i, 3).Value  'SID
      Ps_User = Worksheets("USER").Cells(i, 4).Value 'ユーザ-
      Ps_Pass = Worksheets("USER").Cells(i, 5).Value 'パスワード
      Exit Do
     End If
     i = i + 1
   Loop
   If Ps_Host = "" Or Ps_Sid = "" Or Ps_User = "" Or Ps_Pass = "" Then
     ErrMsg = "USERシートにORACLE接続情報が設定されていません"
    ' 実行時エラーを発生させる
     Err.Raise 0
     Exit Sub
   End If
  End If
' ORACLE接続
  Set OraCn = CreateObject("ADODB.Connection")
  OraCn.Open "Provider=MSDAORA;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=" & _
       "(PROTOCOL=TCP)(HOST=" & Ps_Host & ")(PORT = 1521)))" & _
       "(CONNECT_DATA=(SID=" & Ps_Sid & ")));", Ps_User, Ps_Pass
' トランザクションの開始
  OraCn.BeginTrans
  Exit Sub
Err_Han:
  ErrMsg = "ORACLE接続が失敗しました"
  Err.Raise 0
  Exit Sub
End Sub
'+------------------------------------------------------------------------------
'| 処理名    :データベース切断
'| 処理内容   :データベース接続を切断する
'| 引数     :(1) (I)  Boolean トランザクション処理フラグ
'|                 True=Commitする,False=ロールバックする
'| 返値     :なし
'+------------------------------------------------------------------------------
Public Sub PS_DbDisConn(pb_Set As Boolean)
  If ErrMsg <> "" Then Exit Sub
  On Error Resume Next        '実行時エラーを無視
' トランザクション処理フラグ=Trueの場合
  If True = pb_Set Then
   OraCn.CommitTrans        'トランザクションをコミットする
' トランザクション処理フラグ=Falseの場合
  Else
   OraCn.Rollback          'トランザクションをロールバックする
  End If
' オブジェクト消去
  OraRs.Close
  Set OraRs = Nothing
  OraCn.Close
  Set OraCn = Nothing
  On Error GoTo 0           '実行時エラーハンドリングリセット
End Sub
' 引数 SheetName のシートが実際にあるかチェックする
Function ExistSheet(SheetName) As Boolean
  Dim i As Integer
  ExistSheet = False
  For i = 1 To Sheets.Count
   If StrConv(Sheets(i).Name, vbUpperCase) = StrConv(SheetName, vbUpperCase) Then
     ExistSheet = True
     Exit For
   End If
  Next i
End Function
'+------------------------------------------------------------------------------
'| 処理名    :環境設定
'+------------------------------------------------------------------------------
' シート未設定時(初回のみ)手動実行
Sub 初期シート設定()
  Dim NewWorkSheet As Worksheet
  Const CFont   As String = "HGゴシックM" ' 任意のフォントを設定(お好きなフォント)
  If ExistSheet("DATA") = False Then
   Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '-- シートが無ければ追加する
   NewWorkSheet.Name = "DATA"
   Cells.Select
   Selection.Font.Name = CFont
   Range("A1").Select
   Set NewWorkSheet = Nothing
  End If
  If ExistSheet("USER") = False Then
   Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '-- シートが無ければ追加する
   NewWorkSheet.Name = "USER"
   Cells.Select
   Selection.Font.Name = CFont
   Cells(1, 1).Value = "接続先"   ' 見出し(識別名)-- 任意の名称
   Cells(1, 2).Value = "ホスト"   ' Data Source HOST =
   Cells(1, 3).Value = "SID"   ' Data Source CONNECT_DATA=SID =
   Cells(1, 4).Value = "ユーザー"  ' oracle user
   Cells(1, 5).Value = "パスワード" ' oracle password
   Cells(2, 5).NumberFormatLocal = "**;**;**;**"
   Cells(1, 7).Value = "選択idx"  ' 選択記録用(次回表示時も選択を継続)
   Cells(2, 7).Value = 0      ' 先頭が0(初期値)
   Range("A2:E2").Select
   ActiveWorkbook.Names.Add Name:="接続一覧", RefersTo:="=USER!$A$2:$E$2"
   ActiveWorkbook.Names("接続一覧").Comment = "ORACLEの接続情報をコンボボックスに表示する"
   Range("A1").Select
   Set NewWorkSheet = Nothing
  End If
  If ExistSheet("TBL") = False Then
   Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '-- シートが無ければ追加する
   NewWorkSheet.Name = "TBL"
   Cells.Select
   Selection.Font.Name = CFont
   Cells(1, 1).Value = "TABLE_NAME"   ' 見出し
   Range("A2:A2").Select
   ActiveWorkbook.Names.Add Name:="テーブル一覧", RefersTo:="=TBL!$A$2:$A$2"
   ActiveWorkbook.Names("テーブル一覧").Comment = "テーブル一覧情報をリストボックスに表示する"
   Range("A1").Select
   Set NewWorkSheet = Nothing
  End If
  If ExistSheet("COLUMN") = False Then
   Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '-- シートが無ければ追加する
   NewWorkSheet.Name = "COLUMN"
   Cells.Select
   Selection.Font.Name = CFont
   Cells(1, 1).Value = "COLUMN_NAME" ' 見出し(項目名)
   Cells(1, 2).Value = "TYPE"    ' 見出し(データタイプ)
   Cells(1, 3).Value = "LENGTH"   ' 見出し(項目長、但し数字は編集置換する)
   Cells(1, 4).Value = "PRECISION"  ' 見出し(数字、整数部)
   Cells(1, 5).Value = "SCALE"    ' 見出し(数字、小数部)
   Range("A2:C2").Select
   ActiveWorkbook.Names.Add Name:="項目一覧", RefersTo:="=COLUMN!$A$2:$C$2"
   ActiveWorkbook.Names("項目一覧").Comment = "項目一覧情報をリストボックスに表示する"
   Range("A1").Select
   Set NewWorkSheet = Nothing
  End If
  If ExistSheet("HIST") = False Then
   Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '-- シートが無ければ追加する
   NewWorkSheet.Name = "HIST"
   Cells.Select
   Selection.Font.Name = CFont
   Range("A2:A20").Select
   ActiveWorkbook.Names.Add Name:="実行履歴", RefersTo:="=HIST!$A$2:$A$20"
   ActiveWorkbook.Names("実行履歴").Comment = "実行履歴をリストボックスに表示する"
   Range("A1").Select
   Set NewWorkSheet = Nothing
  End If
' 既定シートは削除する(削除しなくても可)
  If ExistSheet("Sheet1") Then
   Worksheets("Sheet1").Delete
  End If
  If ExistSheet("Sheet2") Then
   Worksheets("Sheet2").Delete
  End If
  If ExistSheet("Sheet3") Then
   Worksheets("Sheet3").Delete
  End If
End Sub
'==========(UserForm1)===========================
Option Explicit
'+------------------------------------------------------------------------------
'| イベント    :コンボボックス「接続先」
'+------------------------------------------------------------------------------
Private Sub ComboBox1_Change()
  Dim i As Integer
  ThisWorkbook.Activate
  Worksheets("USER").Range("G2").Value = UserForm1.ComboBox1.ListIndex
  i = UserForm1.ComboBox1.ListIndex + 2
  Ps_Host = Worksheets("USER").Cells(i, 2).Value 'ホスト
  Ps_Sid = Worksheets("USER").Cells(i, 3).Value  'SID
  Ps_User = Worksheets("USER").Cells(i, 4).Value 'ユーザ-
  Ps_Pass = Worksheets("USER").Cells(i, 5).Value 'パスワード
End Sub
'+------------------------------------------------------------------------------
'| イベント    :ボタン「TABLE」
'+------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
  Call テーブル一覧
End Sub
'+------------------------------------------------------------------------------
'| イベント    :ボタン「COLUMN」
'+------------------------------------------------------------------------------
Private Sub CommandButton2_Click()
  Call 項目一覧
End Sub
'+------------------------------------------------------------------------------
'| イベント    :ボタン「SELECT」
'+------------------------------------------------------------------------------
Private Sub CommandButton3_Click()
  Dim stSQL As String
  Dim i   As Integer
  Dim j   As Integer: j = 0
  Dim k   As Integer: k = 0
' 検索項目編集 (SELECT ~)
  stSQL = "SELECT "
  If UserForm1.ListBox2.ListCount > 0 Then
   For i = 0 To UserForm1.ListBox2.ListCount - 1
     If UserForm1.ListBox2.Selected(i) Then
      stSQL = stSQL & UserForm1.ListBox2.List(i) & " ,"
      j = j + 1
     End If
   Next i
   If j > 0 Then
     stSQL = Left(stSQL, Len(stSQL) - 2)
   Else
     stSQL = stSQL & "*"
   End If
  End If
' テーブル名編集 (FROM ~)
  j = 0
  For i = 0 To UserForm1.ListBox1.ListCount - 1
   If UserForm1.ListBox1.Selected(i) Then   '複数指定あり
     j = j + 1
   End If
  Next i
  If j > 1 Then
   stSQL = stSQL & vbNewLine & " FROM "
  Else
   stSQL = stSQL & ",ROWID " & vbNewLine & " FROM "
  End If
  For i = 0 To UserForm1.ListBox1.ListCount - 1
   If UserForm1.ListBox1.Selected(i) Then
     k = k + 1
     If j > 1 Then
      stSQL = stSQL & UserForm1.ListBox1.List(i) & " T" & k
      If k < j Then
        stSQL = stSQL & ","
      End If
     Else
      stSQL = Replace(stSQL, "SELECT *,ROWID", "SELECT " & UserForm1.ListBox1.List(i) & ".*,ROWID")
      stSQL = stSQL & UserForm1.ListBox1.List(i)
     End If
   End If
  Next i
  UserForm1.TextBox2.Text = stSQL
  UserForm1.TextBox2.SetFocus
End Sub
'+------------------------------------------------------------------------------
'| イベント    :ボタン「WHERE」
'+------------------------------------------------------------------------------
Private Sub CommandButton4_Click()
  Dim stSQL As String
  Dim i   As Integer
  Dim j   As Integer: j = 0
  stSQL = UserForm1.TextBox2.Text
  If InStr(stSQL, "WHERE") > 0 Then
   stSQL = Left(stSQL, InStr(stSQL, "WHERE") - 1)
  End If
  stSQL = stSQL & vbNewLine & " WHERE "
  If UserForm1.ListBox2.ListCount > 1 Then
   For i = 0 To UserForm1.ListBox2.ListCount - 1
     If UserForm1.ListBox2.Selected(i) Then
      stSQL = stSQL & UserForm1.ListBox2.List(i) & " = " & vbNewLine & " AND "
      j = j + 1
     End If
   Next i
   If j > 0 Then
     stSQL = Left(stSQL, Len(stSQL) - 5) ' 末尾の AND の除去
   End If
  End If
  UserForm1.TextBox2.Text = stSQL
  UserForm1.TextBox2.SetFocus
End Sub

'(次の記事に続く)
' http://blog.goo.ne.jp/frontflug/e/908ef1c3488d02fc707bbe95c7ba55be へ続く
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「EXCEL VBA」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事