2016-08-27 9 views
1

以下のコードを使用して、Excelでユーザーが共有するファイルのアドインを参照するパスを削除しています。それはいくつかのファイルで動作しますが、新しいファイルでそれを使用し、オープン時にランタイムエラー6オーバーフローエラーが発生します。セル置換行で停止しています。ワークシートをループするときにランタイムエラー6がオーバーフローする

Private Sub Workbook_Open() 
    Dim i As Long 
    Dim strWorksheetName As String 

    strWorksheetName = ActiveSheet.Name 

    Application.DisplayAlerts = False 
    For i = 1 To Sheets.Count 
     Sheets(i).Activate 
     If Sheets(i).Type = xlWorksheet Then 
      Cells.Replace What:="'c:\*xla*'!", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 
     End If 
    Next i 
    Application.DisplayAlerts = True 

    Sheets(strWorksheetName).Activate 

End Sub 

答えて

2

のWorkbook_Openイベントがあまりにも早く発射されているので、すべてがロードされる前に、この、原因とされていることがあります。

あなたがかもしれないは、ワークシートをアクティブ化しようとしないと、より良い運があります。 (それらを有効にするとExcelに表示されなければならないかもしれませんが、これはまだ他のものを実行しているため実行できないかもしれませんが、シートを強制的に表示せずに変更を加えると、私は推測している、誰かが別の解決策を思い付くまで、推測は何でも良いとしてです)

にコードを変更してみてください!

Private Sub Workbook_Open() 
    Dim ws As Worksheet 

    Application.DisplayAlerts = False 
    For Each ws in Worksheets 
     ws.Cells.Replace What:="'c:\*xla*'!", _ 
         Replacement:="", _ 
         LookAt:=xlPart, _ 
         SearchOrder:=xlByRows, _ 
         MatchCase:=False, _ 
         SearchFormat:=False, _ 
         ReplaceFormat:=False 
    Next 
    Application.DisplayAlerts = True 

End Sub 

それが動作する場合、私は答えを残しておきますここに。そうでなければ、私はその答えを削除し、他の誰かが提案をすることができます。

1

1つ以上の 'シート'が.Visibleではない可能性があります。 .VisibleプロパティがFalseまたはxlVeryHiddenの場合、.Activateは 'シート'にできません。 Falseにそれを変更する手順を出た後、真のデフォルトに

Option Explicit 

Private Sub Workbook_Open() 
    Dim i As Long 

    Application.DisplayAlerts = False 

    For i = 1 To Worksheets.Count 
     With Worksheets(i) 
      .Cells.Replace What:="'c:\*xla*'!", _ 
          Replacement:=vbNullString, _ 
          LookAt:=xlPart, _ 
          SearchOrder:=xlByRows, _ 
          MatchCase:=False, _ 
          SearchFormat:=False, _ 
          ReplaceFormat:=False 
     End With 
    Next i 

End Sub 
  • Application.DisplayAlerts戻ります。
  • 作業するためには.Activate¹ワークシートは必要ありません。また、隠しワークシートで作業することもできます。 With ... End With statementを使用して、幅の広い親ワークシート階層を提供します。
  • 別のワークシートをアクティブ化しない場合は、元のワークシートを保存して再度アクティブ化する必要はありません。
  • シートコレクションではなくWorksheets collectionを使用する場合、「シート」がワークシートであるかどうかを確認する必要はありません。

が選択に頼るから離れるの詳細な方法についてHow to avoid using Select in Excel VBA macrosを参照してくださいとあなたの目標を達成するためにアクティブに¹しました。

+0

私は自分の答えが良いと思ったので、私は自分の答えを削除しようとしていましたが、まずテストをすることにしました。私は3つのシートを持つワークブックを作成し、各シートのA1に異なる値を設定し、1つのシートを隠してから、以下を実行しました:「ワークシートとしてのワークシート」「各ワークシートのための」Debug.Print ws.Name' 'ws。 Debug.Print Cells(1,1).Value'をアクティブにします。Debug.Print ActiveSheet.Cells(1,1).Value' 'ActiveSheet.Cells(1,1).Select''Debug.Print Selection.Value' 「次へ」私は間違いがあると思ったが、それは得られなかった。私のバージョンのExcelが奇妙なのですか、または隠れたシートについて間違って考えたことはありますか? – YowE3K

+0

確かに奇妙です。私は、隠れたワークシートをエラーとして起動したことを思い出しました。実際には、私はこれについての質問にも反応したと信じています(私は私の回答を証明します)。私はVB7でxl2016でこれを実行しましたが、非表示のワークシートはアクティブ化されませんでしたが、エラーもスローされませんでした。私は別のバージョンでこの件についてもっと調べなければならないだろうが、それは明日か次になるだろう。これはすべて価値のある質問かもしれません。 – Jeeped

+0

私は両方のソリューションを試しましたが、それでも同じ問題があります。マクロがパスを削除しているので、カスタム関数とのやりとりがあります。私が見つけた唯一の解決策は、元のマクロを実行し、一時的に通常の場所からカスタム関数を含むアドインを移動することです。その後、すべてのパスが削除され、アドインを通常の場所に追加すると、ファイルが機能します。トリックに起因する可能性のあるアドインマクロへの呼び出しを無効にするコマンドがいくつかあった場合。私は手動計算に設定しようとしましたが、うまくいきません。 – john

関連する問題