Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 08.09.2009
Сообщений: 4

Отчет по 2-м таблицам Excel

08.09.2009, 12:59. Показов 2059. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, есть такая задачка. Нужно сравнить 2 таблички на разных листах. При совпадении данных по 2м табличкам результаты вставляются на 3 лист. Казус в том, что таблички имеют разные форматы (так их выводит программа и никак это не изменить) и данные (Тикер компании) в одной табличке имеет нижнее подчеркивание а во второй нет. Пример как должен выглядеть результат нарисовал на 2м листе. Буду благодарен за помощь!
Вложения
Тип файла: xls Акции.xls (21.5 Кб, 49 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2009, 12:59
Ответы с готовыми решениями:

Отчет по таблицам из Excel
БД Access как сделать .. есть 3 таблицы. Т1(A,B,C) T2(A,D,E) данные таблицы в Exsel как сделать отчет в екселе?

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

MS SQL 2005 отчет по таблицам БД
Уважаемые форумчане доброго дня! Очень нужна помощь - столкнулся с проблемой - внезапно увеличился размер БД за ночь в 3 раза! ...

8
134 / 79 / 6
Регистрация: 06.04.2009
Сообщений: 192
08.09.2009, 17:29
Посмотрел Ваш пример. Не понял, по какому принципу формируется результирующая таблица (например, в листе 1 запись ABVM_, а в листе 2 ABVM - это разные наименования с точки зрения обработки данных, какие колонки д.б. в результирующей таблице и т.д.).
0
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,977
08.09.2009, 18:02
Не уяснил что с чем должно совпасть для вывода в итоговую таблицу.
Тикер=Актив, а дальше кто с чем?
0
0 / 0 / 0
Регистрация: 08.09.2009
Сообщений: 4
09.09.2009, 11:19  [ТС]
Итак, спасибо что откликнулись. Задачка возможно упростится. Эти таблицы из двух листов не полные, они здоровенные огроменные, просто это небольшой кусок для примера. Нужно выбрать номера портфелей (в листе 1 это с E1 по BX1) из листа 2 (ячейки A2 - Aбесконечно). Далее выбирается Тикер компании который есть в этом портфеле и сколько там акций. И все заносится в 3 лист. ПРОЩЕ ГОВОРЯ. Из Листа 1 берем портфель 30000, как видно в нем лежит 5 акций Тикера ABVM_, это вставляется в лист 3. Переходим в Лист 2 и ищем тотже портфель 30000 и смотрим что ему соответствует, а именно Актив ABVM и 5 акций и это вставляется в лист 3. Таким образом происходит сверка, соответствует ли количество акций в таком-то портфеле, такого-то тикера из Листа 1, с акциями тогоже портфеля из листа 2. Идет сверка таблиц разных форматов.

P.S. то что выделено серым цветом отношения ни к чему не имеет, это просто фигня
Вложения
Тип файла: xls Акции ПОБОЛЬШЕ.xls (22.5 Кб, 43 просмотров)
0
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,977
09.09.2009, 12:33
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
Sub Произвести_сверку()
currRowReport = 5 'номер строки в которую будет занесен итог (С5)
 
currPortf = 5 'номер столбца с которого пойдем в первом листе (Е1)
Do While Sheets(1).Cells(1, currPortf).Value <> ""
  currTiker = 2 'номер строки с которой пойдем во 2-м листе (А2)
  Do While Sheets(1).Cells(currTiker, 1).Value <> ""
    Kolich = Sheets(1).Cells(currTiker, currPortf).Value
    If Kolich <> "" Then
      Portfel = Sheets(1).Cells(1, currPortf).Value
      Tiker = Sheets(1).Cells(currTiker, 1).Value
      
      'заносим в итог данные с первого листа
      Sheets(3).Cells(currRowReport, 3).Value = Portfel
      Sheets(3).Cells(currRowReport, 6).Value = Tiker
      Sheets(3).Cells(currRowReport, 7).Value = Kolich
      
      'ищем соответствующую запись во втором листе
      FindedPortf = FindPortf(Portfel, Tiker)
      If FindedPortf > 0 Then 'если нашли
        Aktiv = Sheets(2).Cells(FindedPortf, 3).Value
        Kolich2 = Sheets(2).Cells(FindedPortf, 4).Value
        
        'заносим в итог данные со второго листа
        Sheets(3).Cells(currRowReport, 9).Value = Aktiv
        Sheets(3).Cells(currRowReport, 10).Value = Kolich2
      End If
      
      currRowReport = currRowReport + 1
    End If
    currTiker = currTiker + 1
  Loop
  currPortf = currPortf + 1
Loop
End Sub
 
Function FindPortf(Portfel, Aktiv) As Integer
'функция ищет номер строки второго листа в котором находится
'указанный портфель И актив
  FindPortf = 0
  currRow = 2
  Do While Sheets(2).Cells(currRow, 1).Value <> ""
    If Sheets(2).Cells(currRow, 1).Value = Portfel Then
      If Sheets(2).Cells(currRow, 3).Value = Replace(Aktiv, "_", "") Then
        FindPortf = currRow
        Exit Do
      End If
    End If
    currRow = currRow + 1
  Loop
End Function
1
0 / 0 / 0
Регистрация: 08.09.2009
Сообщений: 4
09.09.2009, 14:20  [ТС]
ОК спасибо большое. буду пробовать

Уважаемый Toxa33rus! могли бы вы к вашему замечательному коду добавить ещё одну функцию?
делает он следующее: в листе 3 где Результат сверки листа 1 и листа 2, можно сделать допустим в столбце L результирующий столбец, тоесть если количество акций в столбце G и J не совпадают, вычесть J-G и результат сунуть в столбец L рядом. Спасибо!!
Вложения
Тип файла: xls ФИНИШ.xls (718.5 Кб, 42 просмотров)
0
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,977
11.09.2009, 14:06
После 26-й строки кода из сообщения 5 вставьте:
Visual Basic
1
If Kolich <> Kolich2 Then Sheets(3).Cells(currRowReport, 12).Value = Kolich2-Kolich
1
0 / 0 / 0
Регистрация: 08.09.2009
Сообщений: 4
11.09.2009, 15:45  [ТС]
Спасибо огромнейшее!! с меня пивасик!!
0
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,977
11.09.2009, 20:56
Пивасик это хорошо
Только мне не нравится как код работает. Это ж вечность ждать приходится!
Ушел оптимизировать...

Добавлено через 1 час 3 минуты
Время выполнения последнего файла до оптимизации: 3:40 (почти 4 минуты!!!)
После оптимизации: 3,5 (почти 4 секунды!!!)

В 60 раз быстрее стало работать. Угощайтесь:
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
Dim Arr2()
 
Sub Произвести_сверку()
ReDim Arr2(0 To 1, 2 To 2)
tmpVal = 2
Do While Sheets(2).Cells(tmpVal, 1).Value <> ""
  ReDim Preserve Arr2(0 To 1, 2 To tmpVal + 1)
  Arr2(0, tmpVal) = Sheets(2).Cells(tmpVal, 2).Value 'portfel
  Arr2(1, tmpVal) = Replace(Sheets(2).Cells(tmpVal, 3).Value, "_", "") 'aktiv
 
  tmpVal = tmpVal + 1
Loop
ReDim Preserve Arr2(0 To 1, 2 To tmpVal - 1)
 
 
currRowReport = 5 'номер строки в которую будет занесен итог (С5)
 
currPortf = 5 'номер столбца с которого пойдем в первом листе (Е1)
Do While Sheets(1).Cells(1, currPortf).Value <> ""
  currTiker = 2 'номер строки с которой пойдем во 2-м листе (А2)
  Do While Sheets(1).Cells(currTiker, 2).Value <> ""
    Kolich = Sheets(1).Cells(currTiker, currPortf).Value
    If Kolich <> "" Then
      Portfel = Sheets(1).Cells(1, currPortf).Value
      Tiker = Sheets(1).Cells(currTiker, 2).Value
      
      'заносим в итог данные с первого листа
      Sheets(3).Cells(currRowReport, 3).Value = Portfel
      Sheets(3).Cells(currRowReport, 6).Value = Tiker
      Sheets(3).Cells(currRowReport, 7).Value = Kolich
      
      'ищем соответствующую запись во втором листе
      FindedPortf = FindPortf(Portfel, Tiker)
      If FindedPortf > 0 Then 'если нашли
        Aktiv = Sheets(2).Cells(FindedPortf, 3).Value
        Kolich2 = Sheets(2).Cells(FindedPortf, 4).Value
        
        'заносим в итог данные со второго листа
        Sheets(3).Cells(currRowReport, 9).Value = Aktiv
        Sheets(3).Cells(currRowReport, 10).Value = Kolich2
        If Kolich <> Kolich2 Then Sheets(3).Cells(currRowReport, 12).Value = Kolich2 - Kolich
      Else
        'тут можно обыграть ситуацию когда на втором листе не нашлось нужного портфеля с тикером
        'Sheets(3).Cells(currRowReport, 12).Value = " ! ! ! "
      End If
      
      currRowReport = currRowReport + 1
    End If
    currTiker = currTiker + 1
  Loop
  currPortf = currPortf + 1
Loop
End Sub
 
Function FindPortf(Portfel, Aktiv) As Integer
'функция ищет номер строки второго листа в котором находится
'указанный портфель И актив
  FindPortf = 0
  For i = 2 To UBound(Arr2(), 2) - 1
    If Arr2(0, i) = Portfel Then ' тут 2 поставил
      If Arr2(1, i) = Replace(Aktiv, "_", "") Then
        FindPortf = i
        Exit For
      End If
    End If
  Next i
End Function
скопировать полностью вместо старого кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2009, 20:56
Помогаю со студенческими работами здесь

Отчет из базы данных по нескольким таблицам
Здравствуйте. Подскажите такой нюанс. В Microsoft Visual Studio 2015 на C# делаю маленькую и довольно простенькую АИС. База сделана...

SQL запрос, отчет по всем таблицам базы
Подскажите хочу сделать отчет по всем таблицам в базе. Пишу такой запрос в ADOQuery. SELECT a.*, b.*, c.*, d.*, e.*, ...

Почему поверхность в Excel строится по двум таблицам?
Сама с Exsel знакома слабо, задание помогли сделать, а теперь препод спрашивает: &quot;почему поверхность строится по двум таблицам?&quot;...

Распределение введенных данных по разным таблицам (Excel)
Доброго времени суток! Столкнулся с вопросом, который загнал в тупик и на который не могу ответить без вашей помощи. Пожалуйста...

Экспорт таблиц в книгу excel с листами кратному экспортированным таблицам
Всем привет! Народ, подскажите как и каким образом можно экспортировать несколько таблиц в один файл excel. Нужно разбить таблицы на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru