Страницы: 1
RSS
как из нескольких строк в эксель сделать одну
 
Добрый день, подскажите такой вот момент, всю голову сломал, идей нет больше как реализовать данную функцию
есть таблица, в ней есть шифр, обычно три четыре одинаковых значения, затем идут показатели, так же три четыре, шифр одинаковый, показатели разные, но каждые 4 строчки это повторяется, на другом листе это нужно все вытянуть в одну строчку, для слияния с вордом, ну это другя история, заранее спасибо, предположительно нужно использовать функцию смещ, но ничего не получается
 
не понятно что на выходе должно быть, но вместо ВПР
Код
=ИНДЕКС('исходные данные'!C1:U8;СТРОКА(1:8);{1;16;17;18;19})
 
Цитата
написал:
не понятно что на выходе должно быть, но вместо ВПР
конечный результат это нужно те 4 строчки что идут одна над другой, вывести в одну строчку, на отдельном листе, цель как писал выше, подготовить лист для слияния с вордом
 
Можете почитать ТУТ или ТУТ
 
не совсем то что нужно, нужно что были столбцы с наименованием элемента, а в строчке были результаты, сейчас это тоже так, но в 4 строчки, а нужно в одну, сейчас в строчке и результаты и наименования
 
denka1982, приложите пример как есть и как должно быть (без формул)
Кто ясно мыслит, тот ясно излагает.
 
вроде бы доступно написал, что надо из четырех строк сделать одну, константы там есть это pb,cd,as,hg но не понимаю как, к шифру крепится константа, это получается уникальное значение, осталось придумать как это в одну строчку запихнуть, одинаковых констант 4, зато групп этих констант несколько десятков тысяч, и они всегда идут в столбик в одном и тож же порядке, но на разных строчках, есть шифр, к нему крепится 4 элемента(костанты)
Изменено: denka1982 - 05.05.2022 15:06:15
 
denka1982, вариант макросом:
Код
Sub JoinRows()
Dim rng As Range, i, item, Dict, lCol As Long, lRow As Long
    Set Dict = CreateObject("Scripting.Dictionary")
    Set rng = Application.InputBox("Выберите диапазон", Type:=8)
    For Each i In rng.Rows
        item = Application.Transpose(Application.Transpose(i.Value2))
        Dict.Add i.Row, item
    Next i
    lCol = 1
    lRow = Worksheets("то что должно получиться").Cells(Rows.Count, 1).End(xlUp).Row + 1
    For Each item In Dict.items()
        Worksheets("то что должно получиться").Cells(lRow, lCol).Resize(1, UBound(item)) = item
        lCol = UBound(item) + lCol
    Next item
End Sub
Выделяете один диапазон, например желтый - данные записываются в последнюю строку на втором листе, затем зеленый - данные записываются на строку ниже.
 
denka1982, вариант Power Query
Кто ясно мыслит, тот ясно излагает.
 
Цитата
написал:
Выделяете один диапазон, например желтый - данные записываются в последнюю строку на втором листе, затем зеленый - данные записываются на строку ниже.
завтра попробую, сейчас уже домой пора, и спасибо заранее, я всю голову сломал как это реализовать, но можно как то без выделений, там строк овер много!!!!!!!!!!!!
 
можно такую формулу к примеру, но как заставить через 4 строки при протягивании перепрыгивать хз:
Код
=ТРАНСП(
ИНДЕКС(C1:R4;
{1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:2:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4:4};
{1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16}))
 
denka1982, можно копировать по 4 строки циклом (4 строки скопировалось - на целевом листе новая строка и т.д.)
Макрос JoinRows_2 (запускать по Alt + F8)

Код
Sub JoinRows_2()
Dim i, j, lCol As Long, lRow As Long, arr, dCount
With Worksheets("исходные данные")
    lRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' последняя строка на листе исходные данные (считает по первому столбцу)
    lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column ' последний заполненный столбец на листе исходные данные
    arr = .Range(.Cells(1, 3), .Cells(lRow, lCol)) ' 3 - это столбец (левый крайний, изменить на нужный) - с которого выделять диапазон
End With
With Worksheets("то что должно получиться")
    lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    lCol = 1: dCount = 1
For i = LBound(arr, 1) To UBound(arr, 1)
    If dCount = 5 Then
        lRow = .Cells(.Rows.Count, 1).End(xlUp).Row: dCount = 1
    End If
    For j = LBound(arr, 2) To UBound(arr, 2)

        .Cells(lRow + 1, lCol) = arr(i, j)
        lCol = lCol + 1
    Next j
    If lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1 Then lCol = 1
    dCount = dCount + 1
Next i
End With
End Sub
Изменено: artemkau88 - 06.05.2022 09:40:34
 
последний макрос то что нужно, огромное спасибо!!!
 
denka1982, пожалуйста! Успехов!  :)

Добавил комментарии к сообщению #12
 
Цитата
написал:
предположительно нужно использовать функцию смещ,
вот вариант через СМЕЩ
 
последний вариант тоже работает, но такую формулу можно написать только выпив вотки, а разобраться в ней, выпив ящик пива))))
 
Вариант через ИНДЕКС. Рассчитан на меньшее кол-во водки и всего пару банок пива.
В файле, строчками ниже решения показана наглядная работа формулы. На всякий случай: 16 - это кол-во столбцов, начиная со столбца С. Формула - COLUMN(A$1)>16*4 - отсечка по столбцам.
Формула массивная, для большого кол-ва строк скорее всего не подойдет, поэтому носит чисто демонстрационный характер. На практике юзайте макрос и PQ.
Изменено: memo - 07.05.2022 13:41:40
Страницы: 1
Наверх