2012-01-13 16 views
0

以下のスクリプトはループしてタブを作成し、タブに名前をつけて、タブ名をセルB3に配置します。それは正常に動作していますが、今はすべてのランタイムエラー1004をキャッチします。私のスクリプトの最後に、タブの名前を変更します。これがエラーの発生場所です。タブを作成していますが、名前を変更できません。誰でもこのスクリプトのタブの名前を変更する別の方法を提案してください。 Sheets(Name).Selectにエラーがあります。タブの名前を自動的に変更

Public Sub CreateTabs() 
    Sheets("TABlist").Select 
    ' Determine how many Names are on Data sheet 
    FinalRow = Range("A65000").End(xlUp).Row 
    ' Loop through each Name on the data sheet 
    For x = 1 To FinalRow 
    LastSheet = Sheets.Count 
    Sheets("TABlist").Select 
    Name = Range("A" & x).Value 
    ' Make a copy of FocusAreas and move to end 
    Sheets("TABshell").Copy After:=Sheets(LastSheet) 
    ' rename the sheet and put name in Cell B2 
    Sheets(LastSheet + 1).Name = Name 
    Sheets(Name).Select 
    Range("B3").Value = Name 
    Next x 
End Sub 
+0

あなたが読んで、それは少し明確にでした。それは私に最小化されたjQueryのように見え、私の頭の上にまっすぐに行く! – Undefined

答えて

0

私はすべての選択の中で迷ってしまったので、元のコードが失敗した理由がわかりません。私はあなたの質問を編集して読みやすくしましたが、私の編集が見直されるまで改善が見えるだけです。

すべての選択ステートメントを削除しました。私が他の変更を加えた理由を説明するコメント '##。

Option Explicit 
Public Sub CreateTabs() 

    Dim CrntRow As Long    '## I like names I understand 
    Dim FinalRow As Long 
    Dim Name As String 

    ' Determine how many Names are on Data sheet 
    '## Row.Count will work for any version of Excel 
    FinalRow = Sheets("TABlist").Cells(Rows.Count, "A").End(xlUp).Row 
    ' Loop through each Name on the data sheet 
    For CrntRow = 1 To FinalRow 
    Name = Sheets("TABlist").Range("A" & CrntRow).Value 
    ' Make a copy of FocusAreas and move to end 
    Sheets("TABshell").Copy After:=Sheets(Worksheets.Count) 
    ' rename the sheet and put name in Cell B2 
    '## The copy will be the active sheet 
    With ActiveSheet 
     .Name = Name 
     .Range("B3").Value = Name 
    End With 
    Next CrntRow 

End Sub 
+0

このスクリプトは、= Sheets(LastSheet)でコンパイルエラーを生成します。ループ回数をどのように変更したのか分かりますが、コンパイルエラーを解決するにはどうすればよいか分かりません。 – user745778

+0

申し訳ありませんが、私はそれを逃したか分かりません。私はそれをテストした後、コードを変更したに違いありません。私は 'LastSheet'を' Worksheets.Count'に置き換えて答えを修正しました。改訂されたコードは私のシステムで動作し、私は4つの新しいワークシートを作成するために使用しました。 –

+0

ありがとうございました - あなたの上の答えが働いていたので、私はこの訂正を見せてくれてとても幸運ですが、今はコンパイルエラーです...あなたの修正は人生の節約になります.. – user745778

1

Excelブックの各ワークシート名は一意である必要があります。

エラーの原因となっている名前を確認するには、このコードを使用して、リスト名とシート名を確認してください。

Public Sub CreateTabs() 

On Error Resume Next 

    Sheets("TABlist").Select 
    ' Determine how many Names are on Data sheet 
    FinalRow = Range("A65000").End(xlUp).Row 
    ' Loop through each Name on the data sheet 
    For x = 1 To FinalRow 
    LastSheet = Sheets.Count 
    Sheets("TABlist").Select 
    Name = Range("A" & x).Value 
    ' Make a copy of FocusAreas and move to end 
    Sheets("TABshell").Copy After:=Sheets(LastSheet) 
    ' rename the sheet and put name in Cell B2 
    Sheets(LastSheet + 1).Name = Name 
    Sheets(Name).Select 
    Range("B3").Value = Name 
    Next x 

On Error GoTo 0 

End Sub 
+0

私はリストを2に減らしました。あなたのスクリプトは、最初に "名前"と呼ばれる3つを作成します。これが問題の記録をどのように特定すると思いますか? On Errorを削除すると、元のエラーがこれらの2つのレコードでのみ発生します。 – user745778

+0

隠しシートがあるかどうか確認してください。これにより、Sheets.Countに問題が発生し、シート名を設定する可能性があります。 –

5

堅牢なコードを書くことは非常に重要です。どんなシナリオでも失敗してはいけません。例えば、適切なエラー処理が行われ、変数が宣言されていなければなりません。

私はこれを読むことをお勧めします。

トピック:今すぐ戻ってあなたのコードにhttp://www.siddharthrout.com/2011/08/01/to-err-is-human/

「のErr」には

リンク人間です。私はコードを修正しました。これを試して。私もコードをコメントしているので、それを理解するのに何の問題もないはずです。まだあなたがしたら、ただ叫び声を出してください。

コード

Option Explicit 

Public Sub CreateTabs() 
    Dim ws As Worksheet 
    Dim FinalRow As Long, x As Long, LastSheet As Long 
    Dim name As String 

    On Error GoTo Whoa 

    Application.ScreenUpdating = False 

    Set ws = Sheets("TABlist") 

    FinalRow = ws.Range("A" & Rows.Count).End(xlUp).Row 

    For x = 1 To FinalRow 
     LastSheet = Sheets.Count 

     '~~> Get the name for the new sheet 
     name = ws.Range("A" & x).Value 

     '~~> Check if you already have a sheet with that name or not 
     If Not SheetExists(name) Then 
      Sheets("TABshell").Copy After:=Sheets(LastSheet) 
      ActiveSheet.name = name 
      Range("B3").Value = name 
     End If 
    Next x 

LetsContinue: 
    Application.ScreenUpdating = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

'~~> Function to check if sheet exists 
Function SheetExists(wst As String) As Boolean 
    Dim oSheet As Worksheet 
    On Error Resume Next 
    Set oSheet = Sheets(wst) 
    On Error GoTo 0 

    If Not oSheet Is Nothing Then SheetExists = True 
End Function 
+0

私はロバストコーディングに同意し、リンクを読むでしょう。あなたのスクリプトは、セルに名前をつけてタブを作成して名前を付けています。私はあなたがそれを解決したことを信じています。なぜ私の元のスクリプトが長い間働いていたのかわかりません。しかし、うまくいけば、それはより頑強になります。後で失敗することはありません。非常に多くの助けを感謝.... – user745778

+0

+1きれいに覆われています。 – brettdj

+0

user745778、あなたは私の解決策を受け入れませんでした。それが失敗した場合はどこで確認できますか? –

関連する問題