
指定された範囲のセルをループし、何らかのコンテンツに一致するセルの隣のセルを返す簡単なマクロを作成しようとしています。
いくつかのフォーラムから、セル オブジェクトに機能するはずの行を見つけました。
someCell.Offset(0,colIndex)
しかし、デバッグしてみると、選択範囲からの入力データは Variant/String のセットであり、「セル」オブジェクトではないことがわかります。
関数で Variant/Strings ではなくセルの範囲を取得する方法はありますか?
私の完全なコードも以下です:
Function RVLOOKUP(target, criteriaCellRange, colIndex)
Dim found as Boolean
Dim resultCell as Variant
For Each cell In criteriaCellRange
matchPosition = instr(target,cell)
If matchPosition > 0 Then
found = True
resultCell = cell
Exit For
end if
Next cell
If found Then
' Here resultCell seems to be just a String not an actual cell object
RVLOOKUP = resultCell.Offset(0,colIndex)
else
RVLOOKUP = "#NoMatch"
end if
End Function
更新: このコードは、セル ターゲットのテキストと完全または部分的に一致するセルを criteriaCellRange から検索し、criteriaCellRange の一致するセルから colIndex の水平オフセットを持つセルを返すことになっています。つまり、基本的には部分的なテキストにも一致する VLOOKUP です。
それで...ここ私たちは同じ問題を抱えており、その答えは私の疑いを裏付けています。
セル範囲を関数のパラメータとして渡す場合、関数は文字列または値のいずれかを受け取ると思います。ゼロは空白セルの値です。コードを見ないと、問題の解決策を提案するのは難しいです。
ちなみに私はLibreoffice 5.4.4.2を使用しています。
答え1
ほんの少し調整するだけです:
Function RVLOOKUP(target, criteriaCellRange, colIndex)
Dim found As Boolean
Dim resultCell As Range
For Each cell In criteriaCellRange
matchPosition = InStr(cell, target)
If matchPosition > 0 Then
found = True
Set resultCell = cell
Exit For
End If
Next cell
If found Then
' Here resultCell seems to be just a String not an actual cell object
RVLOOKUP = resultCell.Offset(0, colIndex)
Else
RVLOOKUP = "#NoMatch"
End If
End Function
私は議論を逆転させInStr()
てresultCell
範囲
答え2
引数は値として渡される
Calc からマクロに渡される引数は常に値です。どのセルが使用されているかを知ることはできません。たとえば、=PositiveSum(A3) はセル A3 の値を渡し、PositiveSum はセル A3 が使用されたことを知る方法がありません。セル内の値ではなく、どのセルが参照されているかを知る必要がある場合は、範囲を文字列として渡し、文字列を解析して、参照されているセル内の値を取得します。
だから私が達成したいことは不可能です。:(