Страницы: 1
RSS
массовое соединение значений из строк, формула, макрос, pq - способ решения
 
Добрый день, во вложении файл пример из одной строчки:
цель из НАЧАЛЬНАЯ СТРОКА получить ИТОГ. Все шаги описаны сверху вниз на примере одной строчки.  из строки 2 получить строку 11.

Но основная загвоздка вся в том, что начальных строк идет не сколько тысяч, и делать в ручную это очень долго, excel может такое сделать, или для него это очень сложный алгоритм?
 
DJMC,
совсем не понятно как должны формироваться 9 и 11 строки???

в остальном вот так:
Код
Sub aaa()
lLastRow1 = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For k = 1 To lLastRow1 Step 2
lLastRow2 = Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row
    For n = 1 To 15
        Sheets("Лист2").Cells(lLastRow2 + 1, n) = n
        marks = ActiveSheet.Range(Cells(k, 1), Cells(k, 15)).Find(Sheets("Лист2").Cells(lLastRow2 + 1, n), LookAt:=xlWhole).Offset(1, 0).Value
        Sheets("Лист2").Cells(lLastRow2 + 2, n) = marks
        Sheets("Лист2").Cells(lLastRow2 + 3, n) = ActiveSheet.Cells(k + 1, n)
        Sheets("Лист2").Cells(lLastRow2 + 4, n) = ActiveSheet.Cells(k, n)
        Sheets("Лист2").Cells(lLastRow2 + 5, n) = "хз"
        Sheets("Лист2").Cells(lLastRow2 + 6, n) = n
        Sheets("Лист2").Cells(lLastRow2 + 7, n) = "хз2"
    Next n
Next k
End Sub
Изменено: evgeniygeo - 27.09.2022 06:54:02
 
evgeniygeo спасибо что обратили внимание на мою тему.

9 строка это общее между 6 и 7 строчкой значение в скобках, и берется номер игры из 7 строчки,
то есть если в 6 написано 1-(1,X), а в 7 9-(1,2) то берем общее из скобок - это (1) и записываем в виде 9-(1), а в 11 строчке уже пишем по порядку их то есть это  значение должно стать в ячейке I11.
 
Цитата
DJMC написал:
то берем общее из скобок
а если не будет общего?
Цитата
evgeniygeo написал:
записываем в виде 9-(1)
в Вашем примере не так

если будет (1,X) и (X,1) то, что считать общим?

чтобы вытащить данные в скобках:
Код
Mid(Range("A6"), InStr(Range("A6"), "(") + 1, Len(Range("A6")) - InStr(Range("A6"), "(") - 1)
Изменено: evgeniygeo - 27.09.2022 09:39:10
 
evgeniygeo
Если не будет общего, что мало вероятно, так как из трех значений всегда идет два и будет общее, но в таком случаи брать тройник (1,X,2)/

да если 1,Х и Х,1 то это одно и тоже, это и берем.
 
DJMC,
прошу прощения, но в моем понимании это слишком комплексная задача вырисовывается)))

как вариант, можно разбить по запятой с помощью Split'a (разбиваем только то, что находится в скобках, с помощью кода из сообщения выше) и далее сравнить два значения из одной строки с двумя из другой
а 11 строку по аналогии с:
Код
marks = ActiveSheet.Range(Cells(k, 1), Cells(k, 15)).Find(Sheets("Лист2").Cells(lLastRow2 + 1, n), LookAt:=xlWhole).Offset(1, 0).Value
Изменено: evgeniygeo - 27.09.2022 10:33:15
 
Такой вариант:
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  names = List.Buffer ( Table.ColumnNames ( data ) ),
  sortNames = List.Buffer ( List.Sort ( names, ( x ) => Number.From ( x ) ) ),
  transform = Table.FromRecords (
    Table.TransformRows (
      data,
      ( r ) =>
        [
          vals = List.Transform ( Record.FieldValues ( r ), ( x ) => Text.Split ( Text.BetweenDelimiters ( x, "(", ")" ), "," ) ),
          sortVals = List.Transform (
            Record.FieldValues ( Record.ReorderFields ( r, sortNames ) ),
            ( x ) => Text.Split ( Text.BetweenDelimiters ( x, "(", ")" ), "," )
          ),
          transform = List.Transform (
            List.Zip ( { vals, sortVals } ),
            ( x ) => Text.Combine ( { "(", Text.Combine ( List.Intersect ( x ), "," ), ")" } )
          ),
          firstVals = List.Transform ( Record.FieldValues ( r ), ( x ) => Text.BeforeDelimiter ( x, "-" ) ),
          resultLst = List.Transform ( List.Zip ( { firstVals, transform } ), ( x ) => Text.Combine ( x, "-" ) ),
          result = Record.ReorderFields ( Record.FromList ( resultLst, names ), sortNames )
        ][result]
    )
  )
in
  transform
Изменено: surkenny - 27.09.2022 12:52:28
 
surkenny,
а я так понял, что нужно получить все строки, а не только "ИТОГ" и что таблица может быть больше, и при этом каждый раз будет по две строки ВРЕМЯ + НАЧАЛЬНАЯ СТРОКА
наверное, я изначально не понял задачи)))
Изменено: evgeniygeo - 27.09.2022 13:23:39
 
evgeniygeo,
Если я правильно понял, то нужно из первой строки сделать последнюю, то есть ИТОГ.
Но вот этих строк может быть много (в примере одна).
Запрос обработает сколько угодно начальных строк и выдаст итоговые строки вместо них :)
 
evgeniygeo, а, я понял. Имеется в виду, что желтая строка начальной таблицы - это не шапка :) И изначальная таблица будет состоять из 2n строк. Ну тут-то тоже не проблема будет преобразовать каждые 2 строки в одну таблицу, где первая строка - заголовки, вторая значения. А потом уже преобразовать по моей логике каждую таблицу, объединить таблицы.
1. Как видим, ТЗ неоднозначно. Поэтому еще и другой вариант делать не буду :)
2. У ТС нет своих попыток. Основное сделано в моем запросе. Не сможет применить к реальным данным - пусть обращается в Работу :)
 
surkenny
спасибо за помощь, но не подскажите полный код макроса, который вы написали в сообщении 8, так как данный код не полный и в excel не могу проверить на сколько он справляется с моей задачей.
 
DJMC, это не код макроса. Это код запроса Power Query.
 
Цитата
DJMC,[/USER] написал:
данный код не полный
что подразумевается под этим?
все-таки в оригинальном файле продолжаются только строки с "Начальная строка" или с "Время" тоже?
нужно получить все строчки из примера или только итог?
Изменено: evgeniygeo - 28.09.2022 10:39:07
 
evgeniygeo, только это не моя цитата :)
Думаю, ТС пытался код запроса вставить в макрос :)
Изменено: surkenny - 27.09.2022 17:41:09
 
surkenny
да пытался вставить Ваш код  в макрос  :cry:

Вставил в файл две строки 2 и 3 строка, к сожалению идет обработка только одной строки.
 
Цитата
DJMC написал:
Вставил в файл две строки 2 и 3 строка, к сожалению идет обработка только одной строки.
не туда вставили, у меня все ок

Почитайте про Power Query
Изменено: evgeniygeo - 28.09.2022 10:40:03
 
Наверное, даже так нужно для ТС (удалил все "лишнее") :) Заработался человек :)
 
surkenny
Идеально, ушел тестировать на 2500 вариантов  ;) Большое Вам спасибо за помощь, я честно думал такая задача не имеет решение.
Страницы: 1
Наверх