2017-07-08 1 views
0

作業手順書を開いて閉じなくても、サブプロシージャに渡してExcelを実行しようとしています。 オブジェクトを関数またはサブプロシージャに渡す

私はこの

Public Function CheckForMutipleUIC(ByVal ws As Excel.Workbook) As Boolean 
' Dim ExcelApp As New Excel.Application 
' DataFleet = CurrentProject.Path & "\Extract\Fleet.xls" 
' Set ws1 = ExcelApp.Workbooks.Open(DataFleet).Sheets(1) 
UICCheck = ws.Range("GD2").Value 
For Each Cell In ws.Range("GD2:GD10000").cells 
    If Cell.Text <> "" Then 
     If Cell.Value <> UICCheck Then 
      Err.Raise 513, "VICILauncher-DataValidation-CheckForMultipleUIC", "Multiple UICS Found in extract. Please Make sure the correct UIC is being Extracted" 
     End If 
    End If 
Next 
CheckForMutipleUIC = True 
Exit Function 

に機能が表示されます。この

Dim ExcelApp As New Excel.Application 
Dim ws As Object 

Public Function cert() 
Set ws = ExcelApp.Workbooks.Open(FileDir).Sheets(1) 
If CheckForMutipleUIC(ws) = True Then <---- this is where I call the Function 
.... 

を試してみました。しかし、私は適切にExcelオブジェクトを渡していませんよね。アプリケーションオブジェクトは、閉じて再オープンすることなく、どのようにsubに渡されますか?

+0

「ワークブック」を渡したいとします。 **しかし、**ここでは、ワークシートに設定します: 'Set ws = ExcelApp.Workbooks.Open(FileDir).Sheets(1)'。その後、あなたの関数の中に '(ByVal ws As Excel.Workbook)'、**がありますが、 'UICCheck = ws.Range(" GD2 ")。Value'の後、' Worksheet'オブジェクトです。それはどちらですか? 'ws'は' Worksheet'か 'Workbook'ですか? –

+0

あなたは正しいです。機能にExcelシートを渡したいと思っています – Quint

+0

私は試してみましたが、それはエラーで実行されますが、「各セルに対して」セルが空白になります – Quint

答えて

1

Public Function CheckForMutipleUIC(ByVal ws As Excel.Workbook) As Boolean

、以下のコードのコメント内の説明をコードしてみてください:あなたは ByRefのを使用する必要があり

Option Explicit 

Dim ExcelApp As New Excel.Application 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim FileDir As String 

'======================================================================  
Public Function cert() '<-- NOT SURE why this is a Function and not a Sub ? 

' set the workbook object 
Set wb = ExcelApp.Workbooks.Open(FileDir) 
Set wb = Workbooks.Open(FileDir) ' <-- why not use this if this is inside Excel VBA ? 

' set the worksheet object 
Set ws = wb.Sheets(1) 
If CheckForMutipleUIC(ws) = True Then ' pass the worksheet object to the Function 
    '.... 

End If 

End Function 

'======================================================================  
Public Function CheckForMutipleUIC(ByVal ws As Worksheet) As Boolean 

Dim Cell As Range 
Dim UICCheck 

UICCheck = ws.Range("GD2").Value 
For Each Cell In ws.Range("GD2:GD10000").Cells 
' If Cell.Text <> "" Then 
    If Cell.Value2 <> "" Then ' <-- use Value 2 instead of Text 
     If Cell.Value <> UICCheck Then 
      Err.Raise 513, "VICILauncher-DataValidation-CheckForMultipleUIC", "Multiple UICS Found in extract. Please Make sure the correct UIC is being Extracted" 
     End If 
    End If 
Next 
CheckForMutipleUIC = True 

End Function 
+0

'cell.value2'とは何ですか? – Quint

+0

@Quintはこちらをご覧くださいhttps://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-value2-property-excelそれ以外に、私のコードを試しましたか?あなたが意図したとおりに働いていますか? –

+0

申し訳ありませんが、間違った答えに投稿しました。あなたの質問に答えるために、私は 'GD2'でセルの値を取得し、残りの' GD'列をチェックして、各セルが 'GD2'と一致しているかどうかを調べます。チェックしているセルが空白になります。親サブのファイル位置は正しいが、子サブはそうではないように見える。 – Quint

1

エラーメッセージは表示されません。しかし、ちょうど投稿されたコードを見て、それはワークブックを期待しているCheckForMutipleUIC関数にワークシート 'ws'を渡すように見えます。以下を変更してみてください。

Public Function CheckForMutipleUIC(ByVal ws As Excel.Worksheet) As Boolean

1

(と正しい申告すでに述べたように):

Public Function CheckForMutipleUIC(ByRef ws As Excel.Worksheet) As Boolean 
+0

ええ、私はそれを見て、今私はそれを使用すると、各セルのための各セルは空白になるとそれを修正しました。オブジェクトはこの関数に渡されていないようです。 – Quint

関連する問題