Vba - назначение формата даты столбцу и применение фильтра даты

У меня есть два макроса, которые фильтруют столбец листа по дате, а затем удаляют ненужные столбцы.

Однако он очень глючный, и мне нужна помощь, чтобы исправить это, пожалуйста.

Вот что должно произойти с первым макросом:

1) Отформатируйте столбец B от строки 2 до последней строки в формате даты дд-мм-гггг - в настоящее время этого не происходит, и в какой-то момент он применял формат ко ВСЕМУ столбцу B, включая пустые ячейки после данных

2) Примените фильтр к столбцу B (дата), чтобы отобразить все записи, кроме дня, предшествующего текущему дню. - Половина правильно, потому что не учитывает текущий день в фильтре. Когда я запускаю макрос «удалить», отображаются ячейки текущего дня и предыдущего дня, я должен видеть только предыдущий день.

Sub DateFilter()

Dim ws1 As Worksheet
Dim c As Range
Dim LastRow As Long
Dim Current_Date As Date

On Error Resume Next

Set ws1 = ActiveWorkbook.Sheets("Sheet")

LastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row

With ws1

    For Each c In ActiveSheet.Range("B2:B" & LastRow).Cells

        Current_Date = CDate(c)
        c.Value = Current_Date

    Next c

End With

x = CLng(Date)
ws1.UsedRange.AutoFilter Field:=2, Criteria1:="<" & x, Operator:=xlAnd, Criteria2:="<" & x - 1

End Sub

Это похоже на 4 отдельных вопроса или, по крайней мере, более одного? Я бы связал каждое сообщение с одним вопросом. В вашем первом «LastRow» определяется в терминах столбца A - возможно, в этом проблема. Почему просто не применяют формат?

SJR 11.04.2018 12:33

@SJR мои извинения, я обновил пост и удалил вторую часть вопроса. Я постараюсь больше не делать этого в будущем. :)

Eitel Dagnin 11.04.2018 13:58

@SJR Что касается вашего второго вопроса, некоторые поля в столбце B - мм-дд-гггг, а некоторые - гггг-мм-дд, но я хочу, чтобы все они были дд-мм-гггг.

Eitel Dagnin 11.04.2018 14:02

Хорошо спасибо. См. Ответ @Zac, хотя это может потребовать некоторой доработки в свете этой информации.

SJR 11.04.2018 14:03
0
4
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предположил @SJR, у вас слишком много вопросов в одном посте, поэтому я рассмотрю только первый макрос. Чтобы получить разрешение для вашего второго макроса, начните новую тему

Код ниже должен соответствовать вашим требованиям для первого макроса с некоторыми комментариями, которые помогут вам понять код.

Sub DateFilter()

    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet")

    ' On Error Resume Next      VERY very bad idea as this will hide all issues in the code!

    With oWS

        ' Set the range format to specified date format. This will automatically update
        ' the values in the cells to a date.. no need to copy and paste them
        .Range("B2:B" & .Cells(.Rows.count, 2).End(xlUp).Row).NumberFormat = "dd-mm-yyyy"

        ' Set the autofilter to display all dates other than yesterdays
        .Range("B:B").AutoFilter Field:=1, Criteria1:="<" & CLng(DateAdd("d", -1, Date)), Operator:=xlOr, Criteria2:=">" & CLng(DateAdd("d", -1, Date))

    End With

End Sub

Спасибо за этот код и ваши комментарии, я ценю это. Код работает, за исключением одной проблемы, о которой я упоминал в ответе на SJR выше, некоторые поля в столбце B - мм-дд-гггг, а некоторые - гггг-мм-дд, но я хочу, чтобы все они были дд- мм-гггг. После применения фильтра все еще отображаются поля в формате гггг-мм-дд.

Eitel Dagnin 11.04.2018 14:05

Хммм, странно, у меня работает. Можете ли вы предоставить образец своего листа в своем вопросе?

Zac 11.04.2018 14:30

Я вижу, что есть некоторые поля, которые также отображаются только как общее число. Вот почему мне нужно было применить формат даты. Я выложу образец в ближайшее время.

Eitel Dagnin 11.04.2018 14:31

Я не знаю, что сказать @Zac, я просто попробовал снова, и он сработал на 100%. Итак, я полагаю, это решено! Спасибо за помощь :)

Eitel Dagnin 11.04.2018 14:40

Нет проблем, рад, что помог

Zac 11.04.2018 14:44

Я пробовал макрос на другом листе, и ячейки с yyyy-mm-dd не были изменены на dd-mm-yyyy

Eitel Dagnin 11.04.2018 15:27

Вы не забыли изменить имя листа в подпрограмме?

Zac 11.04.2018 15:50

Да, @Zac, я сделал. Я сразу вижу две даты, которые не меняются в моих данных - 2016-10-11 (строка 42) и 2017-05-26 (строка 94). Что происходит, так это то, что фильтр «скрывает» эти строки.

Eitel Dagnin 11.04.2018 16:18

Формат изменен до применения фильтра .. запутался. Как и раньше, если вы можете предоставить образец своего листа, я могу протестировать ваши данные.

Zac 11.04.2018 16:27

Я знаю, что это будет звучать довольно глупо, но я не могу понять, как загрузить вложение к моему вопросу ... У меня есть книга с образцами, готовая для вас, но я не могу найти кнопку загрузки ...

Eitel Dagnin 11.04.2018 16:30

Это определенно не глупо, потому что я тоже не знаю ответа на этот вопрос, так как я уже очень давно не задавал здесь вопросов (ну, на днях я задал вопрос, но мне никогда не приходилось загружать файлы). Может быть, стоит спросить SJR? :)

Zac 11.04.2018 16:33

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

Eitel Dagnin 11.04.2018 16:42

Извинения, я отвечаю только сейчас. Мне удалось заставить код работать, объединив ваш код и код из моего фактического сообщения. Я использовал цикл For Each из своего кода внутри вашего блока with и удалил вашу первую строку кода внутри блока with, и это помогло :)

Eitel Dagnin 12.04.2018 10:18

Другие вопросы по теме