2016-08-27 4 views
1

ここは新しいです。もし私が間違っていたら、私が間違いをして、誰かが私に指示をくれたことを感謝するなら、私を許してください。Excel UDF - 別のワークブックシートを参照するときに#Valueエラーが発生する

私の問題は、YEAR & NAMEと現在のワークブックを一致させることによって、別のブックブックから提案書を提出するUDFを作成することに関連しています。現在のコードは#VALUEエラーを返します。

Function ProposalNo(BorrowerName As String, Year As String) As String 
Dim PropNo As String 
Dim BorrowerName As String 
Dim Year As String 
Dim CMISPath As String 
Dim wb As Workbook 
Dim sht As Worksheet 
Dim Match As Double 

CMISPath = "C:\Users\15169\Desktop\Data Dump\CMIS\SME- CMIS.xlsb" 
Set wb = Workbooks.Open(CMISPath) 
Set sht = wb.Worksheets("Sheet1") 

LastRow = wb.Worksheets(1).Cells(sht.Rows.Count, "A").End(xlUp).Row 

     For i = 2 To LastRow 
      If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).Value)) Then 
       PropNo = sht.Cells(i, 1) 
      End If 
     Next 
    ProposalNo = PropNo 
End Function 

JWは、パーセンテージマッチ機能を使用して借り手の名前と基本的に一致しようとする別の機能です。 #VALUEエラーはSet sht = wb.Worksheets("Sheet1")のために発生します。シートの詳細を割り当てる別の関数を作成しようとしましたが、うまくいきませんでした。誰かが私にいくつかの指針を与えることができれば、私は感謝します。

+0

私の答えはこちらを参照してください。 –

+0

行を追加:wsを設定する行の下に、wsを設定する前にMsgBox wb.Nameを追加します。それが「SME-CMIS」以外のものを与えるなら、あなたはそれがワークブックの設定にあることを知っています。トラブルシューティングのために、機能をサブに変更し、トラブルラインが成功するかどうかを確認することもできます。 – SandPiper

答えて

0

ユーザ定義関数(UDF)"must not modify the contents or formatting of any cell and must not modify the operating environment of Excel"

だから、必要なブックには、関数を使用したいと、それだけにそれを設定している時には、既に開いている必要があり、ここでワークブック名​​

与えられた(または渡された)あなたのUDFの対応リファクタリングは次のとおりです。

Function ProposalNo(BorrowerName As String, Year As String) As String 
    Dim PropNo As String 
    Dim sht As Worksheet 
    Dim i As Long 

    Const WBNAME As String = "SME- CMIS.xlsb" 
    Const SHEETNAME As String = "Sheet1" 

    Set sht = GetSheet(WBNAME, SHEETNAME) 
    If sht Is Nothing Then 
     ProposalNo = "couldn't fine sheet '" & SHEETNAME & "' in workbook '" & WBNAME & "'" 
    Else 
     With sht 
      For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row 
       If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).value)) Then 
        ProposalNo = sht.Cells(i, 1) 
        Exit For 
       End If 
      Next 
     End With 
    End If 
End Function 

Function GetSheet(WBNAME As String, shtName As String) As Worksheet 
    On Error Resume Next 
    Set GetSheet = Workbooks(WBNAME).Worksheets(shtName) 
    On Error GoTo 0 
End Function 
+0

あなたのコードは私が望んでいたのと同じように動作するようです。私はしかし質問があります。私のコードは、私がCMISシートを参照した方法のために単純に動作することを拒否しました。外部のワークブックを参照する方法が間違っていますか? – RajdeepB

0

(私は機能JWが何をするか分からないと)それは完全な答えではないのです。 あなたのコードのためのいくつかの修正:

1.Remove以下の2つの変数の宣言(この関数を呼び出すときにそれらが通過される):

Dim BorrowerName As String 
Dim Year As String 

次の行:

Set sht = wb.Worksheets("Sheet1") - 作品私にとっては、Sheet1というシートがwbにありますか?SME-CMIS.xlsb

3.Onceは、あなたが使用することができます次の行で、その後、正しくシート変数shtを設定することができました:

LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 

一般メッセージ:これらのエラーの初めにOption Explicitを使用し、それが解決しただろう半分。

Forループを実行する前にDim i As Longを定義することを忘れないでください)。ただ、使用

If (JW(Trim(UCase(CStr(BorrowerName))), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And CStr(Year) = CStr(sht.Cells(i, 10).Value)) Then 

4. そして最後は、あなたがCstrを使用する必要はありません。次の行で、そのため、BorrowerName As String, Year As Stringを受け取るために、この関数を定義し

If (JW(Trim(UCase(BorrowerName)), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85 And Year = CStr(sht.Cells(i, 10).Value)) Then 

コード全体(テスト不可能)JW機能

Option Explicit 

Function ProposalNo(BorrowerName As String, Year As String) As String 

Dim PropNo As String 
Dim CMISPath As String 
Dim wb As Workbook 
Dim sht As Worksheet 
Dim Match As Double 
Dim i As Long 

CMISPath = "C:\Users\15169\Desktop\Data Dump\CMIS\SME- CMIS.xlsb" 
Set wb = Workbooks.Open(CMISPath) 
Set sht = wb.Worksheets("Sheet1") 

LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 
For i = 2 To LastRow 
    If ((JW(Trim(UCase(BorrowerName)), Trim(UCase(sht.Cells(i, 11).Value))) >= 0.85) And (Year = CStr(sht.Cells(i, 10).Value))) Then 
     PropNo = sht.Cells(i, 1) 
    End If 
Next 

ProposalNo = PropNo 

End Function 
+0

こんにちは、私は後半に返信することをお詫び申し上げます。私はあなたのコードを試しました。私がUDFを使用するたびに、私は直面したものと同じ#VALUE!を返します。私のコードでは、シートをブックに入れてコードを修正してもエラーは解決されましたが、それはいつも私の選択肢にはなりません。 CMISシートをどのように参照しているのかという問題に何らかの形で関係しているという事実を頭に浮かべているようには思えません。 – RajdeepB

関連する問題