Это весело, поэтому я написал его. По сути, этот скрипт будет обрабатывать ваш wsFROM, как если бы он был таблицей базы данных, тогда он применит к нему инструкцию SQL, чтобы сделать то, что вам нужно, и вернуть результаты в wsTO. Он должен работать довольно быстро, даже если это 20000 записей. Альтернативой будет цикл через каждую строку в листе, а затем посмотреть, есть ли другие, похожие на него, и добавить результаты. Это была бы одна из тех 20-минутных рутинных кошмаров VBA, где это должно длиться несколько десятков секунд.
Убедитесь, что вы изменили строки SET wsFROM...
и Set wsTO...
, чтобы быть вашими листами. Кроме этого, я считаю, что он должен работать с вашими данными как есть.
Sub excelSQL()
'Variables
Dim objConn As Object
Dim rs As Object
Dim strFileName As String, strSQL As String, strConn As String
Dim wsFrom As Worksheet, wsTo As Worksheet
'set the worksheet with the data and the worksheet to dump the results
Set wsFrom = Worksheets("Sheet1")
Set wsTo = Worksheets("Sheet2")
'Make a new file with _tmp appended to it in same folder
strFileName = ThisWorkbook.Path & "/" & ThisWorkbook.Name
strFileName = Replace(strFileName, ".xls", "_tmp.xls")
ThisWorkbook.SaveCopyAs strFileName
'Fancy ADODB stuff.. essentially open up that copy we just saves as if it were a database
Set objConn = CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;"""
objConn.Open strConn
'This is the sql string we will use to query the excel/database. The field names are the names in Row 1 of the sheet
strSQL = "SELECT [Number],[NAME],[Up/Down],[FYE],[GL_ACCT_GRP],[GL_SEG_CD],[ACCT#],[CODE],[REGION],Sum(Amount1), Sum(Amount2) FROM [" & wsFrom.Name & "$] GROUP BY [Number],[NAME],[Up/Down],[FYE],[GL_ACCT_GRP],[GL_SEG_CD],[ACCT#],[CODE],[REGION];"
'Fancy ADODB stuff to apply that SQL statement to the excel/database
Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, objConn
'get headers
Dim header as object
Dim headerCol as integer
headerCol = 1
'Loop through fields in the recordset
For each header in rs.fields
'Stick them in Row 1
Cells(1, headerCol).value = header.name
'Next Column
headerCol = headerCol + 1
next header
'Copy the results of the sql statement, stored in the recordset, into the To sheet
wsTo.Range("A2").CopyFromRecordset rs
'close it up
rs.Close
objConn.Close
'Remove that tmp workbook
Kill strFileName
End Sub
Это не большой ответ, но ... Это то, что предназначена для базы данных. У вас есть доступ, который вы можете импортировать, и выполните «SELECT Number, UpDown, FYE, GL_SEG_CD, ACCTNUMBER, CODE, sum (Amount1), sum (amount2) FROM table GROUP BY Number, UpDown, FYE, GL_SEG_CD, ACCTNUMBER, CODE '? Выполнение этого с помощью VBA возможно, но ugh ... написания и отладки, медленности и неожиданной неудобства ... это рецепт для вырезывания волос и изжоги. – JNevill
Я хочу сохранить его в формате EXCEL, потому что, если я использую Access, есть много манипуляций с данными. Если я сделаю EXCEL, я могу просто автоматизировать все. : \ – Flyhigh
Какую версию Excel вы используете? – JNevill