![](/img/trans.png)
[英]Excel macro to copy data from one sheet to another based on specific matching conditions
[英]Grab data from another sheet based on values matching in Excel with VBA
我的目標是擁有第二個工作表(CalcValues),其本質上是查找值(如果fieldA = x,fieldB = y,fieldC = z,則value = a)。
我所擁有的骨骼(我不在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作為查找字段列索引。
不起作用,但是目標是,如果我設置了這些字段之一,則將在偽C#實體框架中進行檢查,並將其與我從Excel的VBA中了解到的東西混在一起,例如:
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#中具有類似於List的動態數組,並使用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
好吧,我終於明白了。 最初,我做了很多假設,發現在功能上有很大不同(也許有更好的方法,但這似乎可行):
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.