Loop de busca de linha do Excel VBA

1

Eu tenho três planilhas: "bom", "MPS" e "DData". O que eu estou tentando fazer é primeiro ler o valor da célula A2 de "MPS" e buscar todas as linhas de "bom" que na coluna A têm esse valor e listá-las para "DData".

Ao mesmo tempo, precisaria dos valores nas colunas C e D de "MPS" para serem buscados nas linhas correspondentes. Portanto, se o valor no valor A2 da célula "MPS" corresponder a 4 linhas em "bom", os valores das células C2 e D2 devem ser colocados após essas 4 linhas. Isso não funciona corretamente no momento.

Uma vez que este loop é feito, ele deve passar para o valor de célula A3 em "MPS" e assim por diante ... O código abaixo funciona um pouco. Eu tentei adicionar um segundo loop e tudo mais que me veio à mente, mas sem boa sorte. O maior problema é que se MPS!A2 tiver valor 1, A3 = 2 e A4 for 1 novamente, ele não listará os valores de "bom" uma segunda vez.

O código é baseado nisso originalmente: link

Public Sub CommandButton1_Click()

    Dim countRows1 As Long, countRows2 As Long
    countRows1 = 2  'the first row of your dataset in sheet1
    endRows1 = 50   'the last row of your dataset in sheet1
    countRows2 = 2  'the first row where you want to start writing the found rows
    For j = countRows1 To endRows1

        Dim keyword As String: keyword = Sheets("MPS").Cells("A2, A100").Value
        If Sheets("bom").Range("A2, A100").Value = keyword Then
            Sheets("DData").Rows(countRows2).Value = Sheets("bom").Rows(j).Value
            Sheets("DData").Rows(countRows2).Cells(6).Value = Sheets("MPS").Rows(countRows2).Cells(3).Value
            Sheets("DData").Rows(countRows2).Cells(7).Value = Sheets("MPS").Rows(countRows2).Cells(4).Value
            countRows2 = countRows2 + 1


        End If

    Next j

End Sub

Minha mente diz que isso definitivamente precisa de dois loops, mas eu simplesmente não consegui fazê-lo funcionar.

Não posso postar imagens, mas vou tentar ilustrar o que é necessário e acontecer melhor abaixo.

Estrutura e dados da planilha "bom" (intervalo A1: E7):

id       desc   id_part   desc_part   qty
30010   build1  10200     part1        1
30010   build1  23002     part2        3
30010   build1  21003     part3       500
30010   build1  21503     part4       400
20010   build2  10210     part5       100
20010   build2  10001     part6        5

Estrutura da folha "MPS" e dados (intervalo A1: D4):

 id     desc    week    batches
30010   build1  1         2
20010   build2  2         4
30010   build1  2         0

Estrutura da folha "DData" (intervalo A1: H3) e o que é retornado com seu código panhandel:

id      desc    id_part    desc_part    qty     week     batches    total(=qty*batches)
30010                                             1          2  
30010                                             2          0  

E meu objetivo é este:

id      desc    id_part   desc_part     qty     week     batches    total (=qty*batches)
30010   build1  10200     part1          1       1          2   
30010   build1  23002     part2          3       1          2   
30010   build1  21003     part3         500      1          2   
30010   build1  21503     part4         400      1          2   
20010   build2  10210     part5         100      2          4   
20010   build2  10001     part6          5       2          4
30010   build1  10200     part1          1       2          0   
30010   build1  23002     part2          3       2          0   
30010   build1  21003     part3         500      2          0   
30010   build1  21503     part4         400      2          0

... também onde H2, por exemplo, teria o valor de E2 * G2.

*** Eu tentei mudar

Sheets("DData").Range("A" & countRows2).Value = Sheets("bom").Range("A" & lCount).Value

para

Sheets("DData").Rows(countRows2).Value = Sheets("bom").Rows(lCount).Value

por exemplo, mas o Excel começou a travar com dificuldade. É mais sensato usar o Range em vez de Rows?

    
por Ben Gretzky 23.05.2015 / 14:43

1 resposta

1

EDITED: Um loop passa linha a linha pela coluna A do MPS, o segundo loop compara cada valor da coluna A do MPS com todos os valores A da coluna "bom". Uma vez encontrada uma correspondência, cada célula individual é copiada (há uma maneira mais rápida de fazer isso, tenho certeza, mas isso ilustra bem o que está acontecendo) na planilha DData, e a coluna H recebe uma fórmula para calcular o total.

As guias são definidas como as que você tem agora e resultam no que você está esperando / precisando.

Sub Button1_Click()
    Dim countRows2 As Long
    countRows2 = 2 'the first row where you want to start writing the found rows

    Dim szMPSValues As Variant
    Dim szbomValues As Variant
    Dim lCount As Long
    Dim lCountbom As Long
    Dim MPSRng As Range
    Dim bomRng As Range
    Dim szConcatString As Variant
    Dim strKeyword As String

    'gets range of used cells
    Set MPSRng = Intersect(Columns("A").Cells, Worksheets("MPS").UsedRange)
    If MPSRng Is Nothing Then MsgBox "Nothing to do"

    'have to switch sheets to set the second loop's range of "bom" values
    Worksheets("bom").Activate
    Set bomRng = Intersect(Columns("A").Cells, Worksheets("bom").UsedRange)
    Worksheets("MPS").Activate

    'saves range values into arrays
    szMPSValues = MPSRng.Value
    szbomValues = bomRng.Value

    'double check a to be sure its an array and of proper size
    If Not IsArray(szMPSValues) Then ReDim a(1, 1): szMPSValues = MPSRng.Value

    'loop through array concatenating cell values with a space after cell value
    'NOTE: Changed this to start at 2 in case you have a header row**
    For lCount = 2 To UBound(szMPSValues)
        strKeyword = Sheets("MPS").Range("A" & lCount).Value            'gets MPS.A2, MPS.A3, etc

        For lCountbom = 2 To UBound(szbomValues)
            If Sheets("bom").Range("A" & lCountbom).Value = strKeyword Then    'compares to bom.A2, bom.A3, etc

                    Sheets("DData").Range("A" & countRows2).Value = Sheets("bom").Range("A" & lCountbom).Value
                    Sheets("DData").Range("B" & countRows2).Value = Sheets("bom").Range("B" & lCountbom).Value
                    Sheets("DData").Range("C" & countRows2).Value = Sheets("bom").Range("C" & lCountbom).Value
                    Sheets("DData").Range("D" & countRows2).Value = Sheets("bom").Range("D" & lCountbom).Value
                    Sheets("DData").Range("E" & countRows2).Value = Sheets("bom").Range("E" & lCountbom).Value
                    Sheets("DData").Range("F" & countRows2).Value = Sheets("MPS").Range("C" & lCount).Value
                    Sheets("DData").Range("G" & countRows2).Value = Sheets("MPS").Range("D" & lCount).Value
                    Sheets("DData").Range("H" & countRows2).Formula = "=$F" & countRows2 & "*$G" & countRows2
                    countRows2 = countRows2 + 1
            End If
        Next lCountbom
    Next lCount
End Sub
    
por 23.05.2015 / 20:28