2017-01-25 11 views
0

特定の国がOECDのメンバーであるかどうかを確認する簡単なUDFを作成しています。国の名前すべてのOECD諸国を含む列の最初のセルを含むVBA for ExcelでUDFに無効な名前が入力されています

  • 入力を含む

    1. Excelのセル:私は2つの入力を持っています。

    機能は、ループを介してCandidatecountriesの列のセルの内容を比較します。候補者名がいずれのOECD諸国とも一致しない場合、最終的にはOECD以外の国として分類される。

    Function OECD(Candidate, Countries) 
        Dim Candidate As String 
        Dim Countries As String 
        OECDCountry = Countries 'Variable that changes at every iteration, I compare the name of the candidate to this 
        For i = 1 To 34  
         If Candidate.Value = OECDCountry Then 
          OECD = 2     
         Else: OECDCountry = Countries.Offset(i, 0) 
        Next i 
    
    'If the column next to the candidate name, where I am running this function, is still empty, record the country as non-OECD 
    
        If Candidate.Offset(0, 1) <> 2 Then OECD = 1     
    End Function 
    

    しかし、私は機能を使用しようとすると、第2の入力を選択しながら、私は次のエラーメッセージが表示されます:

    あなたが入力した名前

    私のコードは次のようです有効じゃない。この理由は含めることができます。

    -The名が文字または-The名はExcelと

    -The名前の競合が内蔵されたスペースやその他の無効な文字が含まれてい

    アンダースコアで始まっていません名前またはワークブック内の別のオブジェクトの名前

    なぜこのエラーメッセージが表示され、修正できますか?

  • +2

    のようにセルの数式でワークシートから呼び出します。変数に '候補 'と' Countries'をあなたの関数に引数として渡すように要求し、関数自体に同じ名前の変数を宣言します。それらは同一の名前であってはならない可能性があります。また、 'Candidate.Value'を' Dim Candidate As String'にしようとしましたが、String変数に.Valueプロパティがありません(ただし、渡された引数がセル参照として渡された場合でも可能です)。 – tigeravatar

    +0

    2番目のパラメータ 'Countries As Range'の使用を検討すると、** UDF **コードがより簡単になります –

    +1

    そして、' OECDCountry'を 'String'と宣言する必要があります。また、UDFを「揮発性」として宣言して、すべての国の列を変更することでUDFを再呼び出しできるようにする必要があります。そして、あなたはUDFを必要とせずにすべてを行うために 'VLOOKUP'を使うことを考えましたか? – YowE3K

    答えて

    0

    OECD諸国は、あまり頻繁に変化しないという点で、静的なデータの一例だと私は思う。私はどこかのシートにデータを保存し、最初にScripting.Dictionaryを使用してキャッシュに読み込んだ後、Existsメソッドを使用することができます。ここに私の解決策

    Option Explicit 
    
    Private mdicRunTimeCacheOECDCountries As Scripting.Dictionary 
    
    Sub DevTimeSetup_RunOnce() 
    
        ' ___   _____ _   ___  _    ___   ___ 
        '| \ _____ _|_ _(_)_ __ ___/ __| ___| |_ _ _ _ __ | _ \_ _ _ _/_ \ _ _ __ ___ 
        '| |)/-_) V/| | | | ' \/ -_)__ \/ -_) _| || | '_ \ | /|| | ' \ (_) | ' \/ _/ -_) 
        '|___/\___|\_/ |_| |_|_|_|_\___|___/\___|\__|\_,_| .__/_|_|_\\_,_|_||_\___/|_||_\__\___| 
        '             |_| |___|           http://www.network-science.de/ascii/ 
        '* just some code to set up a sheet with some data as OP supplied none 
        '* so that anyone can play with this problem 
        Dim rngOECD As Excel.Range 
        Set rngOECD = Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(7, 1)) 
        rngOECD.Value2 = [{"USA";"UK";"Germany";"France";"Italy";"Japan";"Canada"}] 'not full OECD, just G7 
        rngOECD.Name = "OECDCountries" 
    
    End Sub 
    
    
    Private Function GetRunTimeCacheOECDCountries() As Scripting.Dictionary 
        If mdicRunTimeCacheOECDCountries Is Nothing Then 
         Set mdicRunTimeCacheOECDCountries = New Scripting.Dictionary 
    
         Dim rngOECD As Excel.Range 
         Set rngOECD = Sheet1.Range("OECDCountries") 
    
         Dim rngLoop As Excel.Range 
         For Each rngLoop In rngOECD 
          mdicRunTimeCacheOECDCountries.Add rngLoop.Value2, 0 
         Next 
    
        End If 
        Set GetRunTimeCacheOECDCountries = mdicRunTimeCacheOECDCountries 
    End Function 
    
    
    
    Public Function OECD(Candidate) As Long 
        OECD = VBA.IIf(GetRunTimeCacheOECDCountries.Exists(Candidate), 1, 0) 
    End Function 
    

    で、あなたはあなたのスコープ内で重複した名前を持つこの

    =OECD("UK")

    +0

    ありがとうございました。期待していたよりも難しいものでしたが、今私は理解していると思います – Patapunfate

    関連する問題