2

初めてstackOverflowの質問を書いているので、何か間違ったことをしたら教えてください。

私は今数時間検索しましたが、私の問題の解決策を見つけることができませんでした(通常、答えを見つけたので、スタックオーバーフローを数年間ラーカーとして使用した後、これが私の最初の質問である理由)。

基本的に、デフォルトの「前の最大の小さい」値の代わりに「次に小さい大きい」値を返すことを除いて、VLOOKUPと同様に機能する変更されたVLOOKUP関数を作成しようとしています。インデックス/一致方法を知っていますが、残念ながら、現在作業中のワークブックにすでに存在する文字通り何千ものVLOOKUPを手動で慎重に置き換える必要があります。したがって、すべてのVLOOKUPをVLOOKUPnewで「検索/置換」できるように、VLOOKUPnew関数を作成することにしました。

Function VLOOKUPnew(lookup_value As Variant, table_array As Range, _
        col_index_num As Integer, Optional exactMatch As Boolean) As Variant
    Dim row As Integer

    Debug.Print table_array.Address

    With Application
        On Error GoTo NO_ROW
        row = .Match(lookup_value, table_array.Columns(1), 0)
        On Error GoTo 0

        If row = -1 And Not exactMatch Then
            row = .Match(lookup_value, table_array.Columns(1), 1)
            row = row + 1
        End If

        VLOOKUPnew = .index(table_array.Columns(col_index_num), row, 0)
    End With

Exit Function

NO_ROW:
    row = -1
    Resume Next
End Function

そして、関数の記述に成功しましたが、問題が発生しました。「table_array」を範囲として宣言したため、vbaは他のブックへの範囲参照を識別できません

例: "= VLOOKUPnew($ A432、'reallyLongFilepath / [filename.xlsx] tablename'!$ B $ 6:$ N $ 35、columnNumber、0)、FALSE)"は#VALUEエラーに解決されます

本当に奇妙なことは、ファイルを開くと、ファイルパスが数式から外れることです( "= VLOOKUPnew($ A432、'[filename.xlsx] tablename'!$ B $ 6:$ N $ 35、columnNumber、0 )、FALSE) ")すると、カスタム関数は正常に機能し、正しい値を返します。

したがって、私の問題は、このブックを使用するために他のファイルを開く必要がないことをどのように解決するかです。Excelがどのようにアドレスまたは範囲をカスタム数式に渡しているのかさえわからないので、ファイルパスが範囲参照に含まれていると壊れているのではないかと思います。ファイルパス、ファイル名、シート、アドレスを分割する方法はありますか(渡された後)?または、文字列として渡して、簡単に分割することもできますか?または、別のブックの範囲を正しく識別するものとして渡しますか?

検索/置換のトリックを実行したいので、関数の引数を変更しないようにしていること、およびこれは作業用であるため、データレイアウトの変更が多すぎることを制限していることを覚えておいてください。また、ワークブックは他の従業員が使用するためのものであり、私はそれを使用するために設定しているだけです。

前もって感謝します!

アンドリュー

4

1 に答える 1

3

ここでかなりのジレンマに直面します。

根本的な問題は、VLOOKUP閉じたワークブックを調べることはできますが、 のRangeパラメータを調べるUDFことができないことです。範囲参照はエラーに解決されるため、関数呼び出しは型の不一致で失敗します。table_arrayパラメータ タイプを に変更Variantし、関数ヘッダーに区切りを付けると、パラメータ値が として表示されError 2036ます。

閉じたワークブックを調べる方法はありますが、それらのすべて (AFAIK) は非常に遅いです。あなたが言及したので、... I would need to carefully replace literally thousands of VLOOKUPs ...これらの線に沿った解決策は容認できないほど遅くなると思います。

INDEX/MATCH私のお勧めは、ルートに行きVBA、式の更新を行うマクロを作成することです。

于 2012-09-21T06:04:02.787 に答える