2017-12-25 8 views
0

コードネームでワークシートを参照するために、以下のコードを使用すると、 "Sheet34"のインスタンスごとにファイルエクスプローラが開きます。どうすればこれを防ぐことができますか?ワークシートのコード名のエラー

Private Sub CheckBox4_Click() 
Application.ScreenUpdating = False 

Dim ws As Worksheet 
Dim sheetName As String 


If CheckBox4.Value = True Then 
    ActiveWorkbook.Unprotect 
    Worksheets("SUMMARY").Unprotect 
    sheetName = Sheets("Control").Cells(16, "I") 
    If sheetName = "" Then 
     MsgBox "You must enter a valid Allowance descriptor. No entry was detected." 
     CheckBox4.Value = False 
     Exit Sub 
    End If 
    If Len(sheetName) > 31 Then 
     MsgBox "Worksheet tab names cannot be greater than 31 characters in length." 
     Application.EnableEvents = False 
     Sheets("Control").Cells(16, "I").ClearContents 
     Application.EnableEvents = True 
     CheckBox4.Value = False 
     Exit Sub 
    End If 
    Dim IllegalCharacter(1 To 7) As String, i As Integer 
    IllegalCharacter(1) = "/" 
    IllegalCharacter(2) = "\" 
    IllegalCharacter(3) = "[" 
    IllegalCharacter(4) = "]" 
    IllegalCharacter(5) = "*" 
    IllegalCharacter(6) = "?" 
    IllegalCharacter(7) = ":" 
    For i = 1 To 7 
     If InStr(sheetName, (IllegalCharacter(i))) > 0 Then 
      MsgBox "You used a character that violates sheet naming rules. Please refrain from the following characters:/\ [ ] * ? : " 
      Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 

    Next i 
    If Sheets("Control").Range("I16") = Sheets("Control").Range("I17") Then 
     MsgBox "There is already an Allowance with this name. Please choose a different name." 
     Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 
     If Sheets("Control").Range("I16") = Sheets("Control").Range("I18") Then 
     MsgBox "There is already an Allowance with this name. Please choose a different name." 
     Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 
     If Sheets("Control").Range("I16") = Sheets("Control").Range("I21") Then 
     MsgBox "There is already an Other Item with this name. Please choose a different name." 
     Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 
     If Sheets("Control").Range("I16") = Sheets("Control").Range("I22") Then 
     MsgBox "There is already an Other Item with this name. Please choose a different name." 
     Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 
     If Sheets("Control").Range("I16") = Sheets("Control").Range("I23") Then 
     MsgBox "There is already an Other Item with this name. Please choose a different name." 
     Application.EnableEvents = False 
      Sheets("Control").Cells(16, "I").ClearContents 
      Application.EnableEvents = True 
      CheckBox4.Value = False 
      Exit Sub 
     End If 
    If WorksheetExists(sheetName) Then 
     Worksheets(sheetName).Visible = -1 
     Worksheets("SUMMARY").Rows("47").EntireRow.Hidden = False 
     Worksheets("SUMMARY").Cells(47, 2).Value = "ALL 1:" 
     Worksheets("SUMMARY").Cells(47, 3).Value = "='Control'!I16" 
     Worksheets("SUMMARY").Cells(47, 3).NumberFormat = "General" 
     Worksheets("SUMMARY").Cells(47, 4).Value = "='Control'!K16" 
     Worksheets("SUMMARY").Cells(47, 5).Value = "='Control'!L16" 
     Worksheets("SUMMARY").Cells(47, 6).Value = "=" & sheetName & "!$H$69" 
     Worksheets("SUMMARY").Cells(47, 7).Value = "=" & sheetName & "!$J$69" 
     Worksheets("SUMMARY").Cells(47, 8).Value = "=" & sheetName & "!$N$69" 
     Worksheets("SUMMARY").Cells(47, 9).Value = "=" & sheetName & "!$P$69" 
     Worksheets("SUMMARY").Cells(47, 10).Value = "=SUM(F47:I47)/D47" 
     Worksheets("SUMMARY").Cells(47, 11).Value = "=L47/F3" 
     Worksheets("SUMMARY").Cells(47, 12).Value = "=" & sheetName & "!$U$69" 
     Worksheets("SUMMARY").Cells(47, 13).Value = "=L47/$K$57" 
     ActiveWorkbook.Protect 
     Sheets(sheetName).Protect 
     Sheets("SUMMARY").Protect 
     Exit Sub 
    Else 
     Set ws = ActiveWorkbook.Sheet34 
     ws.Name = sheetName 
     ws.Protect 
     ws.EnableSelection = xlUnlockedCells 
     Application.CutCopyMode = False 

     Worksheets("SUMMARY").Rows("47").EntireRow.Hidden = False 
     Worksheets("SUMMARY").Cells(47, 2).Value = "ALL 1:" 
     Worksheets("SUMMARY").Cells(47, 3).Value = "='Control'!I16" 
     Worksheets("SUMMARY").Cells(47, 3).NumberFormat = "General" 
     Worksheets("SUMMARY").Cells(47, 4).Value = "='Control'!K16" 
     Worksheets("SUMMARY").Cells(47, 5).Value = "='Control'!L16" 
     Worksheets("SUMMARY").Cells(47, 6).Value = "=" & ws.Name & "!$H$69" 
     Worksheets("SUMMARY").Cells(47, 7).Value = "=" & ws.Name & "!$J$69" 
     Worksheets("SUMMARY").Cells(47, 8).Value = "=" & ws.Name & "!$N$69" 
     Worksheets("SUMMARY").Cells(47, 9).Value = "=" & ws.Name & "!$P$69" 
     Worksheets("SUMMARY").Cells(47, 10).Value = "=SUM(F47:I47)/D47" 
     Worksheets("SUMMARY").Cells(47, 11).Value = "=L47/F3" 
     Worksheets("SUMMARY").Cells(47, 12).Value = "=" & ws.Name & "!$U$69" 
     Worksheets("SUMMARY").Cells(47, 13).Value = "=L47/$K$57" 

     ActiveWorkbook.Protect 
     Sheets(sheetName).Protect 
     Sheets("SUMMARY").Protect 
     Worksheets("Control").Activate 

    End If 

End If 
If CheckBox4.Value = False Then 
    ActiveWorkbook.Unprotect 
    Worksheets("SUMMARY").Unprotect 
    sheetName = Sheets("Control").Cells(16, "I") 

    If WorksheetExists(sheetName) Then 
     Worksheets(sheetName).Visible = 2 
     Worksheets("SUMMARY").Rows("47").EntireRow.ClearContents 
     Worksheets("SUMMARY").Rows("47").EntireRow.Hidden = True 
     ActiveWorkbook.Protect 
     Sheets(sheetName).Protect 
     Sheets("SUMMARY").Protect 
    End If 

    End If 
    Application.ScreenUpdating = True 
End Sub 

今後の質問:このコードは既存のシートを取り出して名前を変更しています。私が気にするのは、ユーザーがCell I16のシートに名前を付けて名前を変更し、ボックスのチェックを外すかチェックすると、参照が貧弱なSummary Worksheetに行が表示されます。また、コードはコメントに& SHEETNAME &を回すように私は

Worksheets("SUMMARY").Cells(47, 6).Value = "="' & sheetName & '"!$H$69" 

として

Worksheets("SUMMARY").Cells(47, 6).Value = "=" & sheetName & "!$H$69" 

下のコードを入力することはできません。ワークシートがコード内で適切に参照されるように、これを修正するにはどうすればよいですか?コードネームワークシートを保持する必要がありますか?

名前変更の問題を防ぐ方法については、チェックボックスの値が正である限り名前付きセルを保護し、チェックボックスの値がfalseの場合にセルを編集できるようにしました。おそらく、セルが変更されているかどうかをチェックするコード行を追加し、ユーザーが変更したいセルであることを確認すると、既存のスプレッドシートのデータはクリアされますがフォーマットはクリアされます。

+1

"Sheet34"の各インスタンスに対して開くファイルエクスプローラの意味が不明だが、割り当てには二重引用符つまり、 "" = ""&sheetName& "'!$ H $ 69" ' – Skippy

+0

二重引用符について知っておくとよいでしょう。 ファイルエクスプローラが開くまでは、 Excelファイルを開くファイルエクスプローラは、行の各インスタンスに対して5回表示されます。 "="&sheetName& "!$ U $ 69" 私が推測できるのは、二重引用符は、それは別のブックに、おそらくシートがあると仮定しますか?私は、そのコードネームでシートを呼び出すことは、特に明記されていない限り、本書がアクティブワークブックに含まれていたと仮定していましたが、 –

答えて

0

あなたは次のことを試してみてください...式にセルの値を設定しようとしている。

  1. を開き、別の
  2. 同じワークブック内の別のシートのセルへの直接リンクを作成します。ワークブック。
  3. 次は、ワークシートの参照のための正しい使用になることがわかります他のワークブック

からシート内のセルへの直接リンクを作成しますため

Worksheets("SUMMARY").Cells(47, 6).Formula = "='" & sheetName & "'!$H$69" 

以下ブックの参照:

Worksheets("SUMMARY").Cells(47, 6).Formula = "='[" & Worboookpath & "] & sheetName & "'!$H$69" 
関連する問題