Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Объединение большого количества данных в одну таблицу
 
Доброго вечера. Помогите разобраться с данными:нужно из столбца Е(отсортированы, но не подряд) найти соответствующее значение в А (номера по порядку). и в столбце В вписать фамилию. Если такого номера нет оставить место свободным. Спасибо.
 
Дам действительно больше 700000 строк? Тогда SQL однозначно.

Файл должен находится в папке C:\1\
Изменено: TheBestOfTheBest - 8 Апр 2015 18:08:18
Неизлечимых болезней нет, есть неизлечимые люди.
 
Такое решение могу предложить только в VBA. Количество строк регулируйте. Чем больше строк - тем дольше выполняется макрос. Порядка нескольких минут.
Код
Sub ob()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets(1)

Dim i As Long
Dim j As Long
i = 0
j = 0
Do While i <> 719999  'количество строк
    Do While sh.Cells(2 + j, 5) <> 2000  'количество строк искомых
        If sh.Cells(2 + i, 1) = sh.Cells(2 + j, 5) Then
        sh.Cells(2 + j, 6) = sh.Cells(2 + i, 2)
        End If
    j = j + 1
    Loop
i = i + 1
j = 0
Loop
End Su
Изменено: ivanna - 8 Апр 2015 18:47:45
 
Не понятно, чем не устраивает ВПР:
Код
=ЕСЛИОШИБКА(ВПР(A1;$E$1:$F$2000;2;0);"")

Да и строк там вроде бы не 70.000, а около 10.000 (с 710.000 по 719.999) - разница есть.


Далее, если номера в столбце А действительно строго по порядку, с 710.000 по 719.999, то макрос можно сделать очень коротким, т.к. нужный нам номер строки, в которую писать фамилию, можно вычислить через сам номер
Код
Sub place_num()
Dim srcRng(), trgArr()
Dim i&, LR&, j&
LR = Cells(Rows.Count, 1).End(xlUp).Row
ReDim trgArr(1 to LR, 1 to 1) 
' или ReDim trgArr(1 to 10000, 1 to 1) 
' где 10000 - это количество номеров в столбце А, идущих строго по порядку
srcRng = Range("E1:F2000").Value ' указать диапазон, где номер+фамилия
j = Cells(1, 1).Value ' стартовый номер в столбце А
For i = 1 To Ubound(srcRng)
    trgArr(srcRng(i, 1) - j + 1, 1) = srcRng(i, 2)
Next
Application.ScreenUpdating = False
Range("B1").resize(LR,1).Value = trgArr
Application.ScreenUpdating = True
End Sub

на 10.000 строк работает меньше секунды, на 710.000 строк - секунды 2-3

ivanna, такое большое количество строк с их полным перебором лучше делать на массивах, не обращаясь каждый раз к ячейкам в цикле. гораздо экономичнее забрать 1 раз диапазон в массив и искать уже в нем.
В крайнем случае, можно использовать для поиска WorksheetFunction.Match - работает безусловно, быстрее, чем перебор по 1 ячейке).Тем более, что нам нужен номер строки для записи найденного значения.
Изменено: Максим Зеленский - 8 Апр 2015 20:20:40
F1 творит чудеса
 
Коллега, вы уверены что это  11 trgArr(srcRng(i, 1) - j + 1, 1) = srcRng(i, 2)  подтянет к нужному номеру ФИО нужное ФИО?
Неизлечимых болезней нет, есть неизлечимые люди.
 
Словарь тут нужен. Sakh, у Вас не Мак случайно?
Код
Sub tt()
    Dim a(), i&

    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = [e1].CurrentRegion.Value
        For i = 1 To UBound(a): .Item(a(i, 1)) = a(i, 2): Next
        a = Range([a1], Cells(Rows.Count, "A").End(xlUp)).Value
        ReDim b(1 To UBound(a), 1 To 1)
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then b(i, 1) = .Item(a(i, 1))
        Next
        [b1].Resize(i-1) = b
    End With

End Sub
Изменено: Hugo - 8 Апр 2015 21:23:02
 
Массив а используется два раза для разноразмерных диапазонов. Разве ReSize не нужен?

типа
Код
ReDim a(...)
Изменено: TheBestOfTheBest - 8 Апр 2015 21:33:41
Неизлечимых болезней нет, есть неизлечимые люди.
 
Зачем?
 
Цитата
TheBestOfTheBest написал:
Коллега, вы уверены что это  11 trgArr(srcRng(i, 1) - j + 1, 1) = srcRng(i, 2)  подтянет к нужному номеру ФИО нужное ФИО?
Логика такая:
если номера в столбце А идут строго по порядку (1,2,3,4,5... или 710000,710001,710002,710003,....) то, например, номер из второго массива, равный 5 (это srcRng(i, 1) ), находится на 5 позиции просматриваемого массива. Если первый номер просматриваемого массива равен 710000, а искомый - 710010, мы вычитаем 710010-710000+1, получаем 11-ю позицию в просматриваемом массиве, что и искали.

Такая логика, естественно, работает только при выполнении одновременно двух условий: 1) код это число, и 2) коды в просматриваемом массиве расположены по порядку, по возрастанию и без пропусков (условно, +1 в каждой строке).
Так что решение Hugo, конечно, корректнее. Но для конкретного примера автора топика - мое тоже работает ;)
F1 творит чудеса
Страницы: 1
Читают тему (гостей: 1)