Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Simply me
236 / 32 / 6
Регистрация: 05.05.2012
Сообщений: 446
Завершенные тесты: 4
1

Объединить данные двух таблиц

08.10.2019, 19:36. Просмотров 220. Ответов 7
Метки нет (Все метки)

Добрый день! Помогите, пожалуйста. Что-то сильно запуталась в проверках и ветвлениях. Поправьте, пожалуйста, или если несложно, напишите с нуля.

Есть класс. В нем учатся ученики. Может быть несколько тысяч. У каждого есть оценки по разным предметам. Однажды оценки учеников переписали классный руководитель и староста. Но оба переписали не всех учеников и не все предметы. В итоге есть таблицы. В одной статистика, по каким предметам и ученикам есть данные у классного руководителя, в другой - у старосты. Причем какие-то ученики и предметы есть в обоих таблицах, а каких-то может не хватать в одной из таблиц. Как объединить все в одну таблицу? То есть, чтобы там были все ученики и предметы этих учеников, которые хоть раз встречались в одном из файлов и было указано, есть ли данные по этому предмету этого ученика у классного руководителя и у старосты.

Образцы входных и выходного файла во вложении. Жирность и цвет шрифта, заливка и границы ячеек НЕ имеют значения. Во второй строке входных файлов не важно, что, но надо учитывать, что она занята.

Мой код:
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
Private Sub CommandButton1_Click()
Dim File1 'Класс рук
Dim File2 'Староста
n1 = 1100 'не меньше, чем заполнено строк в файле Класс рук
m1 = 1250 'не меньше, чем заполнено строк в файле Староста
n2 = 20 'не меньше, чем заполнено столбцов в файле Класс рук
m2 = 20 'не меньше, чем заполнено столбцов в файле Староста
Dim student As String 'имя ученика
Dim subject As String 'название предмета
Dim i, j, k As Integer
'чтобы можно было использовать переменные номера столбцов
Dim list_temp(26) As String
list_temp(1) = "A"
list_temp(2) = "B"
list_temp(3) = "C"
list_temp(4) = "D"
list_temp(5) = "E"
list_temp(6) = "F"
list_temp(7) = "G"
list_temp(8) = "H"
list_temp(9) = "I"
list_temp(10) = "J"
list_temp(11) = "K"
list_temp(12) = "L"
list_temp(13) = "M"
list_temp(14) = "N"
list_temp(15) = "O"
list_temp(16) = "P"
list_temp(17) = "Q"
list_temp(18) = "R"
list_temp(19) = "S"
list_temp(20) = "T"
list_temp(21) = "U"
list_temp(22) = "V"
list_temp(23) = "W"
list_temp(24) = "X"
list_temp(25) = "Y"
list_temp(26) = "Z"
Dim subjects_count, students_count As Integer 'количество предметов и учеников
subjects_count = 0
students_count = 0
File1 = Application.GetOpenFilename()
If File1 <> False Then
   Workbooks.Open (File1)
   File2 = Application.GetOpenFilename()
   If File2 <> False Then
      Workbooks.Open (File2)
      'Если нашли и открыли оба файла
      For i = 3 To n1 'цикл по скважинам файла Класс рук
          student = Workbooks.Item(2).ActiveSheet.Cells(i, 1).Value 'получаем имя ученика
          If student <> "" And Columns("A:A").Find(student, LookAt:=xlWhole) Is Nothing Then 'если это не пустая ячейка и этого ученика еще нет в исходной таблице
             Cells(i, 1).Value = student 'записываем имя этого студента в первый столбец файла итоговой таблицы
             students_count = students_count + 1
          End If
          For j = 2 To n2 'цикл по предметам файла Класс рук
              subject = Workbooks.Item(2).ActiveSheet.Cells(1, j).Value 'получаем название предмета
              If subject <> "" And Rows(1).Find(subject, LookAt:=xlWhole) Is Nothing Then 'если это не пустая ячейка и этого предмета еще нет в исходной таблице
                 Cells(1, j).Value = subject 'записываем название этого предмета в первую строку файла итоговой таблицы
                 Cells(2, j).Value = "Класс рук"
                 subjects_count = subjects_count + 1
              End If
              Cells(i, j).Value = Workbooks.Item(2).ActiveSheet.Cells(i, j).Value
          Next j
      Next i
      If subjects_count < 27 Then
         col = list_temp(subjects_count + 1)
      Else
         col = "A" + list_temp(subjects_count - 26 + 1)
      End If
      For i = 3 To m1 'цикл по скважинам файла Староста
          student = Workbooks.Item(3).ActiveSheet.Cells(i, 1).Value 'получаем имя ученика
          If student <> "" And Columns("A:A").Find(student, LookAt:=xlWhole) Is Nothing Then 'если это не пустая ячейка и этого ученика еще нет в исходной таблице
             Cells(i, 1).Value = student 'записываем имя этого ученика в первый столбец файла итоговой таблицы
             For k = 2 To subjects_count + 1
                 Cells(students_count + 3, k).Value = 0 'указываем, что в файле Класс рук по этому ученику нет данных
             Next k
             students_count = students_count + 1
             For j = 2 To m2 'цикл по предметам файла Староста
                 subject = Workbooks.Item(3).ActiveSheet.Cells(1, j).Value 'получаем название предмета
                 If subject <> "" And Range("B1:" & col & "1").Find(subject, LookAt:=xlWhole) Is Nothing Then 'если это не пустая ячейка и этого предмета еще нет в исходной таблице в части Староста
                    Cells(1, methods_count + 1 + j).Value = subject 'записываем название этого предмета в первую строку файла итоговой таблицы
                    Cells(2, methods_count + 1 + j).Value = "Староста"
                    subjects_count = subjects_count + 1
                 End If
                 Cells(i + students_count + 3, j + subjects_count + 1).Value = Workbooks.Item(3).ActiveSheet.Cells(i, j).Value
             Next j
          ElseIf Not Columns("A:A").Find(student, LookAt:=xlWhole) Is Nothing Then 'если этот ученик уже был
             student_row = Columns("A:A").Find(student, LookAt:=xlWhole).Row 'запоминаем этого ученика
             For j = 2 To m2 'цикл по предметам файла Староста
                 subject = Workbooks.Item(3).ActiveSheet.Cells(1, j).Value 'получаем название предмета
                 If subject <> "" And Range("B1:" & col & "1").Find(subject, LookAt:=xlWhole) Is Nothing Then 'если это не пустая ячейка и этого предмета еще нет в исходной таблице в части Староста
                    Cells(1, subjects_count + 1 + j).Value = subject 'записываем название этого предмета в первую строку файла итоговой таблицы
                    Cells(2, subjects_count + 1 + j).Value = "Староста"
                    subjects_count = subjects_count + 1
                 End If
                 Cells(student_row, j + subjects_count + 1).Value = Workbooks.Item(3).ActiveSheet.Cells(i, j).Value
             Next j
          End If
      Next i
   End If
End If
End Sub
0
Миниатюры
Объединить данные двух таблиц   Объединить данные двух таблиц   Объединить данные двух таблиц  

Вложения
Тип файла: xlsx Класс рук.xlsx (8.7 Кб, 2 просмотров)
Тип файла: xlsx Староста.xlsx (8.7 Кб, 2 просмотров)
Тип файла: xlsx итоговая табл.xlsx (8.1 Кб, 1 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2019, 19:36
Ответы с готовыми решениями:

Форма должна подтягивать данные из двух таблиц
Есть две таблицы в одной БД MS Access. Первая - &quot;Клиенты&quot;. Вторая - &quot;Заказы Клиентов&quot;. Отношение ...

Объединить несколько неоднотипных таблиц в одну
Всем привет! Помогите найти решение. Имеется несколько неоднотипных таблиц в одном файле,...

Как объединить несколько таблиц в одну
Есть база книг в библиотеке с 20 полями, Название, описание, категория, картинка, страниц, isbn,...

Объединить закрытые файлы Word одного каталога в один файл с удалением всех таблиц
Доброго времени суток форумчане! Нашел на форуме тему &quot; Объединить заданные пользователем открытые...

Объединить повторяющиеся данные
Существует 4 столбца в которых есть названия и количество, некоторые из названий повторяются, каким...

7
Narimanych
546 / 432 / 205
Регистрация: 23.03.2015
Сообщений: 1,461
08.10.2019, 19:52 2
Simply me,
Это задание или реальная проблема в школе, которую нужно сделать,
0
Simply me
236 / 32 / 6
Регистрация: 05.05.2012
Сообщений: 446
Завершенные тесты: 4
09.10.2019, 06:38  [ТС] 3
Narimanych, это реальная проблема. Но не в школе. Другая предметная область. Но действительно есть 2 источника данных. Есть 2 статистики про наличие/отсутствие данных в этих источниках. И очень нужно объединить в одну.
0
Burk
925 / 642 / 192
Регистрация: 11.07.2014
Сообщений: 2,305
09.10.2019, 18:10 4
Simply me, а зачем заполнять массив list_temp? Он вообще не нужен. ИмяСтолбца=Chr(64+НомерСтолбца)
1
09.10.2019, 18:10
Simply me
236 / 32 / 6
Регистрация: 05.05.2012
Сообщений: 446
Завершенные тесты: 4
09.10.2019, 18:12  [ТС] 5
Не знала, спасибо, перепишу эту часть. Вообще уже отладила этот макрос)
0
Burk
925 / 642 / 192
Регистрация: 11.07.2014
Сообщений: 2,305
09.10.2019, 18:33 6
И при объявлении переменных (Dim I,J,K as Integer) тип целый только у К, в ВБА надо описывать тип каждой переменной
Ну и молодцом, что отладили.
0
Simply me
236 / 32 / 6
Регистрация: 05.05.2012
Сообщений: 446
Завершенные тесты: 4
09.10.2019, 18:34  [ТС] 7
Буду знать)
0
Burk
925 / 642 / 192
Регистрация: 11.07.2014
Сообщений: 2,305
09.10.2019, 18:39 8
по умолчанию тип Variant
0
09.10.2019, 18:39
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2019, 18:39

Объединить данные из разных ячеек/листов
Доброго времени суток!!! Заранее прошу прощения если данный вопрос уже обсуждался, но на форуме...

Объединить данные с разных листов excel 2003
Добрый день! Нужна помощь специалистов. Есть три листа эксель в них данные по аптекам. Excel...

Объединить данные в 1 столбец без повторений и пустых строк
Как можно объединить данные в 1 столбец без повторений и пустых строк? С помощью кода.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.