2017-09-20 11 views
-1

ブックのすべてのページに、ステータスバーで構成されたステータスバーがあります。 「開始されたタブ」、「デザインが更新されました」、「設定完了」の3つのステータスがあります。もともと私は、これらのボックスをすべてのページに(絶対参照を使用して)呼び出されていましたが、私は最近、そのコードを別のモジュールに移動し、上部のすべてのワークブックページで呼び出すことによって、絶対参照ではなく "Find"を使って変数を設定する)。"Out of Stack space"エラーが一貫して一致しない

しかし、これは90%以上の時間で動作しますが、時々 "Out of Stack Space"というエラーメッセージが表示されます。 MSDNで読むと、このエラーを引き起こす可能性のある例はどれも自分のコードに適用されていないようです(コードは自分自身を呼び出さない)。

コードについては下記を参照してください。

'This function is called by all workbook tabs and controls the status boxes 

Sub StatusBars(ByVal Target As Range) 

Dim TabStarted1 As Range 
Set TabStarted1 = ActiveSheet.Range("A4:Z5").Find("Tab Started") 
Dim TabStarted As Range 
Set TabStarted = TabStarted1.Offset(0, 1) 

Dim Design1 As Range 
Set Design1 = ActiveSheet.Range("A6:Z7").Find("Design Updated") 
Dim Design As Range 
Set Design = Design1.Offset(0, 1) 

Dim Configurations1 As Range 
Set Configurations1 = ActiveSheet.Range("A8:Z9").Find("Configurations Complete") 
Dim Configurations As Range 
Set Configurations = Configurations1.Offset(0, 1) 

If Not Intersect(Target, TabStarted) Is Nothing Then 
    If Target.Cells.Count = 2 Then 
     If WorksheetFunction.CountA(Target) = 0 Then 'If box is empty, then add an X, format it, change the box color and the tab color 

      TabStarted.Value = "X" 
      TabStarted.HorizontalAlignment = xlCenter 
      TabStarted.Font.Size = 25 
      TabStarted.Interior.Color = RGB(255, 255, 0) 
      Design.Interior.Color = RGB(255, 255, 255) 
      Design.Value = "" 
      Configurations.Interior.Color = RGB(255, 255, 255) 
      Configurations.Value = "" 
      ActiveSheet.Tab.Color = RGB(255, 255, 0) 

     Else 'if box is already checked clear, the X, the color, and the tab color 
      TabStarted.Interior.Color = RGB(255, 255, 255) 
      TabStarted.Value = "" 
      ActiveSheet.Tab.ColorIndex = xlColorIndexNone 
     End If 
    End If 

End If 

If Not Intersect(Target, Design) Is Nothing Then 
    If Target.Cells.Count = 2 Then 
     If WorksheetFunction.CountA(Target) = 0 Then 
      Design.Value = "X" 
      Design.HorizontalAlignment = xlCenter 
      Design.Font.Size = 25 
      Design.Interior.Color = RGB(0, 112, 192) 
      TabStarted.Interior.Color = RGB(255, 255, 255) 
      TabStarted.Value = "" 
      Configurations.Interior.Color = RGB(255, 255, 255) 
      Configurations.Value = "" 
      ActiveSheet.Tab.Color = RGB(0, 112, 192) 

     Else 
      Design.Interior.Color = RGB(255, 255, 255) 
      Design.Value = "" 
      ActiveSheet.Tab.ColorIndex = xlColorIndexNone 
     End If 
    End If 

End If 

If Not Intersect(Target, Configurations) Is Nothing Then 
    If Target.Cells.Count = 2 Then 
     If WorksheetFunction.CountA(Target) = 0 Then 
      Configurations.Value = "X" 
      Configurations.HorizontalAlignment = xlCenter 
      Configurations.Font.Size = 25 
      Configurations.Interior.Color = RGB(0, 176, 80) 
      TabStarted.Interior.Color = RGB(255, 255, 255) 
      TabStarted.Value = "" 
      Design.Interior.Color = RGB(255, 255, 255) 
      Design.Value = "" 
      ActiveSheet.Tab.Color = RGB(0, 176, 80) 

     Else 
      Configurations.Interior.Color = RGB(255, 255, 255) 
      Configurations.Value = "" 
      ActiveSheet.Tab.ColorIndex = xlColorIndexNone 
     End If 
    End If 

End If 

End Sub 

EDIT: この関数を呼び出すコードの例:

'Remove Case Sensitivity 
    Option Compare Text 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

Application.ScreenUpdating = False 


Dim var1 As Variant 
Dim var2 As Variant 
Dim var3 As Variant 

Dim PlusTemplates As Range 
Set PlusTemplates = Range("A14:Z15").Find("+") 

Call StatusBars(Target) 

[rest of the code] 
Application.ScreenUpdating = True 
End Sub 
+1

'Sub StatusBar'を呼び出すコードを表示できますか?私はあなたがそれを理解することなく再帰に入っていると思います。たとえば、Worksheet_SelectChangeイベントから呼び出している場合、コードが何か変更され、イベントを再入力するとこれが再帰です。 – Vityata

+0

また、完全なエラーメッセージ? – ahmet

+0

@ahmet "Out of stack space"は完全なエラーメッセージです。それはタイトルの*と*質問の本文にあります。 –

答えて

0

Activesheetグローバル変数です。アクティブシートがスタック上にあり、配置されていないために、アクティブシートを使用してtabstarted1などを設定すると、tabstarted1、design1などの他の変数はスタックメモリにとどまります。関数にパラメータとしてactivesheetを取得しようとします。

+0

その外観はどうですか? "Call StatusBars(Target、ActiveSheet)"を介して呼び出すと、Subステータスバー(ByValターゲットを範囲、ActiveSheetをワークシート)として宣言する必要がありますか?変数そのものはどういう意味ですか?私の "Find"にActiveSheet.Rangeを指定する必要がありますか? – Mknerr

+0

私は構文を覚えていませんが、それはあなたのコメントにwrittrenとしてpropablyされます。私は確信していませんが、修正するかどうかはわかりませんが、リファクタリングを試みるときに、変数をカプセル化する必要があります。 – ahmet

0

あなたのコードがシートを変更し、新しいイベントが呼び出されるため、エラーが発生したと思います。これが事実であることを確認するには、次の手順を実行します - このようなイベントにSTOPを挿入します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    Application.ScreenUpdating = False 
    Stop 

    Dim var1 As Variant 
    'rest of your code. 
End Sub 

最初の時間をあなたがストップで停止します選択の変更を持っています。その後、F5を押し続けます。再度停止すると、再帰エラーとなります。

これを修正する最も簡単な方法は、イベントの開始時にApplication.EnableEvents = False、コードの最後にApplication.EnableEvents = Trueとすることです。

+0

これはスタックスペースの問題に役立ったようですが、他の問題が発生した場合、EnableEventsが再度有効になっていないため、Excelが本質的にフリーズしています。 StatusBars()関数を呼び出した直後に.EnableEvents = Trueを使用することには欠点がありますか?私はまだ関数内の "Set TabStarted = TabStarted1.Offset(0、1)"行をハイライト表示するときどきのエラー(「ブロック変数が設定されていません」エラーであると思われます)が発生しています。 – Mknerr

関連する問題