初めて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がどのようにアドレスまたは範囲をカスタム数式に渡しているのかさえわからないので、ファイルパスが範囲参照に含まれていると壊れているのではないかと思います。ファイルパス、ファイル名、シート、アドレスを分割する方法はありますか(渡された後)?または、文字列として渡して、簡単に分割することもできますか?または、別のブックの範囲を正しく識別するものとして渡しますか?
検索/置換のトリックを実行したいので、関数の引数を変更しないようにしていること、およびこれは作業用であるため、データレイアウトの変更が多すぎることを制限していることを覚えておいてください。また、ワークブックは他の従業員が使用するためのものであり、私はそれを使用するために設定しているだけです。
前もって感謝します!
アンドリュー