在现有的ADO记录集中追加字段
我在Excel中使用ADO记录集以获取巨大的CSV(约1百万行)并将其用作外部数据以创建PivotCache & Pivottable。在现有的ADO记录集中追加字段
我想编辑的记录追加附加字段(列),并添加从即具有这样字符串数据一周字段中的一个字段计算数据:
例如如果A,B,C是记录字段,
A B C D E
w 2011 01 01 2011
w 2011 02 02 2011
w 2011 03 03 2011
w 2011 04 04 2011
w 2012 05 05 2012
然后我想附加字段d,E和如上所示,从塔A剥离等我将在Excel中做数据添加到它们,
D = VALUE(RIGHT(A2,2)) E = VALUE(MID(A2,3,4))
但我想使用SQL函数。
然后我使用这个附加记录集来创建一个pivotcache和一个使用它作为外部数据源的透视表。我的CODE.i中的注释无法将记录集克隆到一个新的记录集中,也因为它给了我一些不可用的书签错误。
下面给我的错误:
Option Explicit
Sub GetCSV()
Application.EnableEvents = False
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim sFileName As String
Dim sFilePath As String
Dim rngPivotDest As Range
Dim pcPivotCache As PivotCache
Dim ptPivotTable As PivotTable
Dim SQL As String
Dim sConnStrP1 As String
Dim sConnStrP2 As String
Dim cConnection As Object
Dim rsRecordset As Object, RS As Object, Fld As Object
Dim Sht As Worksheet
Dim Conn As Object
With ThisWorkbook
Set rsRecordset = CreateObject("ADODB.Recordset")
Set RS = CreateObject("ADODB.Recordset")
Set cConnection = CreateObject("ADODB.Connection")
sFileName = Application.GetOpenFilename("Text Files, *.asc; *.txt; *.csv", 1, "Select a Text File", , False)
sFilePath = Left(sFileName, InStrRev(sFileName, "\"))
sFileName = Replace(sFileName, sFilePath, "")
sConnStrP1 = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="
sConnStrP2 = ";Extensions=asc,csv,tab,txt;FIL=text;Persist Security Info=False"
cConnection.Open sConnStrP1 & sFilePath & sConnStrP2
SQL = "SELECT * FROM [" & sFileName & "]"
Set rsRecordset = cConnection.Execute(SQL)
'****** THIS ENTIRE PART IS NOT WORKING******
With RS
.cursorlocation = 3 'aduseclient
.cursortype = 2 'adOpenDynamic 3 'adopenstatic
' For Each Fld In rsRecordset.Fields
' .Fields.append Fld.Name, Fld.Type, Fld.definedsize, Fld.Attributes, Fld.adFldIsNullable
' Next Fld
.locktype = 4 'adLockBatchOptimistic'3 'adlockoptimistic
.Fields.append "WeekNumber", 3 'adinteger
.Fields.append "Year", 7 'addate
.Open
.Update
'do something to grab the entire data into RS
Set RS = rsRecordset.Clone
'or something like
Set RS = rsRecordset.getrows
'append some function code to the last 2 fields to strip YEAR & WEEK from 1st field.
......
......
End With
*********************************
'Delete any connections in workbook
On Error Resume Next
For Each Conn In .Connections
Conn.Delete
Next Conn
On Error GoTo 0
'Delete the Pivot Sheet
On Error Resume Next
For Each Sht In .Sheets
If LCase(Trim(Sht.Name)) = LCase("Pivot") Then Sht.Delete
Next Sht
On Error GoTo 0
'Create a PivotCache
Set pcPivotCache = .PivotCaches.Create(SourceType:=xlExternal)
Set pcPivotCache.Recordset = rsRecordset
'Create a Pivot Sheet
.Sheets.Add after:=.Sheets("Main")
ActiveSheet.Name = "Pivot"
'Create a PivotTable
Set ptPivotTable = pcPivotCache.CreatePivotTable(TableDestination:=.Sheets("Pivot").Range("A3"))
With ptPivotTable
.Name = "PivotTable"
.SaveData = False
End With
With ptPivotTable
With .PivotFields("Level")
.Orientation = xlPageField
.Position = 1
End With
With .PivotFields("Cat")
.Orientation = xlPageField
.Position = 1
End With
With .PivotFields("Mfgr")
.Orientation = xlPageField
.Position = 1
End With
With .PivotFields("Brand")
.Orientation = xlPageField
.Position = 1
End With
With .PivotFields("Descr")
.Orientation = xlRowField
.Position = 1
End With
End With
ptPivotTable.AddDataField ptPivotTable.PivotFields("Sales Value from CrossCountrySales"), "Sum of Sales Value from CrossCountrySales", xlSum
With ptPivotTable.PivotFields("Week")
.Orientation = xlColumnField
.Position = 1
End With
With ptPivotTable.PivotFields("Sum of Sales Value from CrossCountrySales")
.Calculation = xlNoAdditionalCalculation
End With
cConnection.Close
Set rsRecordset = Nothing
Set cConnection = Nothing
Set Conn = Nothing
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub
您可以创建你的原始SQL查询这些新的领域。
这是一个简化的例子:我查询一个txt文件“week.txt”(它只有一个带有“week”和几行测试数据的列)并将记录集放到工作表上。
Sub GetCSV()
Dim SQL As String
Dim sConnStrP1 As String
Dim cConnection As Object
Dim rsRecordset As Object, RS As Object
Dim Conn As Object, i As Integer
Set rsRecordset = CreateObject("ADODB.Recordset")
Set RS = CreateObject("ADODB.Recordset")
Set cConnection = CreateObject("ADODB.Connection")
sConnStrP1 = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=C:\_Stuff\test\" & _
";Extensions=asc,csv,tab,txt;FIL=text;Persist Security Info=False"
cConnection.Open sConnStrP1
'create new columns based on "week" column
' 1*(....) coerces to number
SQL = "SELECT [week], 1*(right(week,2)) as wk_num, 1*(mid(week,3,4)) as year FROM [week.txt]"
Set rsRecordset = cConnection.Execute(SQL)
'drop to sheet...
With ActiveSheet.Range("D5")
For i = 0 To rsRecordset.Fields.Count - 1
.Offset(0, i).Value = rsRecordset.Fields(i).Name
Next i
.Offset(1, 0).CopyFromRecordset rsRecordset
End With
End Sub
我的sql查询是从CSV中选择整个数据,它将在稍后用于创建数据透视表。我没有看到您选择csv数据,但是您只定义了一个选择查询来查询周列,并创建年份和周数列。我不会将任何数据放到工作表中,而是创建一个外部的pivotcache并使用它来创建数据透视表。我之所以没有将源列添加到源csv中,是因为它的行数大概是100万行,我不知道如何去做。我想要记录集中额外的weeknumber和year列,以便它们出现并可以在数据透视表中使用。 – sifar786
感谢蒂姆,编辑SQL查询工作。 SQL =“SELECT *,[week],1 *(right(week,2))as WeekNumber,1 *(mid(week,3,4))as FROM [”&sFileName&“]”'[week。 txt]“ – sifar786
很高兴你的工作 - 我的例子只是为了说明一般方法:我知道你正在做一些与你的数据集不同的东西 –
您是否尝试过在SQL查询中创建并填充这些附加列,而不是在添加它们之后? –
嗨Tim,我不知道如何通过sql添加这些列和他们提取的数据。 – sifar786