VBA

时间:2018-01-29 17:02:45

标签: vba excel-vba excel-formula excel

我想用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>

1 个答案:

答案 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_IDSourceDataA,但您的索引(BC)并不对齐。< / p>

最后,我强烈建议您使用数组和词典。一旦你运行这个解决方案,它就可以工作,但它不会长时间工作。代码脆弱。换句话说,如果一个 detail 发生更改,代码将停止正常工作。例如,如果数据的长度从224行变为224,000行,则需要修复代码以反映这一点(并且预计处理时间也会大幅增加)。

这将让您开始学习VBA,但我强烈建议您进一步改进代码(或者,理想情况下,努力提高您的Excel技能并尽可能避免使用VBA,以便您只解决VBA问题您可以通过Excel提供的内置功能合理地解决这个问题。

祝你好运!