Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
Excel

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

08.10.2019, 19:36. Показов 3065. Ответов 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
Миниатюры
Объединить данные двух таблиц   Объединить данные двух таблиц   Объединить данные двух таблиц  

Вложения
Тип файла: xlsx Класс рук.xlsx (8.7 Кб, 5 просмотров)
Тип файла: xlsx Староста.xlsx (8.7 Кб, 5 просмотров)
Тип файла: xlsx итоговая табл.xlsx (8.1 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2019, 19:36
Ответы с готовыми решениями:

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

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

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

7
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
08.10.2019, 19:52
Simply me,
Это задание или реальная проблема в школе, которую нужно сделать,
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
09.10.2019, 06:38  [ТС]
Narimanych, это реальная проблема. Но не в школе. Другая предметная область. Но действительно есть 2 источника данных. Есть 2 статистики про наличие/отсутствие данных в этих источниках. И очень нужно объединить в одну.
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
09.10.2019, 18:10
Simply me, а зачем заполнять массив list_temp? Он вообще не нужен. ИмяСтолбца=Chr(64+НомерСтолбца)
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
09.10.2019, 18:12  [ТС]
Не знала, спасибо, перепишу эту часть. Вообще уже отладила этот макрос)
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
09.10.2019, 18:33
И при объявлении переменных (Dim I,J,K as Integer) тип целый только у К, в ВБА надо описывать тип каждой переменной
Ну и молодцом, что отладили.
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
09.10.2019, 18:34  [ТС]
Буду знать)
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
09.10.2019, 18:39
по умолчанию тип Variant
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2019, 18:39
Помогаю со студенческими работами здесь

[Макрос]Сверка значений ячеек двух таблиц на двух листах и заливка цветом
Возникла задача, сравнить две таблицы на соответствие числовых значений. Две таблицы отчётности, в ячейках значения примерно с 10 знаками...

Объединить данные двух таблиц по ID
Всем привет, столкнулся с такой проблемой. Есть две таблицы в одной в поле (post) содержатся только цыфры. В другой таблице есть много...

Нужно объединить данные из двух таблиц
Нужно объеденить данные из двух таблиц в одном запросе! Делаю два запроса: Первый запрос- получаю id ника Moderator из таблицы user ...

Как объединить текстовые данные с двух одинаковых таблиц в третью
Всем привет. Подскажите плиз. Есть три экселевских файла с пятью листами в каждом, и на каждом листе есть таблица 10Х10 с текстовой...

Выбрать частично совпадающий текст и объединить данные двух таблиц
Дорогие форумчане, я новичок здесь, да и в формулах тоже. Никак у меня не получается, помогите! Нужно: сопоставить две колонки с...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru