2017-11-08 15 views
1

他のスレッドでこのトピックを参照しているにもかかわらず、私は立ち往生しています。シートが存在する場合は、サブを実行します。そうでない場合は、メッセージを表示してサブを終了してください

マクロで「転送」という名前のシートが見つかった場合は、そのシートを有効にして残りのシートを実行して「転送」を最後のシートにしたいと思います。

「転送」という名前のシートが見つからない場合は、メッセージを送信してください(データシートの名前を「転送」としてください)。あなたのアイデアは、ワークシートをアクティブ化しようとすることであり、これが失敗した場合、エラーが発生したことよりも、注意してください。

Sub Double_Transfer_Report() 
Dim er As Boolean 
er = False 

On Error Resume Next 
'Worksheets("Transfers").Activate 
er = true 

If er Then 
MsgBox ("Please make sure that you renamed your data sheet : Transfers) 
Exit Sub 
End If 

ActiveSheet.Move _ 
After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count) 
+0

' - 。それはかどうかにかかわらずの、コンパイル時定数を、完全に無条件ですエラーが発生しました。 'On Error Resume Next'は、エラーがあれば、次の行は無関係に実行されるので、有用な状態を得るために' Err.Number' * somewhere *をチェックする必要があります。 –

答えて

2

が機能していません。

下図のようにあなたのコードを変更することができます。変更が関係をメソッドが失敗した後、Errオブジェクトにはt彼は別のエラーが発生するか、別のOn Errorステートメントが出現するまでエラー番号(および他の詳細)を表示します。ブール値のerを論理テストErr.Number <> 0に設定すると、エラーが発生したことが検出されます。

Sub Double_Transfer_Report() 
    Dim er As Boolean 

    er = False 
    On Error Resume Next 
    Worksheets("Transfers").Activate 
    er = (Err.Number <> 0) 
    On Error GoTo 0 

    If er Then 
     MsgBox "Please make sure that you renamed your data sheet : Transfers)" 
    Else 
     ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count) 
    End If 
End Sub 
+0

ありがとうございます!これは完全に機能します。 –

4

エラーオブジェクトで体操をしないでください。シートがループしているかどうかを確認するだけです。


Sub Double_Transfer_Report() 
    Dim found As Boolean 

    found = SheetExists("Transfers") 

    If Not found Then 
     MsgBox "Please make sure that you renamed your data sheet : Transfers" 
    Else 
     ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count) 
    End If 
End Sub 

Function SheetExists(strSheetName As String) As Boolean 

    Dim wks As Worksheet 

    For Each wks In ThisWorkbook.Worksheets 

     If wks.Name = strSheetName Then 
      SheetExists = True 
      Exit Function 
     End If 
    Next 

    SheetExists = False 

End Function 
+0

これは機能しますが、ブックに多数のシートが含まれていると無駄になります。論理をそれ自身の専用機能に抽象化するための賞。 –

+1

合意すると、実行のレイヤーが追加されます。しかし、1200シートでは、シートの存在を見つけるための時間がありません。それ以上の枚数があれば、扱うべきより大きな問題があります。 :) – cyboashu

+3

ExcelコレクションがExistsメソッドを公開しないのは残念です。 – Excelosaurus

0

あなたがどこかに二つのセルを割くことができた場合は、ループやエラー処理の両方を避けることができ、我々はB1B2を使用すると言います。 B1場所で提案されているワークシート名と使用B2を埋める:それことを言っていない、

enter image description here

+0

興味深いアプローチ! 'INDIRECT()'が揮発性の関数であるという事実は、私を多少なりとも変えてしまいます。 – Excelosaurus

+0

@Excelosaurus私は同意する.........私はちょうど通常の方法の代わりとして投稿した。 –

+1

'Evaluate(" ISNUMBER(ROWS( '"&worksheetName&"' A1))」) '' worksheetName'はワークシートの名前を含む変数です。 ;) – YowE3K

0

ちょうど別のアプローチを:B2にブール結果を確認後

Range("B2").Value = "=ISNUMBER(ROWS(INDIRECT(""'""&B1&""'!A1"")))" 

をCyboashu(または他の答え)よりも優れています。

は、SheetExistsとしてXl4Macro名前付き範囲を作成し、Referstoでこれを置く:=SUBSTITUTE(GET.WORKBOOK(1),"[" &GET.WORKBOOK(16)&"]","")

今、あなたは、この(配列)の式を追加することができ、その利用可能な場合、それはシートの実際のインデックスをバック返します任意のシートに。

{=MATCH("Sheet1091",TRANSPOSE(SheetExists),0)}

物事のちょうど別の方法:)

Then`がTrueの場合Then` `のように書き換えることができER場合
関連する問題