2016-10-11 32 views
2

我寫這段代碼但燒燬了兩者之間的附加填料。根據選定的時間點,它將隱藏適當的行。VBA代碼 - 跳過一些地方,如果一些別人excecuted

容器1每時每刻都會有,但是,如果沒有選擇另一個容器中,我希望它可以隱藏所有剩餘的行而不處理代碼的其餘部分。因此,如果選擇容器1和2,它將運行這些代碼而不運行代碼的其餘部分。

,因爲有這麼多的可能的時間點,改寫本作爲循環將是極其複雜的,它更跳過不相關的代碼的問題。幾乎像goto線或什麼的?我不知道!

是否有任何其他的方式,使這個代碼的運行效率比暫時禁用DisplayPageBreaks,ScreenUpdating和啓用活動?沒有計算在頁面上執行,只有行隱藏。

例如,如果Q26是空白的(無容器2)我希望它去的代碼末尾,沒有處理任何東西,但我怎麼寫它,它仍然處理代碼的其餘部分。

感謝您的幫助

If Worksheets("StabDataCapture").Range("q26").Value = "" Then Worksheets("Template").Rows("142:1048576").EntireRow.Hidden = True Else 

謝謝您的幫助!

Sub Containers() 

Dim xPctComp As Integer 

Application.StatusBar = "Container 1: " & _ 
    Format(xPctComp, "##0%") 

ActiveSheet.DisplayPageBreaks = False 
Application.EnableEvents = False 
Application.ScreenUpdating = False 



'CONTAINER 1 ROW HIDES 

'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 

'Show/Hide [email protected] 

    If Worksheets("StabDataCapture").Range("B33").Value = "" Then 
     Worksheets("Template").Rows("8:8").EntireRow.Hidden = True 
    End If 

Application.StatusBar = "Container 2: " & _ 
    Format(xPctComp, "##25%") 

If Worksheets("StabDataCapture").Range("q26").Value = "" Then Worksheets("Template").Rows("142:1048576").EntireRow.Hidden = True Else 

'CONTAINER 2 ROW HIDES 

'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 

'Show/Hide [email protected] 

    If Worksheets("StabDataCapture").Range("P33").Value = "" Then 
       Worksheets("Template").Rows("146:146").EntireRow.Hidden = True 
    End If 

Application.StatusBar = "Container 3: " & _ 
    Format(xPctComp, "##50%") 

'CONTAINER 3 ROW HIDES 

If Worksheets("StabDataCapture").Range("c91").Value = "" Then Worksheets("Template").Rows("280:1048576").EntireRow.Hidden = True Else 

'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 

'Show/Hide [email protected] 

    If Worksheets("StabDataCapture").Range("B98").Value = "" Then 
     Worksheets("Template").Rows("284:284").EntireRow.Hidden = True 
    End If 
Application.StatusBar = "Container 4: " & _ 
    Format(xPctComp, "##75%") 

If Worksheets("StabDataCapture").Range("q91").Value = "" Then Worksheets("Template").Rows("418:1048576").EntireRow.Hidden = True Else 


'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 

'Show/Hide [email protected] 

    If Worksheets("StabDataCapture").Range("P98").Value = "" Then 
       Worksheets("Template").Rows("422:422").EntireRow.Hidden = True 
    End If 

Application.EnableEvents = True 
Application.ScreenUpdating = True 
Application.StatusBar = "" 

End Sub 
+0

你可以嘗試使用'GoTo',但這不是很推薦......或者只是用更多的邏輯重新排列你的代碼!不需要循環,但使用'If's或'Select's和正確的縮進,你可以這樣做 – R3uK

+0

使用局部變量,例如w =工作表(「StabDataCapture」)並稍後引用它們(或With塊)可能會提供一個非常小的改進(只有在爲每個選定單元格的更改調用此函數時纔會計數)。我也會嘗試Application.Calculation = xlManual,即使你認爲沒有太多的計算。但是,我沒有看到爲什麼你的代碼應該很慢。正如R3uK也指出的那樣,這種縮進是可怕的。 – z32a7ul

+0

如果您也從另一個調用此函數,則保存DisplayPageBreaks,EnableEvents等的值,並在最後將其恢復到原始值。否則,這個子的調用者可能會放棄這些優化,如果它也使用它們的話。 – z32a7ul

回答

1

你需要一個程序來重新激活屏幕和事件,

Sub Restart_Screen() 
With Application 
    .EnableEvents = True 
    .ScreenUpdating = True 
    .StatusBar = vbNullString 
End With 
End Sub 

使用Exit Sub,它看起來是這樣的:

Sub test_vividillusion() 
Dim xPctComp As Integer 
Dim wS As Worksheet 
Dim wsT As Worksheet 
Set wS = Sheets("StabDataCapture") 
Set wsT = Sheets("Template") 

With Application 
    .EnableEvents = False 
    .ScreenUpdating = False 
    .StatusBar = "Container 1: " & Format(xPctComp, "##0%") 
End With 
ActiveSheet.DisplayPageBreaks = False 

'CONTAINER 1 ROW HIDES 
'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
'Show/Hide [email protected] 
If wS.Range("B33").Value = vbNullString Then wsT.Rows("8:8").EntireRow.Hidden = True 
Application.StatusBar = "Container 2: " & Format(xPctComp, "##25%") 

If wS.Range("q26").Value = vbNullString Then 
    wsT.Rows("142:1048576").EntireRow.Hidden = True 
    Restart_Screen 
    Exit Sub 
Else 
End If 

'CONTAINER 2 ROW HIDES 
'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
'Show/Hide [email protected] 
If wS.Range("P33").Value = vbNullString Then wsT.Rows("146:146").EntireRow.Hidden = True 
Application.StatusBar = "Container 3: " & Format(xPctComp, "##50%") 

If wS.Range("c91").Value = vbNullString Then 
    wsT.Rows("280:1048576").EntireRow.Hidden = True 
    Restart_Screen 
    Exit Sub 
Else 
End If 
'CONTAINER 3 ROW HIDES 
'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
'Show/Hide [email protected] 
If wS.Range("B98").Value = vbNullString Then wsT.Rows("284:284").EntireRow.Hidden = True 
Application.StatusBar = "Container 4: " & Format(xPctComp, "##75%") 

If wS.Range("q91").Value = vbNullString Then 
    wsT.Rows("418:1048576").EntireRow.Hidden = True 
    Restart_Screen 
    Exit Sub 
Else 
End If 

'@@@@@@@@@@@@@@@@@@@@@@@@@@@ 60°C @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
'Show/Hide [email protected] 
If wS.Range("P98").Value = vbNullString Then wsT.Rows("422:422").EntireRow.Hidden = True 
Restart_Screen 
End Sub 
+0

然而,這樣做的確很好,但是會有超過400行代碼需要更新,即使使用查找和替換也需要一整天的時間。我一定會在未來的實現中使用它。 我把它分解成模塊,這一行代碼(x3)是我如何解決這個問題。 感謝您的幫助! 。 – vividillusion

+0

如果工作表( 「StabDataCapture」)範圍( 「Q26」)值<> 0,則container2的否則工作表( 「模板」)行( 「142:1048576」)。EntireRow.Hidden =真 – vividillusion