Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / выбор данных из строки / 8 сообщений из 8, страница 1 из 1
07.07.2015, 20:12
    #39001781
Anastassie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
Добрый день. Подскажите, пожалуйста , как можно решить следующую задачу. Есть таблица, в которой перечень подчиненных и их начальников, таблица на несколько тысяч записей. Пример исходника во вложении. Необходимо выбрать 3 подчиненных с наибольшим количеством отработанных часов, и записать их коды и фамилии в одну ячейку через любой разделитель, например , ";". Проблема состоит не только в том, что у одного руководителя 1 подчиненный , а у другого 100, но и в том, что коды сотрудников разбиты на два столбца тем кому до 20 лет и больше 20 лет . Плюс ко всему идет объединение ячеек, я вообще не знаю с какой стороны к этой таблице подойти, поможет здесь Basic или нет, или может вообще можно обойтись формулами массивов. Пожалуйста, подскажите, как делать, или хотя бы где искать, может ссылки какие-нибудь есть ??? Спасибо, всем откликнувшимся
...
Рейтинг: 0 / 0
07.07.2015, 20:43
    #39001797
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
AnastassieПример исходника во вложении
...
Рейтинг: 0 / 0
08.07.2015, 09:05
    #39001992
Anastassie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
Странно, почему-то файл не подтянулся
...
Рейтинг: 0 / 0
08.07.2015, 11:00
    #39002110
hclubmk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
Не претендую на оптимальное решение, но 1-е: оформить таблицу в массив, и привести его к требуемому виду, как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Dim EmployeesArray As Variant

Sub LoadArray()
Const topCellIndex = 2, leftCellIndex = 1, bottomCellIndex = 14, rightCellIndex = 7
Dim i As Long, honchoCode As String, honchoName As String, honchoHours As Double
    EmployeesArray = Application.Workbooks(1).Worksheets(1).Range(Application.Workbooks(1).Worksheets(1). _
                    Cells(topCellIndex, leftCellIndex), Application.Workbooks(1).Worksheets(1).Cells(bottomCellIndex, rightCellIndex))
    
    honchoCode = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2))
    honchoName = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2) + 1)
    honchoHours = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2) + 2)
    For i = LBound(EmployeesArray, 1) + 1 To UBound(EmployeesArray, 1)
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2))) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2)) = honchoCode
        Else
            honchoCode = EmployeesArray(i, LBound(EmployeesArray, 2))
        End If
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2) + 1)) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2) + 1) = honchoName
        Else
            honchoName = EmployeesArray(i, LBound(EmployeesArray, 2) + 1)
        End If
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2) + 2)) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2) + 2) = honchoHours
        Else
            honchoHours = EmployeesArray(i, LBound(EmployeesArray, 2) + 2)
        End If
    Next
End Sub

На выходе получим двумерный массив в привычном виде (с заполненными элементами по объединенным ячейкам руководителей).
Далее - сортировка по руководителю (коду руководителя) и количеству отработанных часов служащего.
Следующих проход - выборка "победителей соревнования" и заполнение итоговой таблицы.
...
Рейтинг: 0 / 0
03.08.2015, 12:43
    #39021620
Anastassie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
hclubmk, подскажите пожалуйста, а как вывести этот массив на том же листе.
...
Рейтинг: 0 / 0
03.08.2015, 20:28
    #39022099
Anastassie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
hclubmkНе претендую на оптимальное решение, но 1-е: оформить таблицу в массив, и привести его к требуемому виду, как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Dim EmployeesArray As Variant

Sub LoadArray()
Const topCellIndex = 2, leftCellIndex = 1, bottomCellIndex = 14, rightCellIndex = 7
Dim i As Long, honchoCode As String, honchoName As String, honchoHours As Double
    EmployeesArray = Application.Workbooks(1).Worksheets(1).Range(Application.Workbooks(1).Worksheets(1). _
                    Cells(topCellIndex, leftCellIndex), Application.Workbooks(1).Worksheets(1).Cells(bottomCellIndex, rightCellIndex))
    
    honchoCode = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2))
    honchoName = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2) + 1)
    honchoHours = EmployeesArray(LBound(EmployeesArray, 1), LBound(EmployeesArray, 2) + 2)
    For i = LBound(EmployeesArray, 1) + 1 To UBound(EmployeesArray, 1)
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2))) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2)) = honchoCode
        Else
            honchoCode = EmployeesArray(i, LBound(EmployeesArray, 2))
        End If
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2) + 1)) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2) + 1) = honchoName
        Else
            honchoName = EmployeesArray(i, LBound(EmployeesArray, 2) + 1)
        End If
        If IsEmpty(EmployeesArray(i, LBound(EmployeesArray, 2) + 2)) = True Then
            EmployeesArray(i, LBound(EmployeesArray, 2) + 2) = honchoHours
        Else
            honchoHours = EmployeesArray(i, LBound(EmployeesArray, 2) + 2)
        End If
    Next
End Sub

На выходе получим двумерный массив в привычном виде (с заполненными элементами по объединенным ячейкам руководителей).
Далее - сортировка по руководителю (коду руководителя) и количеству отработанных часов служащего.
Следующих проход - выборка "победителей соревнования" и заполнение итоговой таблицы.

Не могу разобраться с выводом элементов полученного двухмерного массива(( Я понимаю, что для большинства это просто мелочи, но я никак не могу себя к нему причислить , помогите, пожалуйста. Все на что хватила моего скудного мозга это вот

Range(Cells(1, 20), Cells(15, 21)).Select -- выбор области для вывода элементов
Selection.Clear

For i = LBound(EmployeesArray, 1) + 1 To UBound(EmployeesArray, 1)
For J = LBound(EmployeesArray, 1) + 1 To UBound(EmployeesArray, 1)
A(i, J) = LBound(EmployeesArray, 1)
Next J
Next i


еще раз очень прошу помощи , я уже в отчаянии
...
Рейтинг: 0 / 0
03.08.2015, 20:30
    #39022102
hclubmk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
Как-то так:
Код: vbnet
1.
2.
Const WriteToStartCell = "I20"
    Range(WriteToStartCell).Resize(UBound(EmployeesArray, 1), UBound(EmployeesArray, 2)) = EmployeesArray
...
Рейтинг: 0 / 0
04.08.2015, 12:57
    #39022512
Anastassie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор данных из строки
hclubmk, СПАСИБО , Вам большое!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / выбор данных из строки / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]