2

私は、ユーザーが日付を選択し、適切な列名を持つ Excel ワークブックに既に存在するシートにデータが入力されるサーバー/データベース名を入力する Excel プロジェクトを作成しています。これで、2 つのシートが作成され (SQL データで埋められます)、作成する各シートのピボットが作成されます。これは、シートという名前の prod の最初のマクロです。

Sub Prod()
ActiveWorkbook.Sheets("UserInput").Activate ' a sheet where date picker and db/server names are taken from user
Set con = New ADODB.Connection
Set rs = New ADODB.Recordset
Dim slctqry As String
Dim dealdate As String
Dim today As String
Dim msg As String
msg = "Sorry, for this date data is yet to come"
today = Range("B2").Value  'B2 cell has today() function
today = Format(today, "yyyy-mm-dd")
dealdate = Range("B1").Value 'date picker is linked to this cell
dealdate = Format(dealdate, "yyyy-mm-dd")
con.ConnectionString = "Provider=SQLOLEDB;Data Source=sql123abce\sql01;Initial Catalog=sqldb;User ID=abcd;Password=Windows;Integrated Security=SSPI"
con.Open
If (dealdate > today) Then
MsgBox msg
ElseIf (dealdate = today) Then
slctqry = "select Number,Premium, TransactionID, money from traders(nolock)"
slctqry = slctqry & " where convert(date,tradedate,103)='" & dealdate & "'"
Set rs.ActiveConnection = con
rs.Open slctqry
ActiveWorkbok.Sheets("Prod").Activate ' prod named worksheet where data will be copied from SQL db
Range("A2").CopyFromRecordset (rs)
ElseIf (dealdate < today) Then
slctqry = "select Number,Premium, TransactionID, money from tradersaudit(nolock)"
slctqry = slctqry & " where convert(date,tradedate,103)='" & dealdate & "'"
Set rs.ActiveConnection = con
rs.Open slctqry
'Dim ws4 As Worksheet
ActiveWorkbook.Sheets("Prod").Activate
Range("A2").CopyFromRecordset (rs)
End If
con.Close
End Sub  

ユーザーから取得した db/server の場合、データは Test という名前のシートに入力されます。使用されるマクロは次のとおりです。

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


Function GetConnectionString() As String

   Dim strCn As String
    strCn = "Provider=sqloledb;"
    strCn = strCn & "Data Source=" & Range("Server") & ";"
    strCn = strCn & "Initial Catalog=" & Range("Database") & ";"
    If (Range("UserID") <> "") Then
        strCn = strCn & "User ID=" & Range("UserID") & ";"
        strCn = strCn & "password=" & Range("Pass")
    Else
        strCn = strCn & "Integrated Security = SSPI"
    End If

    GetConnectionString = strCn

End Function

Sub Test()

ActiveWorkbook.Sheets("UserInput").Activate
Dim ws As Worksheet
Dim Sql As String
Dim dealdate As String
Dim today As String
Dim msg As String
msg = "Sorry, for this date data is yet to come"
today = Range("B2").Value
today = Format(today, "yyyy-mm-dd")
dealdate = Range("B1").Value
dealdate = Format(dealdate, "yyyy-mm-dd")
' open connection
cn.ConnectionTimeout = 100
cn.Open GetConnectionString()
If (dealdate > today) Then
MsgBox msg
ElseIf (dealdate = today) Then
Sql = "select Number,Premium, TransactionID, money from traders(nolock)"
Sql = Sql & " where convert(date,tradedate,103)='" & dealdate & "'"
Set rs.ActiveConnection = con
rs.Open Sql
ActiveWorkbook.Sheets("Test").Activate ' test sheet is there alerady with proper column  names
Range("A2").CopyFromRecordset rs
ElseIf (dealdate < today) Then
Sql = "select Number,Premium, TransactionID, money from traders(nolock)"
Sql = Sql & " where convert(date,tradedate,103)='" & dealdate & "'"
Set rs.ActiveConnection = cn
rs.Open Sql
ActiveWorkbook.Sheets("Test").Activate
Range("A2").CopyFromRecordset rs
End If
cn.Close
End Sub

これで、シート Prod と Test にデータが正常に入力されました。次のマクロは、ピボット作成用です。

 Dim bReport As Workbook, Report As Worksheet, pivotSheet As Worksheet 'To set up my workbook & worksheet variables.

    Set bReport = Excel.ActiveWorkbook
    Set Report = bReport.Worksheets.Add 'Create the worksheet to place the SQL data
    Set pivotSheet = bReport.Worksheets.Add 'Create the worksheet to place the Pivot Table

    Dim pivotSource As Range 'To set up the variable representing your pivot data.
    Set pivotSource = Report.UsedRange 'You can define a specific range, but this assumes the data is the only thing on the Report sheet.

    Dim tableName As String
    tableName = "Pivot_Prod"  'name of pivot report i wanted to create from data in sheet Prod

    bReport.PivotCaches.Add(SourceType:=xlDatabase, _
            SourceData:=pivotSource).CreatePivotTable TableDestination:=pivotSheet.Cells(1, 1), _
                tableName:=tableName

    Set pt = pivotSheet.PivotTables(tableName)
    pivotSheet.PivotTableWizard TableDestination:=pivotSheet.Cells(1, 1)
    Set pOne= pt.PivotFields("Number")
    Set pTwo = pt.PivotFields("Premium")
    Set pthree = pt.PivotFields("TransactoinID")
    Set pFour = pt.PivotFields("money")

    pOne.Orientation = xlRowField 'This assigns the orientation of a given field to xlRowField.
    pTwo.Orientation = xlRowField
    pTwo.Subtotals(1) = False 'This denotes there will be no subtotal for this field.
    pThree.Orientation = xlRowField
    pThree.Subtotals(1) = False
    pFour.Orientation = xlDataField
    pFour.NumberFormat = "$#,##0.00"

テストシートも同様です。

@lopsided-コードファイルで、SQL dbからデータを取得するための新しいシートを作成しています。しかし、製品とテストシートをキャッシュにリンクして、それらをピボットソースとして作成するには、どこでどのようにすればよいですか? ここで追加する report という名前のワークシートのデータを取得するために、マクロ prod() または Test() を呼び出す場合のアプローチを意味します。その場合、どうすれば先に進むことができますか?上記のコードでは、pivotcache.add コード行でエラーが発生しています。マイナーチェンジが必要なようですので、修正できるか確認してください。

4

1 に答える 1