简体   繁体   English

根据与VBA在Excel中匹配的值从另一张表中获取数据

[英]Grab data from another sheet based on values matching in Excel with VBA

The goal is that I have a second worksheet (CalcValues) with essentially lookup values (if fieldA = x, fieldB = y, fieldC = z, then value = a). 我的目标是拥有第二个工作表(CalcValues),其本质上是查找值(如果fieldA = x,fieldB = y,fieldC = z,则value = a)。

The skeleton of what I have (I don't work in VBA, so this may be wrong): 我所拥有的骨骼(我不在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

With FIELDA-E being the lookup fields column indexes. 使用FIELDA-E作为查找字段列索引。

Not functional, but the goal is that if I set one of those fields a check is done, in pseudo-C# entity framework mixed in with what little I know from Excel's VBA something like: 不起作用,但是目标是,如果我设置了这些字段之一,则将在伪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);
 ...

With the question being how do I achieve the filtering in the var data... data = data.Where(c => c.ColumnE == fieldEVal); 问题是如何在var数据中实现过滤... data = data.Where(c => c.ColumnE == fieldEVal); section I pseudo coded? 我是伪代码?

edit: I'm doing some reviewing, but it looks like my best bet is to somehow have a dynamic array akin to a List in C#, and use Application.WorkSheet.Match to get there, would that be a correct? 编辑:我正在做一些检查,但看来我最好的选择是以某种方式在C#中具有类似于List的动态数组,并使用Application.WorkSheet.Match到达那里,这是正确的吗?

edit2: Okay, I updated it (so can most likely ignore the 2nd section outside of seeing intent), but I'm not certain the code is correct (isn't firing): 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

Okay, I finally figured it out. 好吧,我终于明白了。 A lot of assumptions were made on my part initially and come to find out it was quite a bit different functionally (perhaps there's a better way, but this seems to work): 最初,我做了很多假设,发现在功能上有很大不同(也许有更好的方法,但这似乎可行):

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.

相关问题 Excel宏可根据特定的匹配条件将数据从一张纸复制到另一张纸 - Excel macro to copy data from one sheet to another based on specific matching conditions Excel VBA-根据图纸上的单元格值从阵列中粘贴值 - Excel VBA - Paste values from array based on cell values on the sheet Excel VBA - 根据条件文本字符串将数据范围从一个工作表传输到另一个工作表 - Excel VBA - Transfer Data range from one sheet to another based on conditional text string 使用VBA根据列名将数据从一个Excel工作表复制到另一个(复杂)工作表 - Copy data from one excel sheet to another (complex) using VBA based on column name 根据匹配值将相应的值从一张纸复制到另一张纸 - Copying corresponding values from one sheet to another based on matching value Excel VBA从剪贴板粘贴到另一个工作表仅值 - Excel vba paste from clipboard to another sheet only values VBA代码 - 根据匹配条件将单元格中的单元格复制到Excel中的另一个工作表 - VBA Code - Copying cells from one sheet to another sheet in excel depending on matching condition 使用VBA根据另一个工作表中的值填充单元格 - Populating Cells using VBA based on Values from another sheet vba / excel-根据用户输入到sheet1的单元格中,从sheet2的值填充sheet1中的单元格 - vba/excel - populate cells in sheet1 from values in sheet2 based on user input into cells on sheet1 在每个工作表匹配的单元格上复制一个单元格并将其粘贴到另一个VBA - Copy a cell on one sheet and paste it on another VBA based on cell from each sheet matching
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM