0

次のvbaがあります。これは、セルC10以降のMCOを空になるまで読み取り、SQLデータベースからマシンの数、復号化の数、およびマシンのアップグレードを取得します。

これは正常に機能しますが、対応する行のデータを取得するのに問題があります。現時点では、常にデータをD10 cozに書き込みます。ハードコーディングしましたが、これをインクリメントする方法、またはMCOが読み込まれたのと同じ行に書き込む方法がわかりません。レコードセットが空の場合も同じ問題が発生します。3列に000を挿入したい

どんな助けでも大歓迎です

Sub Summary_Click()

Dim MyConnObj As New ADODB.Connection 'ADODB Connection Object
Dim myRecSet As New ADODB.Recordset 'Recordset Object
Dim sqlStr As String ' String variable to store sql command

Range("D9:F34").Select
Range("D9:F34").Clear

Range("C10").Select

Set myRecSet = New ADODB.Recordset

Do Until IsEmpty(ActiveCell)
    strMCO = ActiveCell.Value

    MyConnObj.Open _
        "Provider = sqloledb;" & _
        "Data Source=xxx;" & _
        "Initial Catalog=xxx;" & _
        "User ID=xxx;" & _
        "Password=xxx;"

    strqa = " SELECT Count (distinct DeviceData.machinename) As [Number Of Devices], sum(case buildstatus when 'Decrypted' then 1 else 0 end) Decrypted, sum(case buildstatus when 'Upgrading' then 1 else 0 end) Upgrading, SiteList.Region "
    strqb = " FROM dbo.DeviceData JOIN dbo.SiteList ON dbo.DeviceData.CurrentSite = dbo.SiteList.SiteCode"
    strqc = " where MCO = '" & strMCO & "' "
    strqd = " group by DeviceData.Country, SiteList.Region"

    sqlStr = strqa & strqb & strqc & strqd

    myRecSet.Open sqlStr, MyConnObj, adOpenKeyset

    ActiveCell.Offset(0, 1).Select

    ActiveSheet.Range("D10").CopyFromRecordset myRecSet
    'ActiveSheet.Range("D<10 + 1>).CopyFromRecordset myRecSet

    If myRecSet.RecordCount = 0 Then
        ActiveSheet.Range("D10, E10, F10") = "0"
    End If

    ActiveCell.Offset(1, -1).Select
    MyConnObj.Close
Loop

End Sub
4

1 に答える 1

0

Excel シートを結合テーブルとして含めるのが最も簡単な場合があります。例えば:

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

''Not the best way to get the name
strFile = ActiveWorkbook.FullName

''2007 / 2010 connection
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 12.0 xml;HDR=Yes;"";"

cn.Open strCon

''ODBC Connection for sql server
scn = "[ODBC;DRIVER=SQL Server;SERVER\Instance;" _ 
    & "Trusted_Connection=Yes;DATABASE=Test]"

sSQL = "SELECT a.Stuff, b.ID, b.AText FROM [Sheet5$] a " _
& "INNER JOIN " & scn & ".table_1 b " _             
& "ON a.Stuff = b.AText"
rs.Open sSQL, cn

ActiveWorkbook.Sheets("Sheet7").Cells(1, 1).CopyFromRecordset rs

SQL Server へのリンクがある場合は、クリーンなデータを操作していることにかなりの自信を持っている必要があります。

セルについて言及したことに注意してください。シートをつなげるという発想が苦手な方は、セルやステップなどを参考にすることもできます。For i=1 To MaxRows

于 2012-05-30T10:00:18.707 に答える