Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 16:17   #1
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Сообщение Поиск и выгрузка данных из массива

Приветы Уважаемые форумчане, в очередной раз прошу вашей помощи, в небольшом изменении функции EducatedFool (Игорь).
Суть вопроса состаи в следующем:
1) чтобы поиск производится с конца массива (не с первого значения и до последнего, а с последнего и до первого);
2) если значение столбца А не равно ячейки [I1], сразу переходить к следующему значению в столбце А. Вообщем я пытался переделать код, так чтобы показать уникальные значения столбца Б и С.
И еще один вопрос, как в коде добавить чтобы вытягивало значения не только с Б и С столбцов, а еще допустим с нескольких столбцов?
И как я понял вытягивается первое найденное значения в массиве?
Спасибо за внимание и ответы.
Вложения
Тип файла: rar Sample__21-08-2011__17-14-21 обратная.rar (272.8 Кб, 8 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.04.2012, 10:57   #2
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Радость

Помогите пожалуйста довести код до конца.
Осталось только производить поиск с конца.

Код:
Function JoinedArray(ByVal arr As Variant, ByVal ComparedColumn As Long, _
                     Optional ByVal ColumnsForSum As String, Optional ByVal ColumnsForJoin As String, _
                     Optional ByVal JoinSeparator As String = ", ") As Variant
    ' осуществляет объединение строк в массиве
    ' получает в качестве параметров исходный массив, и номер столбца ComparedColumn,
    ' по которому осуществляется сравнение строк
    ' ---------------------------------------------
    ' для совпадающих строк:
    ' - суммируются значения в столбцах, перечисленных через запятую в переменной ColumnsForSum
    ' - соединяются (через разделитель JoinSeparator) значения в столбцах,
    '   перечисленных через запятую в переменной ColumnsForJoin
    ' ---------------------------------------------
    ' функция возвращает новый массив (возможно, с меньшей размерностью по вертикали)


    On Error Resume Next
    If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function
    If ComparedColumn > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function
    If ComparedColumn < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function

    For i = LBound(arr, 1) To UBound(arr, 1) 'если я делаю так  For i = UBound(arr, 1) To LBound(arr, 1) Step-1, то начинает считать с конца, но где еще нужно поменять?
        If Cells(1, 9) = Cells(i, 3) Then
        If arr(i, ComparedColumn) <> "" Then
            For j = i + 1 To UBound(arr, 1)
                If arr(j, ComparedColumn) = arr(i, ComparedColumn) Then
                    ' для последующего удаления этой строки из массива
                    arr(j, ComparedColumn) = Empty    ' затираем значение в сравниваемом столбце

                    ' суммируем строки - результат в верхнюю строку
                    For Each col In Split(ColumnsForSum, ",")
                        nCol = Val(col)
                        If nCol > 0 And nCol <= UBound(arr, 2) And nCol <> ComparedColumn Then
                            arr(i, nCol) = Val(Replace(arr(i, nCol), ",", ".")) _
                                           + Val(Replace(arr(j, nCol), ",", "."))
                        End If
                    Next

                    ' сцепляем строки - результат в верхнюю строку
                    For Each col In Split(ColumnsForJoin, ",")
                        nCol = Val(col)
                        If nCol > 0 And nCol <= UBound(arr, 2) And nCol <> ComparedColumn Then
                            If Len(Trim(arr(j, nCol))) > 0 Then
                                arr(i, nCol) = Trim(arr(i, nCol)) & JoinSeparator & Trim(arr(j, nCol))
                            End If
                        End If
                    Next
                End If
            Next j
        End If
        End If
    Next i

    ' удаляем ненужные (пустые) строки
    Dim iCount As Long    ' кол-во непустых строк
    For i = LBound(arr) To UBound(arr)
        If Cells(1, 9) = Cells(i, 3) Then
        iCount = iCount - (arr(i, ComparedColumn) <> "")
        End If
    Next i

    ' формируем новый массив
    ReDim narr(LBound(arr, 1) To iCount + LBound(arr, 1) - 1, LBound(arr, 2) To UBound(arr, 2))

    iCount = LBound(narr)    ' счётчик записей
    For i = LBound(arr, 1) To UBound(arr, 1)
    If Cells(1, 9) = Cells(i, 3) Then
        If arr(i, ComparedColumn) <> "" Then
            For j = LBound(arr, 2) To UBound(arr, 2)
                narr(iCount, j) = arr(i, j)
            Next j
            iCount = iCount + 1
        End If
    End If
    Next i

    JoinedArray = narr
End Function
Вот новый файлик:
Вложения
Тип файла: rar Sample__21-08-2011__17-14-21 обратная111.rar (75.5 Кб, 6 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.04.2012, 11:19   #3
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

вроде получилось, вы не могли бы посмотреть все ли я правильно сделал?
Спасибо

Код:
Sub ПримерИспользования()
    ' отключаем обновление экрана
    Application.ScreenUpdating = False
    ' считываем массив с листа - в него попадут все заполненные строки
    Массив = Range([A1], Range("A" & Rows.Count).End(xlUp)).Resize(, 4).Value

    ' объединяем уникальные
    arr = JoinedArray(Массив, 1)

    Range("e:h").ClearContents    ' очистка содержимого столбцов E F G
    ' заносим массив на лист, начиная с ячейки e1
    Range("e1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr

    Range("e:h").EntireColumn.AutoFit
End Sub

Sub Очистка()
    Range("e:h").ClearContents
End Sub

Function JoinedArray(ByVal arr As Variant, ByVal ComparedColumn As Long, _
                     Optional ByVal ColumnsForSum As String, Optional ByVal ColumnsForJoin As String, _
                     Optional ByVal JoinSeparator As String = ", ") As Variant
    ' осуществляет объединение строк в массиве
    ' получает в качестве параметров исходный массив, и номер столбца ComparedColumn,
    ' по которому осуществляется сравнение строк
    ' ---------------------------------------------
    ' для совпадающих строк:
    ' - суммируются значения в столбцах, перечисленных через запятую в переменной ColumnsForSum
    ' - соединяются (через разделитель JoinSeparator) значения в столбцах,
    '   перечисленных через запятую в переменной ColumnsForJoin
    ' ---------------------------------------------
    ' функция возвращает новый массив (возможно, с меньшей размерностью по вертикали)


    On Error Resume Next
    If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function
    If ComparedColumn > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function
    If ComparedColumn < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function

    For i = UBound(arr, 1) To LBound(arr, 1) Step -1
        If Cells(1, 9) = Cells(i, 3) Then
        If arr(i, ComparedColumn) <> "" Then
            For j = i - 1 To LBound(arr, 1) Step -1
                If arr(j, ComparedColumn) = arr(i, ComparedColumn) Then
                    ' для последующего удаления этой строки из массива
                    arr(j, ComparedColumn) = Empty    ' затираем значение в сравниваемом столбце

                    ' суммируем строки - результат в верхнюю строку
                    For Each col In Split(ColumnsForSum, ",")
                        nCol = Val(col)
                        If nCol > 0 And nCol <= UBound(arr, 2) And nCol <> ComparedColumn Then
                            arr(i, nCol) = Val(Replace(arr(i, nCol), ",", ".")) _
                                           + Val(Replace(arr(j, nCol), ",", "."))
                        End If
                    Next

                    ' сцепляем строки - результат в верхнюю строку
                    For Each col In Split(ColumnsForJoin, ",")
                        nCol = Val(col)
                        If nCol > 0 And nCol <= UBound(arr, 2) And nCol <> ComparedColumn Then
                            If Len(Trim(arr(j, nCol))) > 0 Then
                                arr(i, nCol) = Trim(arr(i, nCol)) & JoinSeparator & Trim(arr(j, nCol))
                            End If
                        End If
                    Next
                End If
            Next j
        End If
        End If
    Next i

    ' удаляем ненужные (пустые) строки
    Dim iCount As Long    ' кол-во непустых строк
    For i = UBound(arr) To LBound(arr) Step -1
        'If Cells(1, 9) = Cells(i, 3) Then
        iCount = iCount - (arr(i, ComparedColumn) <> "")
        'End If
    Next i

    ' формируем новый массив
    ReDim narr(LBound(arr, 1) To iCount + LBound(arr, 1) - 1, LBound(arr, 2) To UBound(arr, 2))

    iCount = LBound(narr)    ' счётчик записей
    For i = UBound(arr, 1) To LBound(arr, 1) Step -1
    If Cells(1, 9) = Cells(i, 3) Then
        If arr(i, ComparedColumn) <> "" Then
            For j = UBound(arr, 2) To LBound(arr, 2) Step -1
                narr(iCount, j) = arr(i, j)
            Next j
            iCount = iCount + 1
        End If
    End If
    Next i

    JoinedArray = narr
End Function
Вложения
Тип файла: rar Sample__21-08-2011__17-14-21 обратная111.rar (79.4 Кб, 10 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.04.2012, 08:42   #4
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

тему можно закрывать
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выгрузка данных из другой таблицы kuyann Microsoft Office Excel 2 18.12.2011 10:54
Выгрузка данных из БД в Excel Rougez Microsoft Office Excel 3 17.06.2011 13:06
Выгрузка данных из excel in word. noc Microsoft Office Excel 5 22.11.2010 12:48
Value2? Выгрузка данных в Excel Регинка-малинка Общие вопросы Delphi 0 04.10.2010 20:11
Развертывание(выгрузка) базы данных --admin-- SQL, базы данных 0 27.05.2010 21:34