Как сделать умное смещение в Excel? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть две колонки - одна с номером проекта, другая с под номерами (включена в проект).То, что я хотел бы сделать, это создать «умное смещение» - так что, если есть номер проекта, я не хочу видеть под номера.Я хочу видеть под номера в строках ниже и т. Д.

Пример

enter image description here

Что у меня сейчасявляется следующим: = IF (A14 = A13, "", A15) = IF (E15 <> "", "", IF (E14 <> "", B14, B15))

Однако это нене работает идеально - он пропускает этап (подпроект) подряд с номером проекта (инициативы).

Я приложил картинку, потому что это трудно объяснить.

Я в порядке, добавив дополнительные столбцы, если это поможет.

спасибо за помощь, Марек

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Я начал играть с VBA, единственное, что я должен изменить, это то, что каждый раз, когда VBA вставляет строку, каждое значение «i» должно увеличиваться на 1. Так что, если VBA вставил одну строку, это будет i+1 и i + 2, если VBA вставил две строки, это будет i + 2 и ниже i + 3 и т. Д. ... есть идеи, как добраться до этой точки?

Sub test()

Worksheets(2).Activate

lastrow = Range("A3").End(xlDown).Row

For i = 3 To lastrow

    If Cells(i, 8) <> "" Then
    Range(Cells(i + 1, 8), Cells(i + 1, 9)).Select
    Selection.Insert Shift:=xlDown
    Cells(i + 1, 9).Value = Cells(i, 2).Value
    Else
    Cells(i + 1, 9).Value = Cells(i, 2).Value
    End If

Next i

End Sub
0 голосов
/ 22 февраля 2019

Вот решение VBA.В настоящее время требуется, чтобы вы преобразовали свою таблицу в официальную таблицу «Excel», что можно сделать, выделив таблицу данных, перейдя на ленту вставки и выбрав «Таблица».Преимущество этого в том, что этот код будет работать, даже если вы переместили таблицу на листе.

Я назвал свои столбцы «инициативой» и «этапом», и это актуально в строке 8 кода,Эти столбцы должны быть рядом друг с другом, чтобы этот код работал.Вам придется изменить его в соответствии с вашей ситуацией.Вы также можете изменить значение переменной startCell в строке 10.

Public Sub CreateInitiativeListForGnatt()
    Dim tbl As ListObject 'The table object in your worksheet.
    Dim projCols As Range 'The initiative and milestone columns in the table.
    Dim projDict As Object 'The dictionary object we'll use to store key-values of initiative-[milestone1, milestone2, etc]
    Dim startCell As Range

    Set tbl = Worksheets("Sheet1").ListObjects("Table1")
    Set projCols = Range(tbl & "[[initiative]:[milestone]]")
    Set projDict = CreateObject("Scripting.Dictionary")
    Set startCell = Worksheets("Sheet1").Range("D3") 'The first cell of the location where you want the list to be created.

    For Each r In projCols.Rows
        Call AddMilestoneToDictionary(projDict, r.Cells(1).Value, r.Cells(2).Value)
    Next

    Call writeInitiativeListToWorksheet(projDict, startCell)
End Sub

Private Sub AddMilestoneToDictionary(ByRef projDict, initiativeNumber As Variant, milestoneNumber As Variant)
    If projDict.Exists(initiativeNumber) Then
        projDict(initiativeNumber).Add milestoneNumber
    Else
        Set milestones = New Collection
        milestones.Add (milestoneNumber)
        projDict.Add initiativeNumber, milestones
    End If
End Sub

Private Sub writeInitiativeListToWorksheet(ByVal projDict, startCell As Range)
    Dim wrkSht As Worksheet
    Dim currentRow As Integer, initCol As Integer, mileCol As Integer

    Set wrkSht = startCell.Worksheet
    currentRow = startCell.Row
    initCol = startCell.Column
    mileCol = startCell.Column + 1

    For Each initiative In projDict.Keys
        wrkSht.Cells(currentRow, initCol).Value = initiative
        currentRow = currentRow + 1
        For Each milestone In projDict(initiative)
            wrkSht.Cells(currentRow, mileCol).Value = milestone
            currentRow = currentRow + 1
        Next
    Next
End Sub
0 голосов
/ 22 февраля 2019

Вы можете создать сводную таблицу, чтобы выполнить это очень легко:

enter image description here

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