Macros do Excel: faz um loop por linhas

0

Estou trabalhando em outro projeto do Excel e, dessa vez, mergulhei meus pés em macros VBA pela primeira vez. Eu tinha um conhecimento muito básico sobre VB, mas faz mais de uma década que eu usei a linguagem, então estou bastante perdido.

De qualquer forma, tenho a seguinte função que uso para acrescentar uma linha a outra tabela. Ele funciona perfeitamente, mas não me sinto confortável com a aparência deselegante:

Sub setRecord()
    If [K2].Value <> "" Then
        appendToRecord "RecordsTable", [E2:K2].Value
    End If
    If [K3].Value <> "" Then
        appendToRecord "RecordsTable", [E3:K3].Value
    End If
    If [K4].Value <> "" Then
        appendToRecord "RecordsTable", [E4:K4].Value
    End If
    If [K5].Value <> "" Then
        appendToRecord "RecordsTable", [E5:K5].Value
    End If
    If [K6].Value <> "" Then
        appendToRecord "RecordsTable", [E6:K6].Value
    End If
End Sub

Tenho certeza de que não sou o único que sente o mesmo ...

Eu tenho um número fixo de linhas agora. No entanto, isso pode mudar no futuro e eu gostaria que meu código estivesse pronto para isso sem a necessidade de adicionar ou remover uma instrução IF.

Basicamente, eu verifico uma certa célula dentro de uma linha se ela está vazia e, se não estiver, eu corro outra função para adicionar os valores daquela linha a uma nova linha em uma tabela.

Então, minha pergunta é, existe uma maneira de percorrer um intervalo de linhas como um loop For ou ForEach enquanto verifica um valor em uma certa coluna ao longo do caminho para que eu possa tornar esse pedaço de código mais curto / mais eficiente em VBA? Quaisquer ponteiros serão muito apreciados. Estou usando o Office 365, a propósito.

    
por DeVilFisCh 23.08.2017 / 09:18

2 respostas

0

Aqui está a solução que eu criei:

Dim RecordRange As ListObject
Set RecordRange = Worksheets("Set Record").ListObjects("NewRecord")

For i = 1 To RecordRange.DataBodyRange.Rows.Count
    If RecordRange.DataBodyRange.Cells(i, RecordRange.ListColumns("N").Index) <> "" Then
        appendToRecord "RecordsTable", RecordRange.DataBodyRange.Rows(i)
    End If
Next i

Eu tentei usar os recursos na resposta que o @mcalex forneceu, mas não consegui fazê-lo funcionar - principalmente por causa da minha falta de experiência. Felizmente, encontrei alguns artigos sobre VBA e tabelas que me ajudaram a descobrir uma resposta para mim.

    
por 23.08.2017 / 14:46
1

A construção FOR do VBA é assim:

FOR counter = start TO end [Step increment]
 {...statements...}
NEXT [counter];

uso de exemplo:

Dim myCount As Integer
For myCount = 1 to 5
  MsgBox (myCount)
Next myCount

Para o seu problema, você pode começar em uma determinada célula e configurar o loop para

a) verifique a célula ativa , então

b) usar a função OFFSET do VBA para mover para a próxima célula no intervalo.

    
por 23.08.2017 / 09:31