Страницы: 1 2 3 След.
RSS
Собрать информации из 3-х книг в 1 книгу
 
Здравствуйте,
Мне надо собрать информации из 3-х книг  (2.XLSX, 3.XLSX, 9.XLSX) в 1 книгу (BUX.XLSX),
Для этого есть уникальное поле (SN) в каждом книге,
Я могу это делать с помощи ВПР, но мне надо это делать с помощи макроса или ВБА,
Помогите пожалуйста, как это делать?

Файлы удалены: превышение допустимого размера вложения [МОДЕРАТОР]
 
Цитата
Elmira написал: Для этого есть уникальное поле (SN) в каждом книге,
гдеж оно уникальное? И гдеж в каждой?
Пока непонятно что и как делать - потому что неясно что именно нужно сделать.
 
Уникальное поле SN.
В книге 3.XLSX - столбец B
В книге 7.XLSX - столбец H
В книге 9.XLSX - столбец F
В книге BUX.XLSX - столбец D
 
Есть 3 книга- 3.XLSX,  7.XLSX, 9.XLSX
Их этих книг надо собрать такая книга как BUX.XLSX.
BUX.XLSX показано информацию с какой книгу и с какой столбец собрать
 
Цитата
Elmira написал: В книге BUX.XLSX - столбец D
пустой.
Вообще конечно столбец SN я вижу - вот только уникальных там маловато, почти все повторяются, и многие не по два раза.
Вот например чудесная серия:
6400002311,0
6400002311,0
6400002351,0
6400002350,0
6400002350,000
6400002351,0
64000023610
64000023620
6400002552,0
6400002551,0
6400002553,0
6400002552,0
6400002552,0
6400002552,0
64000026020
64000026030
64000026030
Изменено: Hugo - 04.05.2016 23:13:16
 
Нашел в интернете вот это, думала используя это могу что-то делать, но по моему это для одного книг
Код
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Dim sCon As String, sSql As String
Set cn = New ADODB.Connection:  Set rs = New ADODB.Recordset
With ThisWorkbook
    'конструкция строки подключения к сохраненному файлу Excel
    sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + .Path _
    + "\" + .Name + ";Extended Properties=""Excel 8.0;HDR=Yes"";"
    'конструкция запроса на выборку с группировкой
    sSql = "SELECT t1.f0, t1.f1, t1.f2, t1.f3, count(t1.f0) as g4  FROM "
    sSql = sSql + "[Лист1$A9:R400] as T1 WHERE f5 Is Null and f0 Is not Null "
    sSql = sSql + " GROUP BY f0, f1, f2, f3 "
 
Hugo, bux.xlsx  c начало пустой, Здесь должен собратся все информация.
Насчет уникальности я не права, хотела сказать что это - ключевого поля, которое все информация собираются с помощи этого поля
Изменено: Elmira - 04.05.2016 21:02:17
 
Так покажите что должно собраться ну например по 640000255 и 640000260
 
Вопрос здесь не в макросе, а в том как связывать данные из этих книг? Уникальных ключей нет, количество строк во всех 3-х книгах разное.
Покажите на примере одной строки как требуется это сделать
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
Elmira написал: Нашел..думала...
There is no knowledge that is not power
 
Цитата
TheBestOfTheBest написал: как требуется это сделать
Изобразите клиенту декартово произведение по совпадению SN во всех трёх файлах  :D  Дальше уже ТС обдумает и сообщит, что нужно поправить.
 
Цитата
TheBestOfTheBest написал: Покажите на примере одной строки как требуется это сделать
Я сделала это для 640000088
Изменено: Elmira - 04.05.2016 23:14:07
 
Ну я то просил не сделать, а показать результат...
Неизлечимых болезней нет, есть неизлечимые люди.
 
С 640000088 вряд ли толк будет... Да и я тоже просил показать, но на других номерах
 
Цитата
TheBestOfTheBest написал:
как связывать данные из этих книг? Уникальных ключей нет, количество строк во всех 3-х книгах разное.
Данные связывается с помоши поле  SN,
Количество строк в разных книгах может быть разные.
 
Результат должен быт такой
 
Цитата
Hugo написал:
С 640000088 вряд ли толк будет... Да и я тоже просил показать, но на других номерах
Дело в том что, эти файлы отрывок (части)  больших файлов, по этому не которые записи может быт удалено.

Я для 640000088 сделала потому что этот запись есть в 3-х книг.  
Изменено: Elmira - 04.05.2016 21:42:25
 
Ну в общем понятно...
 
Цитата
Elmira написал:
Данные связывается с помоши поле  SN,
Количество строк в разных книгах может быть разные.
Такой подход однозначно не свяжет данные разных книг, связи будут неоднозначные. Так например, для первого 640000088 из "9" подходит и строка 3 и строка 2 из "3". Как программа поймет какую строку подставлять?
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал: Как программа поймет какую строку подставлять?
Надо будет подставлять обе строку из "9".
Но, может быт и такое: для какой-то значение может подходить 3 строка  из "9" , 5 строка  из "3" и  1 строка  из "7".

Или наоборот для какой-то значение может подходить 1 строка  из "9" , 4 строка  из "3" и  6 строка  из "7".
Надо будет подставлять все эти записи, т,е, для 1-го случае должны в BUX.XLSX 5 строка, для 2-го случае должны в BUX.XLSX 7 строка
Изменено: Elmira - 04.05.2016 23:14:42
 
Цитата
Elmira написал: Надо будет подставлять обе строку из "9"
Вы плохо понимаете по русски?
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал: Вы плохо понимаете по русски?
Да.
 
Для строки 2 из "9" подходят строки 2 и 3 из "3". Это верно?
Для строки 3 из "9" подходят строки 2 и 3 из "3". Это верно?

Если все это верно,то у нас получаются задвоение строк - вместо 2-х строк программа определит 4 строки.
Неизлечимых болезней нет, есть неизлечимые люди.
 
Вариант на Power Query. Так как размер не влазит на форум, то положил архив здесь. Архив распаковать в папку c:\Path
Открыв файл bux на листе "Результат" правая клавиша мыши на таблицы - выбрать Обновить.
Успехов.
 
Для 640000088 из "9" подходят  2 строка,  из "3"   подходят  тоже 2 строка, из "7"   подходят  1 строка.
Значит BUX.XLSX для  640000088 будет всего 2 строка.
 
Андрей VG, спасибо, но при нажатие Обновить  такая ошибка получается: "Сбой инициализация источника данных"
 
Вариант макроса на словарях с массивами - дольше всего происходит сортировка, но без неё получается каша, хотя и работает:
Код
Option Explicit

Sub tt()
    Dim a(), b, bb, arr, el, oDict As Object, oDictT As Object, i As Long, t As String, kk

    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False

        arr = Array(3, 7, 9)

        Set oDict = CreateObject("Scripting.Dictionary")
        oDict.comparemode = vbTextCompare

        For Each el In arr
            With GetObject(ThisWorkbook.Path & "\" & el & ".xlsx")
                a = .Sheets(1).[a1].CurrentRegion.Value
                .Close 0
            End With

            Select Case el
                Case 3
                    Set oDictT = CreateObject("Scripting.Dictionary"): oDictT.comparemode = 1
                    For i = 2 To UBound(a)
                        If Len(a(i, 2)) Then
                            oDictT.Item(a(i, 2)) = oDictT.Item(a(i, 2)) + 1
                            t = a(i, 2) & "|" & oDictT.Item(a(i, 2))
                            If Not oDict.exists(t) Then
                                ReDim b(1 To 15)
                                b(2) = a(i, 2)
                                b(7) = a(i, 7)
                                b(8) = a(i, 10)
                                b(9) = a(i, 9)
                                b(10) = a(i, 16)
                                b(12) = a(i, 17)
                                oDict.Item(t) = b
                            Else
                                bb = oDict.Item(t)
                                bb(2) = a(i, 2)
                                bb(7) = a(i, 7)
                                bb(8) = a(i, 10)
                                bb(9) = a(i, 9)
                                bb(10) = a(i, 16)
                                bb(12) = a(i, 17)
                                oDict.Item(t) = bb
                            End If
                        End If
                    Next

                Case 7
                    Set oDictT = CreateObject("Scripting.Dictionary"): oDictT.comparemode = 1
                    For i = 2 To UBound(a)
                        If Len(a(i, 8)) Then
                            oDictT.Item(a(i, 8)) = oDictT.Item(a(i, 8)) + 1
                            t = a(i, 8) & "|" & oDictT.Item(a(i, 8))
                            If Not oDict.exists(t) Then
                                ReDim b(1 To 15)
                                b(2) = a(i, 8)
                                b(13) = a(i, 10)
                                oDict.Item(t) = b
                            Else
                                bb = oDict.Item(t)
                                bb(2) = a(i, 8)
                                bb(13) = a(i, 10)
                                oDict.Item(t) = bb
                            End If
                        End If
                    Next

                Case 9
                    Set oDictT = CreateObject("Scripting.Dictionary"): oDictT.comparemode = 1
                    For i = 2 To UBound(a)
                        If Len(a(i, 6)) Then
                            oDictT.Item(a(i, 6)) = oDictT.Item(a(i, 6)) + 1
                            t = a(i, 6) & "|" & oDictT.Item(a(i, 6))
                            If Not oDict.exists(t) Then
                                ReDim b(1 To 15)
                                b(1) = a(i, 5)
                                b(2) = a(i, 6)
                                b(3) = a(i, 13)
                                b(4) = a(i, 15)
                                b(5) = a(i, 11)
                                b(15) = a(i, 22)
                                oDict.Item(t) = b
                            Else
                                bb = oDict.Item(t)
                                bb(1) = a(i, 5)
                                bb(2) = a(i, 6)
                                bb(3) = a(i, 13)
                                bb(4) = a(i, 15)
                                bb(5) = a(i, 11)
                                bb(15) = a(i, 22)
                                oDict.Item(t) = bb
                            End If
                        End If
                    Next
            End Select

        Next

        With ThisWorkbook.Sheets(1)
            i = 4
            bb = oDict.keys
            SortArray bb
            For Each kk In bb
                i = i + 1
                b = oDict.Item(kk)
                With Cells(i, 3).Resize(, UBound(b))
                    .Columns(1).NumberFormat = "@"
                    .Value = b
                End With
            Next
            '.Cells.EntireColumn.AutoFit
        End With


        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
End Sub

Private Sub SortArray(ByRef a As Variant)
    Dim i As Long, j As Long
    Dim t As Variant

    'standard bubble sort loops
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then    'change to < for descending order
                t = a(i)
                a(i) = a(j)
                a(j) = t
            End If
        Next j
    Next i
End Sub

P.S. У меня на 2010 Power Query не работает...
Изменено: Hugo - 04.05.2016 22:59:48
 
Hugo, этот макрос в BUX.xlsx надо записать?
 
Цитата
Elmira написал: этот макрос в BUX.xlsx надо записать?
Да, именно в него, ну или в тот файл, куда будете тянуть данные, и он должен быть в одном каталоге с
3.XLSX
7.XLSX
9.XLSX
 
Раз сбой, то у вас не установлен Power Query - надстройка с Excel 2010 pro plus sp1 и 2013, а 2016 часть Excel
Страницы: 1 2 3 След.
Наверх