Guía práctica para pasar VBA de Excel a Javascript Excel Online

Ahora que Excel Online está habilitado para usar Scripts mediante Automate, vamos a revisar algunos fundamentos básicos para convertir nuestras macros de VBA al lenguaje de programación JavaScript, que es el preferido para estas aplicaciones.

Empecemos con un código simple en VBA que revisa valor por valor de una tabla y, si este es un numero par, establece el color de la celda en rojo.

Sub pares()
Dim i As Integer, counter As Long
Dim rng As Range
Set rng = ThisWorkbook.Sheets(1).Range("B2:B18")
counter = rng.Rows.Count
For i = 1 To counter
    If rng(i, 1).Value Mod 2 = 0 Then
        rng(i, 1).Interior.Color = RGB(250, 10, 10)
    End If
Next i
End Sub

Ahora, hablemos de las diferencias que existen entre VBA y JavaScript (en adelante JS).

La estructura principal.

En VBA, tendremos algunas opciones para iniciar un procedimiento, dependiendo siempre de si lo que vamos a crear es una Subrutina o una función.

  • Para Subrutinas usamos la estructura Sub nombre() …  End Sub.
  • Para funciones usamos la estructura Function nombre() … End Function.

En JavaScript, todos los procedimientos se van a leer como funciones, por lo que estarán escritas con:

  • Function x(){ …}

Como puedes ver arriba, las funciones en JS inician y terminan el bloque dentro de los corchetes, cualquier cosa que pase fuera no corresponde a la función y podría ser considerado como de ámbito global.

Adicional, cada nueva línea de código deberá ser separada por un punto y coma (;).

javascript meme VBA

Las variables

En cuanto a las variables, las hay de dos tipos dentro de ambos sistemas:

  • Locales: que solo se usan para un subproceso
  • Globales: que se usan para todos los scripts dentro del desarrollo.

Adicional a eso, en VBA es una muy buena práctica declarar el tipo de variable que usaremos para cada una de las palabras a reservar, cosa que en JavaScript no es realmente necesario.

Por ejemplo, en VBA podríamos crear un código para definir una variable de numero entero para realizar una división con ella en una variable de numero con decimales de la siguiente manera.

Public Sub Dividir()
Dim a as Integer, b as Double
a = 10: b = a/3
Debug.Print(a)
End Sub

Para hacer lo mismo en JavaScript deberíamos cambiar a la siguiente forma.

Function Dividir(){
Let a = 10;
Let b = a / 3;
Console.Log(b);
}

Si bien esta es la diferencia sustancial, hay que agregar que en JS encontramos mas tipos de variables que en VBA, como son las listas y los diccionarios. Para un detalle mas exacto de las variables puedes checar el siguiente enlace.

Condicionantes IF

No encontramos mucha variación entre los dos lenguajes de programación, salvo el uso de los bloques que ya describimos en la parte de la estructura.

En VBA usarías el bloque IF de la siguiente manera:

If a > b then
…
Else
…
End if

Y en JS las condicionantes se ven de la siguiente manera:

If (a>b){
…
}else{
…
}

Sentencia For y ciclos Loop

La estructura aquí cambia radicalmente, ya que si bien en VBA es un bloque de pase directo como el siguiente:

For i = 1 to 10
…
Next i

En JS tenemos que la estructura se vuelve un poco menos cómoda:

For (let i = 0; i < 10; i++){
…
}

Donde la connotación “++” después de la i se interpreta como un crecimiento por unidad de la itinerancia, algo que por defecto entiende VBA al cerrar el bloque con Next.

Adicional a esto, también podemos crear ciclos For a través de colecciones de objetos, como podría ser aplicar un procedimiento por cada hoja que tengamos en el libro de Excel. La forma natural en VBA de hacerlo sería:

Dim rng as Range
For each rng in Range(“A1:A5”)
…
Next

Y en JS encontraríamos algo similar, pero al parecer solo para acceder a las propiedades del objeto:

Let ws = workbook.getWorksheet("Sheets1")
For(let i in  ws.getRange(“A1:A5”){
…
}

Además de esto, los bloques Do reciben también un cambio significativo, considerando que en VBA se evalua la condición al inicio de cada reciclaje del bloque como se puede ver abajo:

Dim x as integer: x = 0
Do while x < 3
x = x + 1
Loop

Mientras que en JS la condición para finalizar el bucle se evalúa al finalizar el proceso:

do{
x+= 1;
} while(x<3)

Operadores.

En cuanto a los operadores puedo mencionar dos cambios sustanciales que nos podrían complicar al principio.

  1. El operador igual existe en tres formas diferentes:
    1. Un solo símbolo = sirve para asignar el valor a la variable.
    1. Dos símbolos == nos servirán para saber si un numero es igual a otro número.
    1. Tres símbolos === nos servirán para comparar un valor de texto con otro.
  2. Al usar los incrementadores de variables, JS permite hacer uso de las notaciones +=, -=, *=, /= tan famosas en otros lenguajes de programación.

Fuera de eso, el uso de los operadores parece bastante lineal, pero JS admite más símbolos para hacer cosas diferentes. Si quieres revisar todo lo que hay que decir de los operadores, puedes revisar el siguiente enlace.

Y claro, al ser dos lenguajes de programación tan distintos, tienen muchas otras particularidades, pero con eso debería bastar para completar el ejemplo que expusimos al principio:

function main(workbook: ExcelScript.Workbook){
  let rng = workbook.getWorksheet("Sheet1").getRange("B2:B18");
  let counter = rng.getRowCount();
  for(let i =0; i<counter;i++){
    if((rng.getCell(i,0).getValue() % 2) == 0){
      rng.getCell(i,0)
      .getFormat()
      .getFill()
        .setColor("FF0000");
    }
  }
}

Cualquier duda, nos leemos abajo.

Guía práctica para pasar VBA de Excel a Javascript Excel Online
Scroll hacia arriba