2017-08-14 13 views
0

目標は基本的にルックアップ値を持つ2番目のワークシート(CalcValues)を持つことです(fieldA = x、fieldB = y、fieldC = z、value = a )。ExcelでVBAと一致する値に基づいて別のシートからデータを取得

私は(私はVBAでは動作しませんので、これは間違っている可能性があります)持っているもののスケルトン:

Dim calcArray 
calcArray = Array(FIELDA, FIELDB, FIELDC, FIELDD, FIELDE) 

If calcArray.Contains(Target.Column) Then 
    Dim fieldAVal, fieldBVal, fieldCVal, fieldDVal, fieldEVal 
    fieldAVal = Target.Worksheet.Cells(Target.Row, FIELDA) 
    ... 
    fieldEVal = Target.Worksheet.Cells(Target.Row, FIELDE) 
End If 

FIELDA-Eは、ルックアップフィールドの列インデックスされている状態で。

ない機能が、目標は少し、私はExcelのVBAから何か知っていることで混入した擬似C#のエンティティフレームワークの中で、私はこれらのフィールドのいずれかを設定する場合は、チェックが行われることである。

var data = Worksheets("CalcValues").Where(c => c.ColumnA == fieldAVal); 
data = data.Where(c => c.ColumnB == fieldBVal); 
... 
data = data.Where(c => c.ColumnE == fieldEVal); 

' Ideally, grabbing a row number from data. Or row itself, either or. 
' with GRABBED_ROW = the last remaining 'data' object's row number, provided one exists. 

Target.Worksheet.Cells(Target.Row, UPDATEDFIELDA) = Worksheet("CalcValues").Cells(GRABBED_ROW, UPDATEDFIELDAINDEX); 
Target.Worksheet.Cells(Target.Row, UPDATEDFIELDB) = Worksheet("CalcValues").Cells(GRABBED_ROW, UPDATEDFIELDBINDEX); 
... 

を問題はどのように私はvarデータのフィルタリングを達成するのですか?data = data.Where(c => c.ColumnE == fieldEVal);私は疑似コード化セクション?

編集:私はいくつかのレビューをしていますが、私の最善の策は何とかC#のリストに似たダイナミックな配列を持ち、Application.WorkSheet.Matchを使用してそこに到達する?

EDIT2:さて、私はそれを更新(その最も可能性の高い意思を見ての外側に第二項を無視することができます)、私は、コードかどうか分からない(焼成されていません)正しい:

For i = 1 To Worksheet("CalcValues").ListRows.Count 
    If (Worksheet("CalcValues").Cells(i, 1).Value = fieldAVal And Worksheet("CalcValues").Cells(i, 2).Value = fieldBVal And Worksheet("CalcValues").Cells(i, 3).Value = fieldCVal And Worksheet("CalcValues").Cells(i, 4).Value = fieldDVal And Worksheet("CalcValues").Cells(i, 5).Value = fieldEVal) Then 
     If (Worksheet("CalcValues").Cells(i, 6).Value = "Column A") Then 
      Target.Worksheet.Cells(Target.Row, COLUMNA).Value = Worksheet("CalcValues").Cells(i, 7).Value 
     ElseIf (Worksheet("CalcValues").Cells(i, 6).Value = "Column B") Then 
      Target.Worksheet.Cells(Target.Row, COLUMNB).Value = Worksheet("CalcValues").Cells(i, 7).Value 
     End If 
    End If 
Next 
+1

...質問は何ですか? – jmoon

+0

良い点。 2番目のセクションの後に余分な行が追加され、明示的に質問されました。 – Robert

答えて

0

さて、私はついにそれを理解した。最初は多くの仮定があり、機能的にはかなり異なっていたことがわかりました(おそらくもっと良い方法があるようですが、これはうまくいくようです)。

Dim calcArray(1 To 5) As Integer 
calcArray(1) = FIELDA 
calcArray(2) = FIELDB 
calcArray(3) = FIELDC 
calcArray(4) = FIELDD 
calcArray(5) = FIELDE 

Dim it As Integer, found As Boolean 
it = 1 
Do While it <= UBound(calcArray) And Not found 
    If (calcArray(it) = Target.Column) Then 
    found = True 
    Else 
    it = it + 1 
    End If 
Loop 

If (found) Then 
Dim fieldAVal, fieldBVal, fieldCVal, fieldDVal, fieldEVal 
fieldAVal = Target.Worksheet.Cells(Target.Row, FIELDA) 
fieldBVal = Target.Worksheet.Cells(Target.Row, FIELDB) 
fieldCVal = Target.Worksheet.Cells(Target.Row, FIELDC) 
fieldDVal = Target.Worksheet.Cells(Target.Row, FIELDD) 
fieldEVal = Target.Worksheet.Cells(Target.Row, FIELDE) 

    For i = 1 To Worksheets("CalcValues").UsedRange.Rows.Count 
    If (Worksheets("CalcValues").Cells(i, 1).Value = fieldAVal And Worksheets("CalcValues").Cells(i, 2).Value = fieldBVal And Worksheets("CalcValues").Cells(i, 3).Value = fieldCVal And Worksheets("CalcValues").Cells(i, 4).Value = fieldDVal And Worksheets("CalcValues").Cells(i, 5).Value = fieldEVal) Then 
     If (Worksheets("CalcValues").Cells(i, 6).Value = "Column A") Then 
      Target.Worksheet.Cells(Target.Row, COLUMNA).Value = Worksheets("CalcValues").Cells(i, 7).Value 
     ElseIf (Worksheets("CalcValues").Cells(i, 6).Value = "Column B") Then 
      Target.Worksheet.Cells(Target.Row, COLUMNB).Value = Worksheets("CalcValues").Cells(i, 7).Value 
     End If 
    End If 
    Next 
End If 
関連する問題