0

Visible=True の条件で VBA ワークシートを使用し、特定のワークシートを除外して複数のワークシートを印刷するコードを作成しました。私はどこにも行きません。

Sub Printetail()
'
' PrintDetail Macro
'
    Dim wsSheet As Worksheet
    If Not wsSheet Is Nothing Then

      If wsSheet.Visible = True 
         And wsSheet.CodeName <> "EstimateBasis" 
         And wsSheet.CodeName <> "CashFlow" 
         And wsSheet.CodeName <> "MaterialPVTable" 
         And wsSheet.CodeName <> "Material" 
         And wsSheet.CodeName <> "Instruction"
         And wsSheet.CodeName <> "DebugSheet"
         And wsSheet.CodeName <> "StateLocalTax" 
         And wsSheet.CodeName <> "Referene" 
      Then
          '???
      End If

      If wsSheet.CodeName = "ProjectInput" Then

          wsSheet.PageSetup.CenterFooter = ActiveSheet.Range("C6").Text & _
                                           "    -Estimate Date:" & _
                                           ActiveSheet.Range("F2").Text & _
                                           "    -Gate:" & _
                                           ActiveSheet.Range("F4").Text & _
                                           "    -Rev No." & _
                                           ActiveSheet.Range("F5").Text

          wsSheet.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False

      Else

          wsSheet.Visible = True
          wsSheet.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False

      End If

End If

End Sub
4

1 に答える 1

1

wsSheetもうNothing割り当てていないためです。ThisWorkbook代わりにワークシートを反復したいと思うでしょう; このようなものはあなたをどこかに連れて行くはずです:

Dim wsSheet As Worksheet
For Each wsSheet In ThisWorkbook.Worksheets

    If CanPrintThisSheet(wsSheet) Then PrintWorksheet wsSheet

Next

そして、 「シートを印刷できます」のすべての条件を配置CanPrintThisSheetするBoolean-returning関数にPrintWorksheetなり、ページ設定と印刷ロジックを配置するサブ/プロシージャになります(これは呼び出しに過ぎない可能性がありますにws.PrintOut):

Function CanPrintThisSheet(sheet As Worksheet) As Boolean
    CanPrintThisSheet = sheet.Visible And Not StringMatchesAny(sheet.CodeName, _
             "EstimateBasis", _
             "CashFlow", _
             "MaterialPVTable", _
             "Material", _
             "Instruction", _
             "DebugSheet", _
             "StateLocalTax", _
             "Referene")
End Function

以下の「StringMatchesAny」のような関数を使用すると、一致が見つかるとすぐに関数が返されるため、すべてのチェックを実行する必要がなくなります。

Function StringMatchesAny(string_source, ParamArray find_strings()) As Boolean

    'String-typed local copies of passed parameter values:
    Dim find As String, src As String, i As Integer, found As Boolean
    src = CStr(string_source)

    For i = LBound(find_strings) To UBound(find_strings)
        find = CStr(find_strings(i))
        found = (src = find)
        If found Then Exit For
    Next

    StringMatchesAny = found

End Function
于 2013-05-21T00:59:27.957 に答える