Loops en VBA

Hai situacións nas que un programa VBA é necesario para realizar o mesmo conxunto de accións varias veces seguidas (é dicir, repetir o mesmo bloque de código varias veces). Isto pódese facer usando bucles VBA.

Os bucles VBA inclúen:

A continuación, analizaremos cada un destes ciclos.

Operador de bucle para en Visual Basic

Estrutura do operador de bucle o en Visual Basic pódese organizar nunha das dúas formas: como un bucle Para... A continuación ou como un bucle Para cada un.

Ciclo "Para... Seguinte"

Ciclo Para... A continuación usa unha variable que toma secuencialmente valores dun intervalo determinado. Con cada cambio do valor da variable realízanse as accións incluídas no corpo do ciclo. Isto é fácil de entender a partir dun exemplo sinxelo:

Para i = 1 a 10 Total = Total + iArray(i) Seguinte i

Neste simple bucle Para... A continuación utilízase a variable i, que toma secuencialmente os valores 1, 2, 3, … 10, e para cada un destes valores, execútase o código VBA dentro do bucle. Así, este bucle suma os elementos da matriz. iArray en variable Total.

No exemplo anterior, non se especifica o incremento do bucle, polo que para incrementar a variable i de 1 a 10, o valor predeterminado é un incremento 1… Non obstante, nalgúns casos é necesario utilizar diferentes valores de incremento para o bucle. Isto pódese facer usando a palabra clave Pasocomo se mostra no seguinte exemplo sinxelo.

Para d = 0 a 10 Paso 0.1 dTotal = dTotal + d Seguinte d

Xa que no exemplo anterior, o paso de incremento establécese igual a 0.1, entón a variable dTotal para cada repetición do ciclo toma os valores 0.0, 0.1, 0.2, 0.3,... 9.9, 10.0.

Para determinar o paso do bucle en VBA, pode usar un valor negativo, por exemplo, como este:

Para i = 10 Para 1 Paso -1 iArray(i) = i Seguinte i

Aquí está o incremento -1, polo que a variable i con cada repetición do ciclo toma os valores 10, 9, 8, ... 1.

Loop "Para cada un"

Ciclo Para cada un semellante a un ciclo Para... A continuación, pero en lugar de iterar sobre a secuencia de valores para a variable contador, o bucle Para cada un realiza un conxunto de accións para cada obxecto do grupo de obxectos especificado. No seguinte exemplo, usando un bucle Para cada un enumera todas as follas do libro de Excel actual:

Dim wSheet como folla de traballo para cada wSheet nas follas de traballo MsgBox "Найден лист: " & wSheet.Name Seguinte wSheet

Instrucción de interrupción de bucle "Saír para"

Operador Saír para usado para interromper o ciclo. Tan pronto como se atopa esta instrución no código, o programa remata a execución do bucle e procede á execución das instrucións que están no código inmediatamente despois deste bucle. Isto pódese usar, por exemplo, para buscar un valor específico nunha matriz. Para iso, mediante un bucle, cada elemento da matriz é dixitalizado. Tan pronto como se atopa o elemento necesario, non hai que mirar polo resto: o ciclo interrómpese.

Aplicación de operador Saír para demostrado no seguinte exemplo. Aquí o bucle itera máis de 100 entradas de matriz e compara cada unha co valor da variable dVal… Se se atopa unha coincidencia, o bucle remata:

Para i = 1 a 100 If dValues(i) = dVal Then IndexVal = i Saír para End If Next i

O bucle Do While en Visual Basic

Ciclo Fai mentres executa un bloque de código sempre que se cumpra a condición especificada. O seguinte é un exemplo dun procedemento submarino, no que usando o bucle Fai mentres Os números de Fibonacci que non excedan de 1000 móstranse secuencialmente:

O 'Sub procedemento produce números de Fibonacci que non superan 1000 Sub Fibonacci() Dim i As Integer ' Contador para indicar a posición do elemento na secuencia Dim iFib As Integer 'almacena o valor actual da secuencia Dim iFib_Next As Integer 'almacena o seguinte valor da secuencia Dim iStep As Integer 'almacena o tamaño do seguinte incremento' inicializa as variables i e iFib_Next i = 1 iFib_Next = 0 'Do While o bucle executarase ata que o valor do número de Fibonacci actual sexa maior que 1000 Do While iFib_Next < 1000 If i = 1 Entón, "caso especial para o primeiro elemento iStep = 1 iFib = 0 Se non, garda o tamaño do seguinte incremento antes de sobrescribir "o valor actual da secuencia iStep = iFib iFib = iFib_Next End If" imprime o número de Fibonacci actual na columna A de a folla de traballo activa "na fila co índice i Cells (i , 1).Value = iFib "calcula o seguinte número de Fibonacci e incrementa o índice de posición do elemento en 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

No exemplo dado, a condición iFib_Seguinte < 1000 comprobado ao comezo do bucle. Polo tanto, se o primeiro valor iFib_Seguinte Se houbese máis de 1000, entón o bucle nunca se executaría.

Outra forma de implementar un bucle Fai mentres - Coloque a condición non ao principio, senón ao final do ciclo. Neste caso, o bucle executarase polo menos unha vez, independentemente de que se cumpra a condición.

Esquemáticamente, tal ciclo Fai mentres coa condición que se comprobará ao final será así:

Fai... Loop While iFib_Next < 1000

Escolla «Do Until» en Visual Basic

Ciclo Fai ata moi semellante ao ciclo Fai mentres: o bloque de código no corpo do bucle execútase unha e outra vez ata que se cumpra a condición especificada (o resultado da expresión condicional é Certo). No seguinte procedemento submarino utilizando un ciclo Fai ata recuperar valores de todas as celas dunha columna A folla de traballo ata que a columna atope unha cela baleira:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'O valor da cela actual almacénase na matriz dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Valor iRow = iRow + 1 Loop

No exemplo anterior, a condición IsEmpty(Células(iFila, 1)) situado no inicio da estrutura Fai ata, polo que o bucle executarase polo menos unha vez se a primeira cela tomada non está baleira.

Non obstante, como se mostra nos exemplos de bucle Fai mentres, nalgunhas situacións é necesario que o bucle se execute polo menos unha vez, independentemente do resultado inicial da expresión condicional. Neste caso, a expresión condicional debería colocarse ao final do bucle, así:

Fai... Recorre ata que estea baleiro(Células(iFila, 1))

Deixe unha resposta