Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   Подскажите функцию для excel (http://forum.oszone.net/showthread.php?t=305947)

Alexander_88 27-09-2015 20:38 2558330

Подскажите функцию для excel
 
Здравствуйте подскажите возможно ли сделать следующее....

есть сверху большая таблица и снизу две мини таблицы (пример):

Код:

A        B              C                        D
90    Яблоки  5,6+4,6+9,6+10,5+15,0  45,3-5-6,5-9,6-6-8,3
150  Груши    5,6+4,6+9,6+10,5+15,0  45,3-5-6,5-9,6-6-8,3
350  Финики  5,6+4,6+9,6+10,5+15,0  45,3-5-6,5-9,6-6-8,3


Код:

A      B      C        D
180  Груши  5,6
340  Курага  9,6
90    Яблоки  10

Код:

A      B                    C                              D
90    Бананы                                                6,5
155  Груши                                                  4,6
350  Финики                                                8,4

Необходимо добавить мини таблицы к большой таблице. Притом, если совпадают первый и второй столбец, то третий и четвертый столбцы добавлялись друг к другу.... третий столбец добавлялся через знак + а четвертый через знак +

Т.е. объединив мини таблицы с большой, должна получится такая таблица

Код:

A      B                    C                          D
90    Яблоки  5,6+4,6+9,6+10,5+15,0+10  45,3-5-6,5-9,6-6-8,3
150  Груши    5,6+4,6+9,6+10,5+15,0      45,3-5-6,5-9,6-6-8,3
350  Финики  5,6+4,6+9,6+10,5+15,0      45,3-5-6,5-9,6-6-8,3-8,4
180  Груши    5,6
340  Курага    9,6
90    Бананы                              6,5
155  Груши                                4,6


corbis 28-09-2015 09:14 2558435

На счет функции не уверен, а вот макросом можно замутить.
Не понятно:
1. как соединяются столбцы при совпадении.
2. размеры таблиц.

Хорошо бы файл с таблицами..

a_axe 28-09-2015 13:27 2558512

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

Alexander_88 28-09-2015 14:56 2558554

Поправка.. как третий так и четвертый столбец должны сцепляться через знак +

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

Желательно и удобно, чтобы объединение происходило с помощью кнопки.. т.е. я выделяю весь диапазон, который требуется объединить (на примере исходного листа это диапазон от ячейки А2 до ячейки D21), нажимаю эту кнопку и должно получиться то, что мы видим в листе "Результат".

Alexander_88 28-09-2015 18:03 2558611

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

Drongo 28-09-2015 21:56 2558681

Цитата:

Цитата Alexander_88
есть сверху большая таблица и снизу две мини таблицы (пример): »

Меня интересует такой вопрос, допустим та, верхняя таблица, когда в неё в конец добавятся данные, не получится ли так что места не хватит, т.к. нижние маленькие будут мешать?

Можно ли две маленькие вынести на отдельные листы?

И ещё мне интересно, есть ли предельное количество строк для трёх таблиц, верхней и двух нижних? Например, можно уложиться в 100 строк и знать что 101-й не будет или же это неизвестно?

Alexander_88 28-09-2015 22:14 2558685

Цитата:

Цитата Drongo
Меня интересует такой вопрос, допустим та, верхняя таблица, когда в неё в конец добавятся данные, не получится ли так что места не хватит, т.к. нижние маленькие будут мешать? »

Я могу либо специально пропускать очень много строк, между большой таблицей и маленькими, чтобы места хватило, либо
Цитата:

Цитата Drongo
Можно ли две маленькие вынести на отдельные листы? »

Можно вынести на отдельные листы.

Цитата:

Цитата Drongo
И ещё мне интересно, есть ли предельное количество строк для трёх таблиц, верхней и двух нижних? Например, можно уложиться в 100 строк и знать что 101-й не будет или же это неизвестно? »

предельное количество строк будет не больше 1000... это я с запасом взял :)

azbest 29-09-2015 01:07 2558715

Alexander_88,
сделать можно
но есть наводящие вопросы:
в второй и третьей таблице - есть повторяющиеся записи - например "яблоки" 10, а чуть ниже "яблоки" 25. Тоесть - "посчитанные (перенесенные в первую таблицу ) данные по каждому из фруктов можно удалять из 2 и третьей таблицы или менять их нельзя и хранить как оригинальные данные?
алгоритм - прост: цикл 1 - построчный опрос и запоминание значений (в переменные) по столбцам "А" и "В" в первой таблице, а внутри этого цикла - ещё два цикла по опросу и запоминанию значений (в переменные) второй и третей таблицы - потом сравнение на предмет совпадения переменных - если да - то где надо сплюсовать или вычесть - если нет - пропускаем. :)

a_axe 29-09-2015 10:24 2558810

Alexander_88, насколько я понял вашу мысль, вам не нужно суммировать цифры, на выходе должна быть текстовая строка, в которой через знак "+" перечисляются цифры, то есть например "8.7+6.89", а не их сумма 15.59. Попробуйте код ниже. Оговорки: таблицы должны находится на одной странице, интересующие вас данные выделяете мышкой и запускаете код, результат будет помещаться каждый раз на вновь созданный лист.
Код

Код:

Option Explicit
Public Sub data_extr()
Dim objCell As Object, targetSheet As Object, dataSheet As Object
Dim i As Integer
Dim Flag As Boolean
Set dataSheet = ThisWorkbook.ActiveSheet
Set targetSheet = ThisWorkbook.Sheets.Add
dataSheet.Activate
For Each objCell In Intersect(Selection, Selection.Columns(1))
      If objCell.Value <> "" Then
        i = 1
        Flag = False
        Do
       
        If targetSheet.Cells(i, 1).Value = "" Then
            Flag = True
            targetSheet.Cells(i, 1).Value = objCell.Value
            targetSheet.Cells(i, 2).Value = objCell.Offset(0, 1).Value
            targetSheet.Cells(i, 3).Value = objCell.Offset(0, 2).Value
            targetSheet.Cells(i, 4).Value = objCell.Offset(0, 3).Value
        Else
            If targetSheet.Cells(i, 1).Value = objCell.Value And targetSheet.Cells(i, 2).Value = objCell.Offset(0, 1).Value Then
                If objCell.Offset(0, 2).Value <> "" Then targetSheet.Cells(i, 3).Value = targetSheet.Cells(i, 3).Value & "+" & objCell.Offset(0, 2).Value
                If objCell.Offset(0, 3).Value <> "" Then targetSheet.Cells(i, 4).Value = targetSheet.Cells(i, 4).Value & "+" & objCell.Offset(0, 3).Value
                Flag = True
            End If
        End If
        i = i + 1
        Loop Until Flag
    End If
Next objCell
targetSheet.Activate
Set dataSheet = Nothing
Set targetSheet = Nothing
End Sub


corbis 29-09-2015 11:53 2558856

Вложений: 1
Вот такой вариант набросал.

Alexander_88 29-09-2015 16:12 2558979

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

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

Дали мне вариантик.. единственное тут сделано не вертикально, а горизонтально... т.е. пополняемая таблица (большая) справа, а маленькие будут создаваться слева. Кому интересно прикрепил.

corbis 29-09-2015 16:39 2558999

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

Alexander_88 29-09-2015 16:58 2559018

да, надо было больше инфы дать.... люди заказывают товар каждый день (заказ это маленькая таблица). потом через месяц нужен единый отчет по заказам (большая таблица)

corbis 29-09-2015 17:38 2559035

Смысл примерно понятен. Может тогда сделать, чтобы на каждый месяц свой отчет был (в отдельном листе), а не в одну таблицу всё сгружать?
потом ведь не разгрести..

a_axe 29-09-2015 18:41 2559063

Цитата:

Цитата Alexander_88
отелось бы, чтобы данные постоянно пополнялись, а не переносились всегда на новый лист.. т.е. набрал я одну таблицу, запустил макрос, она объединилась с большой, потом еще сделал маленькую, опять запустил макрос... большая таблица опять пополнилась и т.д. »

Alexander_88, откровенно - все равно не понятно. Вообще насколько я понимаю - работа не для Excel.
Цитата:

Цитата Alexander_88
набрал я одну таблицу, запустил макрос, она объединилась с большой, потом еще сделал маленькую, опять запустил макрос... большая таблица опять пополнилась и т.д. »

Добили в основную таблицу (ниже нее) новые строки - и отсортировали, правильно?
Вы определитесь, что вы хотите, сложно получить подходящий результат, если не знаешь, что нужно делать :).

Вот другой код, с оговорками: данные вашей "основной" таблицы располагаются на листе в столбцах 1-4, заголовок таблицы в строчке 1. Новые данные вы набиваете ниже основной таблицы в соответствующие ячейки, запускаете код, происходит сортировка, при этом нижние строки с совпадающими позициями станут пустыми, их значение будет перенесено в строки выше. Пустые строки не удаляются, так как не известно, что будет справа от вашей таблицы. Выделять ничего не требуется, проверка идет по столбцам 1-4 активного листа.
Скрытый текст
Код:

Public Sub data_exist_extr()
Dim objCell As Object, targetSheet As Object, dataSheet As Object
Dim i As Integer, j As Integer
Dim Flag As Boolean
Set dataSheet = ThisWorkbook.ActiveSheet
'Set targetSheet = ThisWorkbook.Sheets.Add
'dataSheet.Activate
For i = dataSheet.UsedRange.Row + dataSheet.UsedRange.Rows.Count - 1 To 1 Step -1
  If dataSheet.Cells(i, 1).Value <> "" Then
        For j = i - 1 To 1 Step -1
            If dataSheet.Cells(j, 1).Value = dataSheet.Cells(i, 1).Value And dataSheet.Cells(j, 2).Value = dataSheet.Cells(i, 2).Value Then
                If dataSheet.Cells(i, 3).Value <> "" Then dataSheet.Cells(j, 3).Value = dataSheet.Cells(j, 3).Value & "+" & dataSheet.Cells(i, 3).Value
                If dataSheet.Cells(i, 4).Value <> "" Then dataSheet.Cells(j, 4).Value = dataSheet.Cells(j, 4).Value & "+" & dataSheet.Cells(i, 4).Value
                dataSheet.Range(Cells(i, 1), Cells(i, 4)).Value = ""
                Exit For
            End If
        Next j
  End If
Next i

Set dataSheet = Nothing

End Sub



Время: 21:47.

Время: 21:47.
© OSzone.net 2001-