アットウィキロゴ
note4recurrent @ ウィキ
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

note4recurrent @ ウィキ

VBA_SQL-select

最終更新:

note4recurrent

- view
だれでも歓迎! 編集

https://www.excellovers.com/archive/category/VBA

Option Explicit

Sub slect()

   'SQLアクセスのFunction化
   'ワークシート処理をsub化
   Application.ScreenUpdating = False      '画面描画の停止
   
   Call clearSheet                                     'シートのクリア
   Call writeVal(accSQL(1, 1000))              'accSQLで検索した結果をwriteValでシートに転記
   
   Application.ScreenUpdating = True       '画面描画の停止解除

End Sub

Function accSQL(ByVal startCD As Long, ByVal endCD As Long) As Variant
'   生徒コードの開始、終了の値を受けてSQLから生徒データをダウンロードする。
   '==============DB接続
   Dim db      As ADODB.connection     'アクセス用のオブジェクト宣言
   Dim openFl  As Boolean
   openFl = False                                  'オープンフラグ
   
   'エラー処理の宣言
   On Error GoTo ErrorHandler
   
   If db Is Nothing Then                          'インスタンスが存在しない場合
       Set db = New ADODB.connection     'インスタンス生成
       openFl = True                                 'オープンフラグをTrue
   Else    'オブジェクトが存在する場合
       If db.State = adStateClosed Then    'コネクション状態がクローズの場合
           openFl = True                           'オープンフラグオン
       End If
   End If
   
   If openFl = True Then                   'オープンフラグがオンの場合 DB に接続
       db.Open "Provider=-----;" & _
           "Data Source=DBname;" & _
           "Initial Catalog= tablename;" & _
           "User Id=********;" & _
           "Password=******;"
   '    Call MsgBox("接続されました", vbInformation)
   End If
   
   '==============SQL実行
   
   Dim rs   As ADODB.Recordset             'SQLにアクセスするオブジェクト宣言
   Set rs = New ADODB.Recordset            'インスタンス生成
   
   rs.ActiveConnection = db                'dbの接続をrsのActivConnectionにセット
   
   'テストデータ取得SQL文をrsにセット
   rs.Source = "SELECT " & _
               " STUCD,SUTNMPRT,SEX,SCHOOLNM " & _
               "FROM " & _
               " dbo.TM_STUDENT " & _
               " WHERE " & _
               " STUCD between " & startCD & " and " & endCD & "  and" & _
               " SCHOOLNM <>''"
   rs.Open                                 'SQL実行
   If rs.EOF = True Then                   'データが存在ない場合
       Call MsgBox("該当データが存在しません")
   Else                                    'データが存在する場合
       accSQL = rs.GetRows                 'GetRowsメソッドでデータを戻り値に格納)
   End If
   
   '==============SQLの後処理
   rs.Close                                'レコードセットクローズ
   Set rs = Nothing                        'rsを破棄
   If Not db Is Nothing Then               'オブジェクトが存在する場合
       'コネクション状態がオープンの場合
       If db.State = adStateOpen Then
           db.Close                        'DBクローズ
       End If
       Set db = Nothing                    'オブジェクト破棄
   End If

Exit Function

'エラーの場合
ErrorHandler:
   Call MsgBox("エラー" & Err.Number & Chr(13) & Err.Description, vbCritical)
End Function

Sub writeVal(gotVal As Variant)

'gotVal のデータをセルに転記する
'SQL からダウンロードしたデータは縦と横がエクセルと逆なので、
'そのままでは範囲を指定した一括代入に向かない。
'一括代入後worksheetfuncitonで入れ替えペーストすることもできるが
'列の上限は行の上限を下回るのでデータ数が多いと入りきらない可能性がある。
'ここでは取り込んだデータを仮の配列に入れなおしてから貼り付けている。
   Dim b As Workbook
   Set b = ThisWorkbook
   Dim w As Worksheet
   Set w = b.Worksheets(1)         '貼り付けるシートはここで決まる。
   Dim r As Range
   Dim RowSize, columnSize, i, j As Long
   Dim temp()  As Variant          '縦と横を入れ替えるための仮の配列
   
   columnSize = UBound(gotVal, 1)
   RowSize = UBound(gotVal, 2)
   ReDim temp(RowSize, columnSize) '縦と横を入れ替えるための設定
   
   For i = 0 To UBound(gotVal, 1)
       For j = 0 To UBound(gotVal, 2)
           temp(j, i) = gotVal(i, j)
       Next j
   Next i
   
   RowSize = UBound(temp, 1) + 1
   columnSize = UBound(temp, 2) + 1
       
   Set r = w.Range("A2").Resize(RowSize, columnSize)   '貼り付ける範囲を設定
   
   r.Value = temp                                      'シートに貼り付け

End Sub


Sub clearSheet()
'   シートのクリア
'   1行目は残している
'   特定の範囲だけを更新したい場合にはここで範囲を決めること
   Range("A2:XFD1048576").Select
   Selection.ClearContents

End Sub

タグ:

+ タグ編集
  • タグ:
最近更新されたスレッド
ウィキ募集バナー