2014-10-08 4 views
-1

enter image description hereEXCEL VBA для поиска дубликатов строк и столбцов сумм

enter image description here

Есть 10.000+ Ряды с Vendor и оплаты поставщиков информации. Если есть дубликаты на основе полей в столбцах A, C, D, F, G, H, тогда я хочу суммировать суммы в столбцах K и L и просто сохранить 1 запись/строку для нее.

Нижнее изображение является результатом.

Я хочу использовать скрипт словаря, если это возможно, но я не знаю, как его использовать. Это просто кажется эффективным, если нет, другой метод тоже хорош. Может кто-нибудь помочь ????? Буду весьма признателен за это!!

+0

Это не большой ответ, но ... Это то, что предназначена для базы данных. У вас есть доступ, который вы можете импортировать, и выполните «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

+0

Я хочу сохранить его в формате EXCEL, потому что, если я использую Access, есть много манипуляций с данными. Если я сделаю EXCEL, я могу просто автоматизировать все. : \ – Flyhigh

+0

Какую версию Excel вы используете? – JNevill

ответ

1

Это весело, поэтому я написал его. По сути, этот скрипт будет обрабатывать ваш 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 
+0

Я думаю, что это сработало. Я дам вам знать, когда я запустил файл. У меня есть другой вопрос, сумма сумм идет полностью в столбец «BF». Таким образом, у меня есть столбец «K» через столбец «BF», который составляет 48 столбцов, которые мне нужны для кода, основанного на критериях. Я собирался модифицировать его, но я никогда не делал SQL для EXCEL lol. Впечатляющие вещи. Заранее спасибо. – Flyhigh

+0

Каждая ячейка заголовка (в строке 1) вашего листа действует как поле в таблице Excel/Database. В SQL здесь три предложения: «SELECT», где вы указываете поля, которые вы хотите вернуть (и суммируете те, которые вы хотите суммировать), 'FROM', где вы просто называете лист, который действует как таблица, и' GROUP BY', где вы указываете те же поля/заголовки, которые у вас были в 'SELECT', за исключением тех, которые вы суммируете (поскольку' SUM() 'по существу действует как группировка.Если вы застряли, просто бросьте код в новый вопрос, и список ваших заголовков с SQL и людьми должны быть в состоянии помочь. – JNevill

+0

В стороне, факт, что вы можете применить SQL к своим данным в excel, является глупым. Например, если вы хотите не только суммировать этот материал, но и вам нужны только строки, где Acct # находилось между 5000 и 5050, вы могли бы добавить предложение WHERE после предложения 'FROM' и перед' GROUP BY', что выглядит как 'WHERE [ACCT #] BETWEEN 5000 AND 5050' – JNevill

0

Сводный стол доставит вам довольно близко. С макетом старого стиля («Показать в табличной форме») вы можете установить A, C, D, F, G, H в виде строк, а затем суммировать K и L.

Затем скопируйте значения папок, и вы У вас есть скелет: вам нужно будет дублировать значения в пустые пространства под ними, чтобы заполнить его (что может быть причиной боли в руке или, по крайней мере, более легким подъемом в VBA).

0

Создать ключ из A & C D & & F G & & H, сортировать по ней и субтотальная (сумма) К & л для каждого изменения в ключе.