1

わかりましたので、渡すクエリ文字列を使用してデータベースをクエリするこの関数があります。現時点では、ワークシートにクエリ結果を出力しています。VBAで計算などを実行するために使用できる範囲として結果を返す関数を取得するにはどうすればよいですか? 次に、この範囲をどのように参照しますか? たとえば、結果の「名前」列を取得します。

Function Access_Data(query As String)
 'Requires reference to Microsoft ActiveX Data Objects xx Library

Dim Cn As ADODB.Connection, Rs As ADODB.Recordset
Dim MyConn, sSQL As String

Dim Rw As Long, Col As Long, c As Long
Dim MyField, Location As Range

 'Set destination
Set Location = Sheets(1).Range("a1")
 'Set source
MyConn = "S:\Docs\Harry\Engine Client\Engine3.accdb"
 'Create query
sSQL = query

 'Create RecordSet
Set Cn = New ADODB.Connection
With Cn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Open MyConn
    Set Rs = .Execute(sSQL)
End With

 'Write RecordSet to results area
Rw = Location.Row
Col = Location.Column
c = Col
Do Until Rs.EOF
    For Each MyField In Rs.Fields
        Cells(Rw, c) = MyField
        c = c + 1
    Next MyField
    Rs.MoveNext
    Rw = Rw + 1
    c = Col
Loop
Set Location = Nothing
Set Cn = Nothing

終了機能

4

2 に答える 2

1

SQL Server からデータを読み取り、結果をワークシートに挿入する方法のサンプル (ここでは統合セキュリティを使用)。新しいデータを挿入する前にターゲット シートが空だった場合は、UsedRange プロパティを使用して参照します。またはそれを計算すると、rng は一番左のセルです。

Option Explicit

' Add reference to Microsoft ActiveX Data Objects Lib

Public Sub main(): On Error GoTo Err_handler

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection

    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=MYSUPERSERVER;Initial Catalog=MYSUPERDATABASE;Integrated Security=sspi"
    cn.Open

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    rs.ActiveConnection = cn
    rs.Open "SELECT * FROM MyTable"

    Dim fld As ADODB.Field
    Dim rng As Range
    Set rng = [a1]
    For Each fld In rs.Fields
        rng.Value = fld.Name
        Set rng = rng.Offset(0, 1)
    Next fld

    Set rng = rng.Offset(1, -rs.Fields.Count)
    rng.CopyFromRecordset rs

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing

    Exit Sub

    Err_handler:
    MsgBox Err.Description

End Sub
于 2012-10-12T12:45:08.267 に答える
1
Function Access_Data(query As String)
 'Requires reference to Microsoft ActiveX Data Objects xx Library

Dim Cn As ADODB.Connection, Rs As ADODB.Recordset
Dim MyConn, sSQL As String

Dim Rw As Long, c As Long
Dim MyField, Result

 'Set source
MyConn = "S:\Docs\Harry\Engine Client\Engine3.accdb"
 'Create query
sSQL = query

 'Create RecordSet
Set Cn = New ADODB.Connection
With Cn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .CursorLocation = adUseClient
    .Open MyConn
    Set Rs = .Execute(sSQL)
End With

 'Write RecordSet to results
Redim Result(1 To Rs.RecordCount, 1 To Rs.Fields.Count)
Rw = 1
Do Until Rs.EOF
    c = 1
    For Each MyField In Rs.Fields
        Result(Rw, c) = MyField
        c = c + 1
    Next MyField
    Rs.MoveNext
    Rw = Rw + 1
Loop
Set Cn = Nothing

Access_Data = Result
End Function

これは多次元配列を返します。範囲はワークシートの一部を参照する必要があります。「非表示」の範囲を作成することはできません。(ワークシートの一部を非表示にすることもできますが、その必要がある場合は.)

結果にアクセスするには:

Dim v, i As Long
v = Access_Data("select ID, Name from somewhere")
For i = 1 To UBound(v, 1)
    MsgBox v(i, 1) & " / " & v(i, 2)
Next
于 2012-10-12T12:11:23.167 に答える