Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 20
1

Как с одного столбца выдергнуть группы данных и снова сгрупировать в два столбца по порядку

28.02.2013, 03:26. Показов 3255. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, профессионалы!!!

В данном направлении я почти 0 на палочке, но всё-же мне необходимо это сделать.
Суть в том, что ежедневно я получаю такую таблицу (количество данных в ней меняется ежедневно) из которой составляется отчет, хотелось бы автоматизировать данный процесс, так как количество строк может достигать и 15000. Что именно надо сделать словами даже и не знаю как объяснить, покажу на примере….
Заранее очень благодарен!
Вложения
Тип файла: xls Excel_2010.xls (37.5 Кб, 23 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 03:26
Ответы с готовыми решениями:

Как из одного столбца вывести значения в два столбца
Не могу никак разобраться, помогите пожалуйста.. Есть две таблицы: Team(id, name, captain,...

Как сделать выбор данных одного столбца из нескольких таблиц, если имя этого столбца везде совпадает?
Подскажите, как сделать выбор данных одного столбца из нескольких таблиц, если имя этого столбца...

Вывод результатов из одной таблицы и одного столбца в два разных столбца
Ребят помогите, измучалась совсем, не знаю как решить. Есть таблица Таблица t2 Id Pid ...

Разбивка данных из одного столбца в два
Добрый день Имеются два потока данных в одном столбце, время и показания прибора. Сохраняются...

23
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
28.03.2013, 17:05 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Cyxapik007 Посмотреть сообщение
список фамилий изменный в диапазоне D1 : D20. На данный момент их 8...

ругается на
Visual Basic
1
w.Name = Split(v)(0)
Диапазон D1 : D20 должен быть заполнен полностью. Если это не так, то надо включить проверку на пустые значения, т.е. вместо:

Visual Basic
1
2
3
For Each rn In w.Range("D1:D20")
    dict.Item(rn.Value) = 0
Next rn
писать:

Visual Basic
1
2
3
For Each rn In w.Range("D1:D20")
    If Not IsEmpty(rn) Then dict.Item(rn.Value) = 0
Next rn
Цитата Сообщение от Cyxapik007 Посмотреть сообщение
а ещё всё удаляется на листах до ячейки А410 куда вставляется пофамильно(((
В посте #17 строку 60

Visual Basic
1
2
3
If f Then
    w.Cells.Clear
Else
нужно заменить в соответствии со структурой вашего документа.
Скорее всего так:

Visual Basic
1
2
3
If f Then
    w.Range("A410:G10000").Clear
Else
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 20
02.04.2013, 08:55  [ТС] 22
Цитата Сообщение от Aksima Посмотреть сообщение
Диапазон D1 : D20 должен быть заполнен полностью. Если это не так, то надо включить проверку на пустые значения, т.е. вместо:
Код Visual Basic
1
2
3
For Each rn In
там не пустые ячейки, а формулы

Добавлено через 21 час 31 минуту
Aksima, Спасибо, всё работает как надо))) есть огромный минус(((( расчет длился около получаса и это было только половина данных, боюсь проверять со 100% загрузкой....

Добавлено через 5 часов 46 минут
Aksima, А возможно исключить блок размножения ФИО, а всё остальное оставить как есть? А то этот блок очень много времени отнимает?
Заранее благодарю за любую помощь!!!
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
03.04.2013, 16:48 23
Здравствуйте, Cyxapik007,
Переписал код практически полностью, теперь должно работать чуточку быстрее.

Кликните здесь для просмотра всего текста
Visual Basic
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
'Макрос получает данные с определенного листа и производит их
'перегруппировку по листам рабочей книги таким образом, чтобы
'один лист соответствовал одному ФИО из списка треубемых.
Sub PeregruppirovkaV3()
 
'________________________________________________________________
'______________________Параметры окружения_______________________
 
Const DATASHEET = "Данные"  'Лист с данными.
Const DESTRANGE = "A410"    'Верхняя левая ячейка диапазона вывода
                            'обработанных данных.
Const LISTSHEET = "Список"  'Лист со списком требуемых ФИО.
Const LISTRANGE = "D1:D20"  'Диапазон, в котором находится список
                            'требуемых ФИО.
'________________________________________________________________
'________________________________________________________________
 
    Dim wsData As Worksheet, wsList As Worksheet, ws As Worksheet
    Dim rn As Range, coll As Collection
    Dim dict As Object, dsh As Object
    Dim arrData() As Variant, arrList() As Variant
    Dim arr() As Variant, dkeys() As Variant, narr() As Long
    Dim i As Long, j As Long, n As Long, m As Long
    Dim k As Long, u As Long, w As Long, l As Long, q As Long
    Dim v As Variant, s As String, z As String, f As Boolean
    'Получаем ссылки на листы с данными и списком.
    On Error GoTo ErrNoData
        s = DATASHEET
        Set wsData = Sheets(DATASHEET)
        s = LISTSHEET
        Set wsList = Sheets(LISTSHEET)
    On Error GoTo 0
    'Получаем массив данных и список требуемых ФИО.
    arrData = wsData.UsedRange
    arrList = wsList.Range(LISTRANGE)
    n = UBound(arrData)
    m = UBound(arrData, 2)
    ReDim arr(m - 1) As Variant
    'Получаем ФИО из списка.
    Set dict = CreateObject("Scripting.Dictionary")
    For Each v In arrList
        s = v
        If IsFIO(s) And Not dict.Exists(s) Then
            Set coll = New Collection
            dict.Add s, coll
        End If
    Next v
    k = dict.Count
    If k Then 'Если список не пуст, то...
        'Для каждого ФИО находим соответствующие данные.
        While i < n
            i = i + 1
            s = arrData(i, 1)
            If f Then
                If IsFIO(s) Then
                    f = False
                Else
                    For j = 1 To m
                        arr(j - 1) = arrData(i, j)
                    Next j
                    coll.Add arr
                    ReDim arr(m - 1) As Variant
                End If
            End If
            If Not f Then
                If dict.Exists(s) Then
                    f = True
                    For j = 2 To m
                        arr(j - 1) = arrData(i, j)
                    Next j
                    Set coll = dict(s)
                    coll.Add arr
                    ReDim arr(m - 1) As Variant
                End If
            End If
        Wend
        'Создаем сокращенные ФИО для названий листов.
        Set dsh = CreateObject("Scripting.Dictionary")
        If k > 1 Then
            ReDim arr(k - 1) As Variant
            ReDim narr(k - 1) As Long
            For i = 0 To k - 1
                dkeys = dict.Keys
                arr(i) = Split(dkeys(i))
                u = UBound(arr(i))
                If u > w Then w = u
            Next i
            For i = 0 To w - 1
                For j = 0 To k - 1
                    s = arr(j)(0)
                    If i > 0 Then
                        On Error Resume Next
                            For l = 1 To i
                                s = s & "_" & Left(arr(j)(l), 1)
                            Next l
                        On Error GoTo 0
                    End If
                    For q = 0 To k - 1
                        If q <> j Then
                            z = arr(q)(0)
                            If i > 0 Then
                                On Error Resume Next
                                    For l = 1 To i
                                        z = z & "_" & Left(arr(q)(l), 1)
                                    Next l
                                On Error GoTo 0
                            End If
                            If s = z Then
                                narr(j) = i + 1
                                Exit For
                            End If
                        End If
                    Next q
                Next j
            Next i
            For i = 0 To k - 1
                s = arr(i)(0)
                If narr(i) > 0 Then
                    On Error Resume Next
                        For l = 1 To narr(i)
                            s = s & "_" & Left(arr(i)(l), 1)
                        Next l
                    On Error GoTo 0
                End If
                dkeys = dict.Keys
                dsh.Add dkeys(i), s
            Next i
        Else
            dkeys = dict.Keys
            s = dkeys(0)
            dsh.Add s, Split(s)(0)
        End If
    End If
    'Получаем ссылку на лист выходных данных или создаем его.
    'Выгружаем данные из коллекции в массив, а затем на лист.
    For Each v In dict
        If dict(v).Count > 0 Then
            f = True
            s = dsh(v)
            On Error GoTo ErrNoOutputSheet
                Set ws = Sheets(s)
            On Error GoTo 0
            Set rn = ws.Range(DESTRANGE)
            If f Then
                rn.Resize(ws.Rows.Count - rn.Row + 1, m + 1).ClearContents
            Else
                Columns("A:A").ColumnWidth = 33.29
                Columns("B:B").ColumnWidth = 13.43
                Columns("B:B").NumberFormat = "m/d/yyyy"
                Columns("B:B").HorizontalAlignment = xlLeft
                Columns("C:C").ColumnWidth = 17.86
                Columns("D:D").ColumnWidth = 17.86
                Columns("F:F").NumberFormat = "0.0\%"
                Columns("G:G").NumberFormat = "0.0\%"
            End If
            Erase arr
            n = dict(v).Count
            ReDim arr(n - 1, m - 1) As Variant
            For i = 0 To n - 1
                For j = 0 To m - 1
                    arr(i, j) = dict(v)(i + 1)(j)
                Next j
            Next i
            rn.Resize(n) = v
            rn.Offset(, 1).Resize(n, m) = arr
        End If
    Next v
    Exit Sub
 
ErrNoData:
    MsgBox "Лист " & s & " не найден.", vbExclamation, "Ошибка"
    Exit Sub
 
ErrNoOutputSheet:
    f = False
    With Sheets
        Set ws = .Add(After:=.Item(.Count))
    End With
    ws.Name = s
    Resume Next
 
End Sub
 
'Функция проверяет входную строку s и возвращает True, если
'входная строка соответствует шаблону ФИО.
Function IsFIO(ByVal s As String) As Boolean
    With CreateObject("VBScript.RegExp")
        .Pattern = "^[А-ЯЁ][а-яё]*( [А-ЯЁ][а-яё]*)+$"
        IsFIO = .Test(s)
    End With
End Function


С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 20
04.04.2013, 02:10  [ТС] 24
Aksima, Огромнейшее тебе СПАСИБО!!!
2 сек и всё готово))))
Тему закрываем!
0
04.04.2013, 02:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 02:10
Помогаю со студенческими работами здесь

В каждой из матриц: A (5 строк, 4 столбца) и В (4 строки, 3 столбца) поменять местами два столбца
В каждой из матриц: A (5 строк, 4 столбца) и В (4 строки, 3 столбца) поменять местами два столбца:...

Сравнить два столбца (не по порядку) и разные строчки вытащить
Есть два столбца с товаром (около 4000 позиций в каждом), они отличаются, и много где. Т.е. я не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru