2016-10-11 15 views
2

このコードを書いていますが、間に追加のフィラーが入っています。選択した時点に応じて、適切な行が非表示になります。VBAコード - 他の一部が実行されている場合は、一部をスキップします

コンテナ1は常に満たされますが、別のコンテナが選択されていない場合は、残りのコードを処理せずに残りの行をすべて非表示にします。したがって、コンテナ1とコンテナ2を選択すると、残りのコードを実行することなく、コンテナ1と2が選択されます。

ループとしてこれを書き換えることは、非常に多くの可能なタイムポイントがあるため、信じられないほど複雑になります。これは関連性のないコードをスキップする問題です。ほとんどのgoto線や何かのような?知りません!

DisplayPageBreaks、ScreenUpdating、Enable Eventsを一時的に無効にするよりも効率的にこのコードを実行する方法はありますか?このページには計算が行われず、行の非表示のみが行われます。

たとえば、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'や' Select'と適切な字下げで、これを行うことができます。 – R3uK

+0

ローカル変数を使用します。 w =ワークシート( "StabDataCapture")とそれらを後で参照する(またはブロックを使用する)と、非常に小さな改善が得られるかもしれません(選択されたセルの変更ごとにこの関数が呼び出される場合にのみカウントされます)。私もApplication.Calculation = xlManualを試してみます。たとえ多くの計算がないと思っても。しかし、なぜあなたのコードが遅くなるべきかわかりません。そしてR3uKも述べたように、このインデントはひどいものです。 – z32a7ul

+0

この関数を別の関数から呼び出す場合は、DisplayPageBreaksやEnableEventsなどの値を保存し、最後に元の値に戻します。そうでなければ、このサブの呼び出し元は、これらの最適化を使用していれば、それらの最適化を失う可能性があります。 – z32a7ul

答えて

1

あなたはExit Subを使用し

Sub Restart_Screen() 
With Application 
    .EnableEvents = True 
    .ScreenUpdating = True 
    .StatusBar = vbNullString 
End With 
End 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行以上あり、見つけて置き換えても一日かかるでしょう。私は将来の実装でこれを間違いなく使用します。 私はそれをモジュールに分割しました。この1行のコード(x3)は、この問題を回避する方法です。 ご協力いただきありがとうございます。 – vividillusion

+0

Worksheets( "StabDataCapture")。範囲( "q26")。値<> 0 Then Container2 Else Worksheets( "Template")行( "142:1048576")。EntireRow.Hidden = True – vividillusion

関連する問題