2016-12-11 7 views
2

ウェブとスタックを検索しようとしました。しかし、私は有用な何かを見つけることができませんでした。私は、セル値に不正な文字が含まれていないときにワークシートの名前が変更される非常に単純なイベントを作成しようとしています。セルの値に基づいてExcelワークシートの名前を変更する

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

Target = Sh.Cells(1, 1) 
If InStr(Target, "\") > 0 Or IsEmpty(Target) = True _ 
    Or InStr(Target, "/") > 0 Or InStr(Target, "*") > 0 _ 
    Or InStr(Target, "[") > 0 Or InStr(Target, "]") > 0 _ 
    Or InStr(Target, ":") > 0 Or InStr(Target, "?") > 0 Then 
Else 
    Sh.Name = Target 
End If 

End Sub 

このように動作するはずです。A1の値にすべての有効な文字が含まれている場合は、シートの名前を変更します。それは本当に起こっていますが、シートの名前に他のセルに付けた値も変更されます。何かアドバイス?

+1

使用 '交差()' *ターゲットをテストする* –

+1

わからないがあなたが本当にやろうとしているのですが、 'Target'は変更されたセル範囲でイベントをトリガーしました。そして 'Target = Sh.Cells(1,1)'でこのセル範囲を 'Sh.Cells(1,1).Value'で上書きします。では、あなたは何をしようとしていますか? 'Sh.Cells(1、1).Value'でシートの名前を変更しますか?しかし、なぜすべての細胞を交換するのですか? –

+0

私は各シートのA1がそのシートの名前を管理したいと思っています。それは事実ですが、副作用としてシートの他の場所に挿入された値も書き換えられます。 –

答えて

1

は、この試してみて:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Dim ws As Worksheet, r As Range, s As String 

    Set ws = Target.Parent 
    Set r = Intersect(Target, ws.Range("A1")) 

    If r Is Nothing Then Exit Sub 

    s = r.Value 
    If InStr(s, "\") > 0 Or s = "" _ 
     Or InStr(s, "/") > 0 Or InStr(s, "*") > 0 _ 
     Or InStr(s, "[") > 0 Or InStr(s, "]") > 0 _ 
     Or InStr(s, ":") > 0 Or InStr(s, "?") > 0 Then 
    Else 
     Sh.Name = s 
    End If 
End Sub 

注:

コードは値を再使用するためにチェックしません。

+0

代わりに 'Sh'を使用せず、代わりに' Target.Parent'を使うのはなぜですか? –

+0

@AxelRichter過去には、異なるワークシート上のセルを同時に変更すると問題が発生しました。 –

+0

これは私にとって完璧に機能します。なにが問題だったの?私はターゲットが定義されていると思った。 –

1

私はあなたがIf..End Ifブロックにハードコードそれらにせずに無効な文字のリストを事前に定義することができますよう、以下の方法を好む:

Option Explicit 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

    Dim rngA1OfSheet As Range 
    Dim varInvalidChars As Variant 
    Dim varTest As Variant 
    Dim blnCheck1 As Boolean 
    Dim blnCheck2 As Boolean 

    Set rngA1OfSheet = Sh.Range("A1") 

    If Not Intersect(Target, rngA1OfSheet) Is Nothing Then 
     blnCheck1 = IsEmpty(rngA1OfSheet.Value) 

     varInvalidChars = Array("\", "/", "*", "[", "]", ":", "?") 
     blnCheck2 = False 
     For Each varTest In varInvalidChars 
      If InStr(1, rngA1OfSheet.Value, CStr(varTest), vbTextCompare) > 0 Then 
       blnCheck2 = True 
       Exit For 
      End If 
     Next 

     If Not blnCheck1 And Not blnCheck2 Then 
      Sh.Name = rngA1OfSheet.Value 
     End If 

    End If 


End Sub 
+0

それを行ううまい方法です!ありがとうございました! –

関連する問題