2015-01-16 3 views
1

Я стараюсь, чтобы последние 365 дней были видны на листе микротрещин. По мере ввода новой даты он скроет первую видимую запись на листе, так что только 365 ячеек будут постоянно отображаться с самой новой датой внизу (например, 15 января 2015 года) и самой старой датой наверху (15 января 2014 года)). Когда пользователь вводит Jan 16, 2015, он скроет Jan 15, 2014, так что первая запись будет теперь Jan 16, 2014 и так далее.Скрыть строки по дате

Возможно, прошло около 15 лет с тех пор, как я последний раз использовал VBA, но в настоящее время код, показанный ниже, скроет строку 3 (где введена первая дата и данные), но после этого я не могу получить ее, чтобы скрыть строку 4 после строки 369 введен текст. Некоторое понимание того, что я делаю неправильно, было бы весьма полезно.

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

Dim i As Integer 
Dim j As Integer 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    i = 3 
    j = 368 
    If Cells(j, j) = "" Then 
     Rows(i).Hidden = True 
    End If 
    i = i + 1 
    j = j + 1 
End Sub 
+0

В какой колонке у вас есть даты? –

+0

Столбец А. Извините за то, что не уточнил об этом :) – Kefo

ответ

0

Это должно сделать трюк:

Sub HideRows() 
    Dim lngLastRow As Long 
    lngLastRow = Sheets("Sheet1").Cells(1, 1).End(xlDown).Row 
    If lngLastRow < 365 Then End 
    Rows(lngLastRow - 365).Hidden = True 
End Sub 

Это при условии, что:

  1. вы работаете в листе под названием «Лист1» (если нет, измените имя в строке 3 кода)
  2. даты указаны в столбце A и начинаются в строке 1 (даже скрытые). Если даты находятся в другом столбце, измените второе число в операторе cells(1, 1) на номер строки. И если даты не начинаются в строке 1, измените первое число оператора cells(1, 1) на номер строки первой даты.

И если вы хотите сохранить строку в течение дня ровно один год назад (как, держать 1-15-14 на 1-15-15), возможно, потребуется изменить 365 в строке 5 из код до 366. Этот код также предполагает, что все остальные строки, кроме того, что было видно вчера, но не должны быть сегодня, уже скрыты.

+0

Спасибо за это. Я должен был уйти домой 30 минут назад, поэтому я попробую это завтра и дам вам знать, как это работает. – Kefo

+0

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

0

Это совершенно другой подход, но в долгосрочной перспективе он может подойдет вам лучше.

Вместо того, чтобы прятать строки, чтобы посмотреть, что вас интересует. Этот подход использует два листа.

  1. Log Sheet: Содержит все дни

  2. Форма отчета: Re заполняет только за последние 365 дней.

Установка Участвуйте:

  • Установить вторую простыню для отчета, и дать ему те же заголовки, как ваш Log Sheet.

  • Поместите код, предоставленный в модуле

  • Если вы хотите, вы можете добавить событие рабочей книги так, когда открывается книга, вы можете вызвать этот подпункт и он обновить себя, или прикрепить его к горячей клавише или кнопку.

Это дает вам достаточно места для создания новых формул и диаграмм для работы над заданным диапазоном листа отчета. Вы можете скрыть лист журнала.

Код:

Sub lastYearReportFill() 

Dim lastRow As Long, lastCol As Long, lRow As Long, rRow As Long 
Dim log As String, report As String 
Dim today As Date, tempDate As Date 
Dim daysTest As Long 

log = "Log"    'Name your worksheets here 
report = "Report" 
today = Now 

lastRow = Sheets(log).Range("A" & rows.count).End(xlUp).row 
lastCol = Sheets(log).Cells(2, Columns.count).End(xlToLeft).column 'Using Header Row 

    For lRow = 3 To lastRow 
     tempDate = Sheets(log).Cells(lRow, 1) 
     daysTest = DateDiff("d", tempDate , today) 
     If daysTest = 365 Then 
      Exit For 
     End If 
    Next lRow 

    For rRow = 3 To 368 
     For lCol = 1 To lastCol 
      Sheets(report).Cells(rRow, lCol).Value = Sheets(log).Cells(lRow, lCol).Value 
     Next lCol 
     lRow = lRow + 1 
    Next rRow 

End Sub 
+0

Hi peege, Можно ли получить информацию с двух разных листов, чтобы объединить их в лист отчета? У меня есть лист 2014 и теперь лист 2015 года, который мы начали заполнять. Может ли он захватить 2014 год, заполнить его в отчете, а затем захватить 2015 год и заполнить его? Я бы поставил это на кнопку, чтобы ограничить, как долго лист зависает, но по мере запуска каждого нового отчета он удалит самую старую запись и добавит новейшую? – Kefo

+0

Да, это возможно (хотя другой вопрос). Я бы просто объединил их в один большой файл журнала, и пусть отчет захватывает последние 365 дней. Я бы не написал для этого код, поскольку это одноразовый ход. Просто скопируйте все записи с 2015 года и разместите их после записей за 2014 год. Пока вы ссылаетесь на этот лист со всеми записями в качестве логарифмического листа в приведенном выше коде, он покажет вам последние 365, хотя годы являются отдельными. – peege

+0

Спасибо, peege. Я попытаюсь немного поиграть с ним и посмотреть, смогу ли я получить его от двух разных листов. Мой босс хочет запустить подсчет так, чтобы мы всегда видели последние 365 дней, поэтому я попытаюсь изменить код достаточно, чтобы делать то, что он хочет. Спасибо за начальную базу. – Kefo

0

Если вы обеспокоены скоростью, используйте Range автофильтр метод который я ответил HERE.
Применяя его к делу:

Private Sub UpdateVisibleDates(sh As Worksheet, drng As Range) 
    With sh 
     Dim latest As Date 
     latest = .Range("A:A").Find("*", .Range("A1"), , , , xlPrevious).Value2 
     .AutoFilterMode = False 
     drng.AutoFilter 1, ">" & (latest - 365), xlAnd, "<=" & latest, False 
    End With 
End Sub 

Тогда просто вызовите ее в Worksheet_Change Event.

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo halt 
    Application.EnableEvents = False 
    If Not Intersect(Target, Me.Range("A:A")) Is Nothing Then 
     Dim r As Range 
     Set r = Me.Range("A1:A" & Me.Range("A:A") _ 
      .Find("*", Me.Range("A1"), , , , xlPrevious).Row) 
     UpdateVisibleDates Me, r 
    End If 
forward: 
    Application.EnableEvents = True 
    Exit Sub 
halt: 
    MsgBox "Error: " & Err.Number & vbCrLf & _ 
     Err.Description, vbExclamation 
    Resume forward 
End Sub  

Это считается, что у вас есть полная дата в столбце A, и ваш ввод не пропускает даты.
Но, несмотря на это, он по-прежнему будет скрывать даты не в пределах даты 365 даты последней введенной даты. НТН.

Смежные вопросы