1

Я хотел бы написать (скопировать) модуль, который преобразует определенные строки в две строки и редактирует исходную строку. Например, я хотел бы преобразовать это:

6/1/2015    16:25    1:00

к этому:

6/1/2015    16:25    23:59
6/2/2015    0:00     1:00

Я определил строки, с которыми хотел бы сделать это, в другом столбце. И есть другие столбцы в строках, которые я хотел бы просто скопировать вниз.

Буду признателен за любую помощь и / или учебные пособия по VBA, которые вы порекомендуете, чтобы я мог написать это самостоятельно.

образ

3 ответа3

2

Этот код должен помочь:

Public Sub splittime()
    Application.ScreenUpdating = False
    firstrow = 2
    firstcopycolumn = 4
    lastcopycolumn = 7
    sheetname = "Sheet1"
    Dim wkb As Workbook
    Dim wks As Worksheet
    Set wkb = ThisWorkbook
    Set wks = wkb.Sheets(sheetname)
    therow = firstrow
    usedrow = True
    affrows = 0
    While usedrow
        thedate = wks.Cells(therow, 1)
        If thedate <> "" Then
            firstdate = wks.Cells(therow, 2)
            lastdate = wks.Cells(therow, 3)
            If lastdate < firstdate Then
                Rows(therow + 1).Insert shift:=xlShiftDown
                wks.Cells(therow + 1, 1) = thedate + 1
                wks.Cells(therow + 1, 2) = "0:00"
                wks.Cells(therow + 1, 3) = lastdate
                wks.Range(Cells(therow + 1, firstcopycolumn), Cells(therow + 1, lastcopycolumn)).Value = wks.Range(Cells(therow, firstcopycolumn), Cells(therow, lastcopycolumn)).Value
                wks.Cells(therow, 3) = "23:59"
                affrows = affrows + 1
            End If
            therow = therow + 1
        Else
            usedrow = False
        End If
    Wend
    Application.ScreenUpdating = True
    themessage = MsgBox("Finished" & vbCrLf & "Affected rows: " & affrows, vbInformation)
End Sub

Чтобы использовать макросы, следуйте этому руководству или просто откройте VBA/ Macros с помощью ALT+ F11, в ThisWorkbook вставьте новый модуль и вставьте код.

Переменная firstrow может быть настроена в соответствии с вашими потребностями.

Кроме того, с помощью переменных firstcopycolumn и lastcopycolumn вы можете определить, какой диапазон столбцов будет скопирован.

1

У вас есть конкретная причина желать сделать это в VBA?  Я решил похожую проблему несколько месяцев назад, используя формулы; Я адаптировал это решение к вашей проблеме.

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

       A          B       C       D       E         F
1   Date        Start    End    User    Color   Overnight
2   5/28/2015   15:00   21:00   Fred    Green
3   6/1/2015    16:25    1:00   Henry   Red     1
4   6/4/2015     9:00   13:00   Mary    Blue

где каждая строка представляет событие с датой, временем начала, временем окончания и другими данными.  Некоторые события происходят в одночасье (т.е. они начинаются до полуночи и заканчиваются после полуночи).  Вы пометили эти события как 1 в столбце F (хотя нет необходимости делать это вручную; вы можете просто установить F2 =B2>C2 и перетащить вниз).  Ни одно мероприятие не длится более 24 часов, поэтому невозможно, чтобы мероприятие начиналось в 10:00 в понедельник и заканчивалось в 11:00 во вторник (или, если есть, у вас есть какой-то способ идентифицировать те события, которых у вас нет описано, и вы правильно установили столбец F ).  В любом случае, ни одно событие не будет длиться более двух дней (например, у вас никогда не будет мероприятия, начинающегося в 23:00 в понедельник и продолжающегося до 1:00 в среду).  Вы хотите разделить каждое многодневное (то есть, ночное) событие на две строки: одну в первый день, со времени начала до полуночи (или 23:59), а другую во второй день, с полуночи до времени окончания. ,  Вы хотите, чтобы все остальные данные, связанные с событием, были реплицированы в обе строки.  Итак, для приведенных выше данных, вы хотите

       A          B       C       D       E
1   Date        Start    End    User    Color
2   5/28/2015   15:00   21:00   Fred    Green
3   6/1/2015    16:25   23:59   Henry   Red
4   6/2/2015     0:00    1:00   Henry   Red
5   6/4/2015     9:00   13:00   Mary    Blue

в следствии.

Мое решение:

Я предполагаю, что вы используете не более 23 столбцов, поэтому столбцы X , Y и Z доступны для использования в качестве «вспомогательных столбцов».

  • Создайте новый лист.  Предположим, что существующим листом является Sheet1 а новым - Sheet2 .  Следующие шаги будут копировать данные из Sheet1 в Sheet2 , разбивая строки.
  • Скопировать заголовки столбцов из Sheet1 строки 1, к Sheet2 строка 1.
  • Введите =INDEX(Sheet1!A:A, $X2)+$Y2 в Sheet2!A2 .
  • Enter =IF($Y2=0, INDEX(Sheet1!B:B, $X2), 0) в Sheet2!B2 .
  • Введите =IF(AND($Y2=0,$Z2>0), TIME(23,59,59), INDEX(Sheet1!C:C, $X2)) в Sheet2!C2 .
  • Введите =INDEX(Sheet1!D:D, $X2) в Sheet2!D2 и перетащите / заполните вправо, чтобы покрыть все ваши данные (т. Е. В столбце E , в моем примере).
  • Скопируйте Sheet1:A2:E2 и вставьте форматы (и ширину столбцов, если необходимо) в Sheet2:A2:E2 .
  • Введите 2 в Sheet2!X2 .  Это обозначает строку на Sheet1 которой эта строка (на Sheet2) будет извлекать данные.
  • Введите 0 в Sheet2!Y2 .
  • Введите =INDEX(Sheet1!F:F, $X2) в Sheet2!Z2 .  Это создает локальную копию индикатора «овернайт».
  • Выберите Sheet2!A2:Z2 и перетащите / заполните вниз в строку 3.
  • Изменить Sheet2!X3 до =IF(AND(Y2=0,Z2>0), X2, X2+1) .
  • Изменить Sheet2!Y3 до =IF(AND(Y2=0,Z2>0), Y2+1, 0) .
  • Выберите Sheet2!A3:Z3 и перетащите / заполните так далеко, как вам нужно, чтобы получить все свои данные.

Это должно выглядеть примерно так:

       A          B       C       D       E                          X   Y   Z
1   Date        Start    End    User    Color
2   5/28/2015   15:00   21:00   Fred    Green                        2   0   0
3   6/1/2015    16:25   23:59   Henry   Red                          3   0   1
4   6/2/2015     0:00    1:00   Henry   Red                          3   1   1
5   6/4/2015     9:00   13:00   Mary    Blue                         4   0   0

Заметки:

  • Как указано в инструкции, Sheet2!Xn указывает строку на Sheet1 которой строка n (на Sheet2) будет извлекать данные.
  • Sheet2!Yn - это однозначное число в Sheet2!Xn ; то есть в пределах строки Sheet1 ; то есть в рамках события.  Для ночного мероприятия Y будет 0 для сегмента до полуночи и 1 для сегмента после полуночи.  Например, поскольку строки 3 и 4 на Sheet2 данные из строки 3 Sheet1 , мы имеем X3 = X4 = 3 и Y3 , Y4 = 0, 1.

Чтобы сделать это постоянным, вы можете копировать и вставлять значения, а также удалять столбцы X , Y и Z

-1

Я бы сначала создал 3 новых столбца. Используйте формулу Excel для расчета новой базы данных по исходным столбцам. Затем возьмите 3 новых столбца, CUT и PASTE в нижней части ваших первых 3 столбцов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .