VLOOKUPの式を読み込み、INDEX/MATCHに変換するコードを空にしてしまったので、自分で書きました。VLOOKUPをINDEX/MATCHに変換するためのVBAの柔軟性を向上
しかし、コードには柔軟性がありませんが、動作させる方法を理解できないようです。具体的には、VLOOKUP式の各範囲基準を、絶対参照であるかどうか、つまり$で始まるものとしてテストし、その結果得られるINDEX/MATCH式にその範囲を持ち込んでいきたいと考えています。たとえば、式=VLOOKUP(A2,$A$1:B$11,2,FALSE)
は=INDEX(B$1:B$11,MATCH(A2,$A1:$A11,0))
に変換する必要があります。
注:このサブは、2つの関数(ColumnLetterToNumberおよびColumnNumberToLetter)によって異なります。彼らの名前が意味するように、彼らは列の文字または数字を取り、それらを相互変換する。これらの機能はどちらも短く、シンプルで、問題なく動作します。しかし、どちらか一方または両方のコードが有用であると誰もが信じている場合は、それらを提供することができます。
さらに、コードの可読性および/または実行効率を向上させるためのアイデアも高く評価されます。私はVLOOKUP/HLOOKUPまたはVLOOKUP/MATCHの組み合わせ式を処理することを可能にする次のステップにこれを取るために助けを捜しているわけではない。この時
Option Explicit
Public Sub ConvertToIndex()
Dim booLookupType As Boolean
Dim booLeftOfColon As Boolean
Dim booHasRowRef As Boolean
Dim lngStartCol As Long
Dim lngRefCol As Long
Dim lngStart As Long
Dim lngEnd As Long
Dim lngMatchType As Long
Dim lngInt As Long
Dim lngRowRef As Long
Dim strRefCol As String
Dim strOldFormula As String
Dim strNewFormula As String
Dim strLookupCell As String
Dim strValueCol As String
Dim strMatchCol As String
Dim strStartRow As String
Dim strEndRow As String
Dim strCheck As String
Dim strLookupRange As String
Dim strTabRef As String
Dim strSheetRef As String
Dim rngToMod As Range
Dim rngModCell As Range
Set rngToMod = Selection
For Each rngModCell In rngToMod
strOldFormula = rngModCell.Formula
lngStart = InStrRev(strOldFormula, "VLOOKUP(")
If lngStart > 0 Then
lngStart = InStr(lngStart, strOldFormula, "(") + 1
lngEnd = InStr(lngStart, strOldFormula, ",")
strLookupCell = Mid(strOldFormula, lngStart, lngEnd - lngStart)
lngStart = lngEnd + 1
lngEnd = InStr(lngStart, strOldFormula, ",")
strLookupRange = Mid(strOldFormula, lngStart, lngEnd - lngStart)
lngStart = lngEnd + 1
lngEnd = InStr(lngStart, strOldFormula, ",")
lngRefCol = CInt(Mid(strOldFormula, lngStart, lngEnd - lngStart))
lngStart = lngEnd + 1
lngEnd = InStr(lngStart, strOldFormula, ")")
booLookupType = (Mid(strOldFormula, lngStart, lngEnd - lngStart) = "TRUE")
If booLookupType Then
lngMatchType = 1
Else
lngMatchType = 0
End If
booLeftOfColon = True
lngEnd = InStr(1, strLookupRange, "]")
If lngEnd > 0 Then
strSheetRef = Left(strLookupRange, lngEnd)
strLookupRange = Right(strLookupRange, Len(strLookupRange) - lngEnd)
Else
strSheetRef = ""
End If
lngEnd = InStr(1, strLookupRange, "!")
If lngEnd > 0 Then
strTabRef = Left(strLookupRange, lngEnd)
strLookupRange = Right(strLookupRange, Len(strLookupRange) - lngEnd)
Else
strTabRef = ""
End If
For lngInt = 1 To Len(strLookupRange)
strCheck = Mid(strLookupRange, lngInt, 1)
Select Case True
Case strCheck = ":"
booLeftOfColon = False
Case booLeftOfColon
If IsNumeric(strCheck) Then
strStartRow = strStartRow & strCheck
Else
strMatchCol = strMatchCol & strCheck
End If
Case Else
If IsNumeric(strCheck) Then strEndRow = strEndRow & strCheck
End Select
Next lngInt
strMatchCol = Replace(strMatchCol, "$", "")
lngStartCol = ColumnLetterToNumber(strMatchCol)
strValueCol = ColumnNumberToLetter(lngStartCol + lngRefCol - 1)
If Len(strStartRow) > 0 Then strStartRow = "$" & strStartRow
If Len(strEndRow) > 0 Then strEndRow = "$" & strEndRow
strValueCol = strSheetRef & strTabRef & strValueCol & strStartRow & ":" & strValueCol & strEndRow
strMatchCol = strSheetRef & strTabRef & strMatchCol & strStartRow & ":" & strMatchCol & strEndRow
strNewFormula = "=INDEX(" & strValueCol & ",MATCH(" & "$" & strLookupCell & "," & strMatchCol & "," & lngMatchType & "))"
rngModCell.Formula = strNewFormula
End If
Next rngModCell
End Sub
。
まずオフ、ちょうどロジックによって: '= VLOOKUP(A2、$ A $ 1:$ 11,2、FALSE)は、' '= INDEXに変換する必要がありますBでは、 ($ B $ 1:B $ 11、MATCH(A2、$ A $ 1:A $ 11,0)) '!範囲は、開始点と終了点の列では絶対的ですが、これは結果にも当てはまります。これはあなたのケースではそれほど問題ではありませんが、より複雑な数式を使用して大きな問題を抱えています。しかし、まだ、あなたのサブを読まずに私は自分自身で書くようにしようとします(それは厄介なので、私と私はそのような仕事が好きです);) –
私はかなり理解していません。まず、あなたのコードで '$'をすべて削除しています。だから、なぜあなたは最初にそれらを排除するのですか?ところで、あなたは既存の 'VLookUp'式を使って上記のコードを解析し、その断片に分解しようとしているようです。しかし、この方法は '= VLOOKUP(IF(G4 = 0,1,2)、A1:B10,1,1)'などの複合式の可能性を克服していないようです。 – Ralph
@DirkReichel私が与えた変換例の鍵は、VLOOKUPでは、Bの前に$がないことです(その範囲を拡大できるようにしています)。もちろん、VLOOKUPは数式をドラッグするのには役立ちません。同僚は範囲を拡大するための準備としてVLOOKUPSをセットアップしました。 –