Как переключать даты столбцов в строки в Excel - PullRequest
0 голосов
/ 29 января 2019

У меня есть Excel, где в строках перечислены люди, а в столбцах рабочие даты.Каждый день - это ячейка (столбец)

Данные:

Employee    January
        01 02 03 04 05 06 07 08 09 10 
-------------------------------------
Joe      1  1  1  1           1  1  1
John     1  1  1

Я хочу получить следующий результат

Ожидаемый результат:

Employee    Work On Date   Work Off date
----------------------------------------
Joe         2019-01-01     2019-01-04
Joe         2019-01-08     2019-01-10
John        2019-01-01     2019-01-03

Я не могу найти способ, просто сделав это вручную.

Я думал вставить все в базу данных и затем оттуда работать ... но моя проблема в том,объединить все данные в качестве ожидаемого результата.Есть ли способ добиться этого с помощью Excel или Excel / SQL?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы также можете сделать это по формуле, используя диапазоны смещения:

В (скажем) A12

=IFERROR(IF(ROW()=12,A3,IF(COUNTIF(A$11:A11,A11)<COUNTIFS(INDEX($B$3:$K$4,MATCH(A11,A$3:A$4,0),0),1,INDEX($A$3:$J$4,MATCH(A11,A$3:A$4,0),0),"<>1"),
A11,INDEX(A$3:A$4,MATCH(A11,A$3:A$4,0)+1))),"")

В B12

=AGGREGATE(15,6,COLUMN(A:J)/((INDEX(A$3:J$4,MATCH(A12,A$3:A$4,0),0)<>1)*(INDEX(B$3:K$4,MATCH(A12,A$3:A$4,0),0)=1)),COUNTIF(A$11:A12,A12))

и в C12

=AGGREGATE(15,6,COLUMN(A:J)/((INDEX(B$3:K$4,MATCH(A12,A$3:A$4,0),0)=1)*(INDEX(C$3:L$4,MATCH(A12,A$3:A$4,0),0)<>1)),COUNTIF(A$11:A12,A12))

enter image description here

В настоящее время это просто номер дня, и вы можете добавить 31 декабря, чтобы получить дату.

0 голосов
/ 29 января 2019

Я пытаюсь создать фрагмент кода, чтобы удовлетворить ваши потребности:

Option Explicit

Sub test()

    Dim LastRow As Long, LastColumn As Long, LastRowNew As Long, Row As Long, Column As Long
    Dim StartingDate As String, EndingDate As String, Name As String

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        .Range("A" & LastRow + 2).Value = "Employee"
        .Range("B" & LastRow + 2).Value = "Work On Date"
        .Range("C" & LastRow + 2).Value = "Work Off Date"

        For Row = 3 To LastRow

            LastColumn = .Cells(Row, .Columns.Count).End(xlToLeft).Column

            Name = Range("A" & Row).Value
            StartingDate = ""

            For Column = 2 To LastColumn

                If .Cells(Row, Column).Value <> "" And StartingDate = "" Then
                    StartingDate = "2018-" & .Cells(1, Column).Value & "-" & .Cells(2, Column).Value
                    LastRowNew = .Cells(.Rows.Count, "A").End(xlUp).Row
                    .Range("A" & LastRowNew + 1).Value = Name
                    .Range("B" & LastRowNew + 1).Value = CDate(StartingDate)
                ElseIf .Cells(Row, Column).Offset(0, 1).Value = "" And StartingDate <> "" Then
                    EndingDate = "2018-" & .Cells(1, Column).Value & "-" & .Cells(2, Column).Value
                    .Range("C" & LastRowNew + 1).Value = CDate(EndingDate)
                    StartingDate = ""
                End If

            Next Column

        Next Row

    End With

End Sub

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...