次のコードは、より大きな手順から抜粋したものです(周囲のコードは関係ありません)。誰も私が2番目のContainsKey行がTrueを返すことができない理由を説明することはできますか?ヒント:ループを減らすために、少数の入力セルがあるワークシートでこれを試してみてください。Vb.Net Excelの範囲をキーとして辞書を使用する
For Each ws As Excel.Worksheet In Wb.Worksheets
Dim dic As New Dictionary(Of Excel.Range, String)
rngUsed = ws.UsedRange
For Each cell As Excel.Range In rngUsed
dic.Add(cell, "test")
'THE FOLLOWING TWO MESSAGES SHOULD DISPLAY THE SAME RESULT, BUT DO NOT. WHY???
MsgBox(dic.ContainsKey(cell)) 'Returns True
MsgBox(dic.ContainsKey(ws.Range(cell.Address))) 'Returns False
Next
Next
UPDATE:私は、次のコードを追加して、それが動作しているようだ:
Dim dic As New Dictionary(Of Excel.Range, String)(New MyComparer()) 'replaces line from above
Class MyComparer
Implements IEqualityComparer(Of Excel.Range)
Public Function Equals1(ByVal x As Excel.Range, ByVal y As Excel.Range) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Excel.Range).Equals
If x.Address(External:=True) = y.Address(External:=True) Then
Return True
Else
Return False
End If
End Function
Public Function GetHashCode1(ByVal obj As Excel.Range) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Excel.Range).GetHashCode
Return obj.Count.GetHashCode
End Function
エンドクラス
オブジェクトは辞書のキーとして使用されている
なぜ 'cell.Address'をキーとして使用しないのですか? –
ティム、あなたの質問に答えるには、それは行の挿入/削除が私のキーを台無しにするためです。私は上の答えであると信じているものを掲示しました(これまでのところうまくいくようです)。 – OfficeAddinDev
@Ryanあなた自身の解決策に満足している場合は、アップデートを回答に移して受け入れてください。 –