Как изменить код ячейки после ее перемещения в Excel с помощью VBA - PullRequest
1 голос
/ 03 апреля 2012

У меня есть сценарий Excel VBA, который я написал с помощью, я не новичок, когда дело доходит до кодирования, но для меня до сих пор Excel VBA был кошмаром мышьяка, завернутым в сахарную таблетку, продаваемую MS как язык легко обучаема.

Хорошо, разглагольствовать, извините, но я отвлекся.

Вот полный скрипт:

Option Explicit

Sub tgr()

    Dim wsB As Worksheet 'BackOrder
    Dim wsJ As Worksheet 'Jobs List
    Dim wsA As Worksheet 'Archive
    Dim LastRow As Long

    Set wsB = Sheets("BackOrder")
    Set wsJ = Sheets("Jobs List")
    Set wsA = Sheets("Archive")

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With

    With Intersect(wsJ.UsedRange, wsJ.Columns("N"))
        .AutoFilter 1, "<>Same"
        With Intersect(.Offset(2).EntireRow, .Parent.Range("B:L"))
            .Copy wsA.Cells(Rows.Count, "B").End(xlUp).Offset(1)
            .EntireRow.Delete
        End With
        .AutoFilter
    End With

    LastRow = wsB.Range("B6").End(xlDown).Row
    wsB.Range("P5:Q5").Copy wsB.Range("P6:Q" & LastRow)
    Calculate
    wsB.UsedRange.Copy Sheets.Add.Range("A1")

    With Intersect(ActiveSheet.UsedRange, ActiveSheet.Columns("Q"))
        .AutoFilter 1, "<>Different"
        .EntireRow.Delete
        With .Parent
            .AutoFilterMode = False
            Intersect(.UsedRange, .Columns("G")).Cut .Range("F1")
            Intersect(.UsedRange, .Columns("H")).Cut .Range("G1")
            Intersect(.UsedRange, .Columns("L")).Cut .Range("H1")
            Intersect(.UsedRange, .Columns("N")).Cut .Range("I1")
            Intersect(.UsedRange, .Range("B:J")).Copy wsJ.Cells(Rows.Count, "B").End(xlUp).Offset(1)
            .Delete
        End With
    End With

    LastRow = wsJ.Cells(Rows.Count, "B").End(xlUp).Row
    wsJ.Range("M1:T1").Copy
    wsJ.Range("B3:I" & LastRow).PasteSpecial xlPasteFormats
    wsJ.Range("U1:W1").Copy wsJ.Range("J3:L" & LastRow)
    wsJ.Range("X1:Y1").Copy wsJ.Range("M3:N" & LastRow)

    With Application
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With

End Sub

Как вы видите, это трехстраничный скрипт BackOrder, Jobs List и Archive, который мне нужно сделать в Archive. Ячейки в столбцах в J & K используют TODAY () как способ сообщить остальной части скрипта, когда он просматривает ячейку в столбце F, на сколько дней раньше или позже.

Столбец J показывает рано, Столбец K показывает поздно.

Сценарий столбца J:

=IF(F3-TODAY()<0,"",F3-TODAY())

Сценарий столбца K:

=IF(TODAY()-F3<1,"",TODAY()-F3)

Столбец F в этом случае является частью более крупного скрипта, который перемещает данные через импорт и не имеет форматирования.

Теперь, когда я перенесу строку в архив, я хочу, чтобы она находилась там, где ячейки, вместо того, чтобы иметь TODAY () в любом сценарии, я хочу, чтобы она показывала дату, когда она была перемещена туда, так что она все еще будет сегодня. , но вместо TODAY () будет указана дата в этом формате ## / ## / ##. Он «замораживает» счет J & K, поэтому он будет точным с того дня, поэтому мы будем знать, был ли он отправлен поздно, рано или вовремя.

Возможно ли это, и если да, то как?

1 Ответ

1 голос
/ 04 апреля 2012

Вы путаете функции листа и функции VBA. Вы слишком быстро прекратили разглагольствовать, хотя Word VBA - худшая версия.

С помощью пользовательского интерфейса я могу перейти в ячейку A1 и набрать "4apr12". Excel распознает это как дату, сохраняет значение как 41003 и устанавливает формат «dd-mmm-yy», который является стандартным форматом, наиболее близким к тому, что я набрал.

В качестве альтернативы, я мог бы набрать "41003", затем перейти в меню формата и выбрать или ввести формат даты по своему выбору.

Еще один вариант - набрать "= СЕГОДНЯ ()". Excel сохраняет значение как "= TODAY ()", но из-за начальных равных он оценивает его как выражение при вводе и отображает значение как стандартную дату (формат дд / мм / гг здесь в Великобритании) и повторно -оценивает выражение, когда рабочая книга открывается и сохраняется, и когда ей говорят сделать это с помощью параметров Рассчитать.

Функции VBA разные. Даже когда они делают одно и то же, они часто имеют разные имена. Ближайшим эквивалентом TODAY () является Now (). Эта функция возвращает текущую дату и время в виде числа. Целая часть - дни с 1 января 1900 года; дробная часть равна (количество секунд с полуночи) / (количество секунд в дне). Поэтому сегодня в полдень Now () вернул бы «41003,5». Это число; Я могу умножить его на два, вычесть 5000 или что-то еще.

С VBA я мог бы выполнить:

Range("A1").Value = "4apr12"

Excel распознает это как дату так же, как если бы я набрал ее из пользовательского интерфейса.

В качестве альтернативы, я мог бы выполнить:

Range("A1").Value = 41003.5

Это просто число, которое будет сохранено и отображено как 41003.5.

Если я хочу, чтобы оно отображалось как дата, я должен выполнить:

With Range("A1")
  .Value = 41003.5
  .NumberFormat = "dd mmm yy"
End With

Значение все еще сохраняется как 41003.5, но я сказал Excel показать его как 4 апреля 12.

Я могу выполнить:

Range("A1").Value = "=TODAY()"

Это обрабатывается так же, как если бы я набрал эту формулу из интерфейса.

Но предположим, я выполню:

With Range("A1")
  .Value = Now()
  .NumberFormat = "dd mmm yy"
End With

Now () возвращает текущую дату и время в виде числа. Excel хранит это как число, но отображает как дату, потому что я сказал это. Он никогда не будет переоценивать, потому что это простое числовое значение, а не выражение с функциями.

Я надеюсь, что это имеет смысл и поможет вам разобраться в различиях между функциями рабочего листа и функциями VBA. Excel и VBA - это как учиться водить машину. В первый раз, когда вы ЗНАЕТЕ, вы НИКОГДА не сможете делать все эти разные вещи одновременно. Тем не менее, через месяц или два, вы играете с педалями, рычагом переключения передач, колесом и индикатором, проверяя зеркало. Я не понимаю, почему люди думают, что похлопывание по голове и потирание живота так важны. Все, что я могу сказать, это то, что внезапно туман рассеется и Excel и VBA обретут смысл.

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