我想用VBA中的函数替换此公式:=IFERROR(INDEX(SZCategoryData!E:E,MATCH(1,('SZCategory tailored'!B$3=SZCategoryData!F:F)*('SZCategory tailored'!A12=SZCategoryData!A:A),0)),"")
我使用了这个功能:
Sub BRM_ID1()
For i = 2 To 224
For j = 4 To 224
If Worksheets("SZCategoryData").Cells(i, 6).Value = "BRM_ID" Then
Worksheets("SZCategory tailored").Cells(j, 2).Value = Worksheets("SZCategoryData").Cells(i, 5)
End If
Next
Next
End Sub
我的工作表Task_id
和B列(与SZCategoryData
相关联的BRM_ID
)中有A列(task id
):1211,1211,1212,1213,1214我需要在另一张SZCategoryData
中从SZCategory tailored
复制到C列。
有时我的task Id
没有关联的brm_id
,因此我的代码存在问题:它是一个接一个的复制值,而不检查它是否与右task id
相关联。例如,我的task id 1212
没有在列B中关联BRM_ID
而不是将单元格保留为空,而是复制BRM ID
1213
(下一个)。 / p>
答案 0 :(得分:1)
我不完全确定我理解您的代码,但希望这会让您更接近解决方案。正如Mat's Mug正确指出的那样,你需要更多描述性的名字和你的变量。这使您更容易理解您的代码。打开Option Explicit
也不会有任何伤害。
以下是修改过的代码:
Sub BRM_ID1()
Dim SourceData As Worksheet
' Highly recommend not relying on ActiveWorkbook. Only using it as a qualifier since that is the current qualifier (though implicit).
Set SourceData = ActiveWorkbook.Worksheets("SZCategoryData")
Dim TailoredData As Worksheet
Set TailoredData = ActiveWorkbook.Worksheets("SZCategory tailored")
Dim SourceRow As Long
' You're going to run into issues with the hardcoded min and max values here.
For SourceRow = 2 To 224
Dim DestinationRow As Long
' Here as well.
For DestinationRow = 4 To 224
' Note that I am assuming that you want to match the value in TailoredData.Cells(DestinatioNRow, 6).
' You will need to adjust this depending on where your match value is.
If SourceData.Cells(SourceRow, 6).Value = TailoredData.Cells(DestinationRow, 6).Value Then
TailoredData.Cells(DestinationRow, 2).Value = SourceData.Cells(SourceRow, 5)
End If
Next
Next
End Sub
如果我正确理解您的代码和问题,那么您遇到了问题,因为您的代码只是检查单元格的值是否等于"BRM_ID"
。实际上,您需要检查Task_ID
的{{1}}是否等同于TailoredData
的{{1}}。我正确地对齐了这个,但我不知道你的任务/ brm_id存储在哪里。您的问题是列Task_ID
,SourceData
和A
,但您的索引(B
和C
)并不对齐。< / p>
最后,我强烈建议您使用数组和词典。一旦你运行这个解决方案,它就可以工作,但它不会长时间工作。代码脆弱。换句话说,如果一个 detail 发生更改,代码将停止正常工作。例如,如果数据的长度从224行变为224,000行,则需要修复代码以反映这一点(并且预计处理时间也会大幅增加)。
这将让您开始学习VBA,但我强烈建议您进一步改进代码(或者,理想情况下,努力提高您的Excel技能并尽可能避免使用VBA,以便您只解决VBA问题您可以通过Excel提供的内置功能合理地解决这个问题。
祝你好运!