2015-01-16 181 views
1

我試圖在微跟蹤工作表中保留最後365天的可見性。當輸入一個新的日期時,它會隱藏表格中的第一個可見條目,這樣只有365個單元格不斷顯示,最新的日期在底部(例如2015年1月15日)和頂部的最早日期(2014年1月15日)。當用戶輸入Jan 16, 2015時,它會隱藏Jan 15, 2014,因此第一個條目現在是Jan 16, 2014,依此類推。根據日期隱藏行

自從我上次使用VBA以來,它可能已經有大約15年了,但是目前下面顯示的代碼會隱藏第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

A列對不起,不具體說明:) – 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. 你是在一個名爲 「工作表Sheet1」 工作表的工作(如果沒有,更改線路名稱3代碼相應)
  2. 日期在A列,並從第1行開始(即使是隱藏的)。如果日期位於不同列中,則將cells(1, 1)語句中的第二個數字更改爲該行的編號。如果日期不在第1行開始,請將cells(1, 1)語句的第一個數字更改爲第一個日期的行號。

如果您想保留一年前的那一天的行(如1-15-15保持1-15-14),您可能需要更改365第5行代碼爲366。這段代碼還假定除了昨天可見但今天不需要的行之外的所有其他行都已經隱藏起來了。

+0

謝謝。我應該在30分鐘前回家,所以我明天會試試看,並告訴你它是如何工作的。 – Kefo

+0

謝謝凱爾。你的確行得通,但只需要我想一些修改。任何時候都有空白,因爲我們當天沒有運行,它不計數,只是隱藏了行,無論實際日期如何,所以最終它會變得混亂,但它確實對我所問的問題很好。 – Kefo

0

這是一種完全不同的方法,但從長遠來看可能更適合您。

而不是隱藏行以查看您感興趣的內容。此方法使用兩張表。

  1. 記錄表:包含所有天

  2. 報告表:只顯示最近365天重新填滿。

設置涉及:

  • 設置你的報告的第二片了,並給它相同的標題爲您的記錄表。

  • 放置一個模塊中提供的代碼

  • 如果你願意,你可以在工作簿打開,所以當添加一個工作簿時,你可以調用這個子並將其自動更新,或將其連接到一個熱鍵或按鈕。

這給了你足夠的空間來創建新的公式和圖表來工作在報表的設置範圍。您可以隱藏日誌表。

代碼:

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

嗨peege, 是否有可能從2張不同的工作表中獲取信息並將其合併到報告表中?我有一張2014年的表格,現在我們已經開始填寫一份2015年的表格。能否抓住2014年,填入報告,然後抓住2015年並填寫它? 我會把它放在一個按鈕,以限制工作表掛起多長時間,但隨着每個新報告的運行,它會刪除最舊的條目並添加最新的? – Kefo

+0

是的,這是可能的(雖然是一個不同的問題)。我只是將兩者結合成一個大日誌文件,並讓報告抓取最後365天。我不會爲此編寫代碼,因爲這是一次性移動。只需複製2015年的所有記錄,並將其放在2014年的記錄之後。只要您在上面的代碼中將所有記錄都用作日誌表,它就會顯示最後365個記錄,即使這些年份是分開的。 – peege

+0

謝謝peege。我會嘗試稍微玩一下,看看我是否可以從自己的2張不同的表中抓取它。我的老闆想要一個運行的計數器,以便我們總能看到最近的365天,所以我會嘗試修改代碼,以便做他想做的事情。不過謝謝你的出發點。 – Kefo

0

如果你所關心的速度,使用範圍自動篩選方法我回答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事件

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日期差異之內的日期。 HTH。