Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Lectura y escritura de valores de celdas | Trabajando con datos de Excel
Excel VBA para Automatización Empresarial

Lectura y escritura de valores de celdas

Desliza para mostrar el menú

Lo más básico que hace VBA es leer y escribir el valor de una celda:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(fila, columna) hace lo mismo pero usando números en lugar de letras; esto resulta realmente útil al utilizar bucles, ya que la variable del bucle es un número, no una letra:

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

Value vs. Formula vs. Formula2

Parecen intercambiables, pero no lo son:

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
Figura.3.1

Utiliza .Value cuando solo necesitas el número. Utiliza .Formula cuando escribes una fórmula en una celda, por ejemplo, para construir la columna Total de forma programática en lugar de escribirla una vez y copiarla:

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

Controla cómo se muestra un valor sin cambiar el número subyacente:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

Esto es más importante de lo que parece: una celda puede contener 0.1 y mostrar "10%" al mismo tiempo, y solo NumberFormat controla la segunda parte.

Tarea

  1. Escribir un Sub que lea el Cliente y el Total del pedido ORD1003 en dos variables y los muestre en un MsgBox.
  2. Cambiar el Estado de ORD1002 a "Shipped" usando Cells(fila, columna) en lugar de Range.
  3. Aplicar NumberFormat = "$#,##0.00" a las columnas Unit Price y Total, y "0%" a la columna Discount %.
Pista
expand arrow

1. Lectura del Cliente y Total de ORD1003

  • Primero identifica en qué fila se encuentra ORD1003 — cuenta hacia abajo en la tabla a partir de los datos iniciales del Capítulo 3: ORD1001 está en la fila 2, así que ORD1003 está dos filas más abajo.
  • Cliente y Total son dos columnas diferentes — cuenta a lo largo de la fila de encabezados (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status) para encontrar la letra de cada una.
  • Declara una variable para el nombre del cliente (String) y otra para el total (Double), referencia la hoja explícitamente como se enseñó en el Capítulo 3 (ThisWorkbook.Worksheets("Orders")), y lee el .Value de cada celda en su variable correspondiente.
  • Une ambas variables en un solo mensaje con & antes de pasarlas a MsgBox — este patrón ya lo usaste en el Capítulo 2.

2. Cambiar el Estado de ORD1002 con Cells(fila, columna)

  • Cells(row, column) utiliza números simples, no letras — ya sabes en qué fila está ORD1002 según la tabla; para la columna, solo cuenta la posición en lugar de escribir una letra (Status es la última de las nueve columnas).
  • Es una asignación directa: .Cells(row, column).Value = "Shipped", no es necesario leer nada antes.

3. Aplicar NumberFormat a tres columnas

  • NumberFormat se establece de la misma manera para un rango que para una sola celda — solo tienes que aplicarlo a F2:F6, H2:H6 y G2:G6 (verifica qué letra corresponde a Unit Price, Total y Discount % respectivamente antes de escribirlas).
  • Cada columna tiene su propia línea, ya que Unit Price/Total necesitan formato de moneda y Discount % necesita formato de porcentaje — no intentes aplicar ambos formatos en una sola línea.
  • Referenciar el rango a través de la misma variable ws que ya configuraste mantiene las tres líneas cortas y consistentes.
Solución
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 1

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Lectura y escritura de valores de celdas

Lo más básico que hace VBA es leer y escribir el valor de una celda:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(fila, columna) hace lo mismo pero usando números en lugar de letras; esto resulta realmente útil al utilizar bucles, ya que la variable del bucle es un número, no una letra:

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

Value vs. Formula vs. Formula2

Parecen intercambiables, pero no lo son:

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
Figura.3.1

Utiliza .Value cuando solo necesitas el número. Utiliza .Formula cuando escribes una fórmula en una celda, por ejemplo, para construir la columna Total de forma programática en lugar de escribirla una vez y copiarla:

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

Controla cómo se muestra un valor sin cambiar el número subyacente:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

Esto es más importante de lo que parece: una celda puede contener 0.1 y mostrar "10%" al mismo tiempo, y solo NumberFormat controla la segunda parte.

Tarea

  1. Escribir un Sub que lea el Cliente y el Total del pedido ORD1003 en dos variables y los muestre en un MsgBox.
  2. Cambiar el Estado de ORD1002 a "Shipped" usando Cells(fila, columna) en lugar de Range.
  3. Aplicar NumberFormat = "$#,##0.00" a las columnas Unit Price y Total, y "0%" a la columna Discount %.
Pista
expand arrow

1. Lectura del Cliente y Total de ORD1003

  • Primero identifica en qué fila se encuentra ORD1003 — cuenta hacia abajo en la tabla a partir de los datos iniciales del Capítulo 3: ORD1001 está en la fila 2, así que ORD1003 está dos filas más abajo.
  • Cliente y Total son dos columnas diferentes — cuenta a lo largo de la fila de encabezados (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status) para encontrar la letra de cada una.
  • Declara una variable para el nombre del cliente (String) y otra para el total (Double), referencia la hoja explícitamente como se enseñó en el Capítulo 3 (ThisWorkbook.Worksheets("Orders")), y lee el .Value de cada celda en su variable correspondiente.
  • Une ambas variables en un solo mensaje con & antes de pasarlas a MsgBox — este patrón ya lo usaste en el Capítulo 2.

2. Cambiar el Estado de ORD1002 con Cells(fila, columna)

  • Cells(row, column) utiliza números simples, no letras — ya sabes en qué fila está ORD1002 según la tabla; para la columna, solo cuenta la posición en lugar de escribir una letra (Status es la última de las nueve columnas).
  • Es una asignación directa: .Cells(row, column).Value = "Shipped", no es necesario leer nada antes.

3. Aplicar NumberFormat a tres columnas

  • NumberFormat se establece de la misma manera para un rango que para una sola celda — solo tienes que aplicarlo a F2:F6, H2:H6 y G2:G6 (verifica qué letra corresponde a Unit Price, Total y Discount % respectivamente antes de escribirlas).
  • Cada columna tiene su propia línea, ya que Unit Price/Total necesitan formato de moneda y Discount % necesita formato de porcentaje — no intentes aplicar ambos formatos en una sola línea.
  • Referenciar el rango a través de la misma variable ws que ya configuraste mantiene las tres líneas cortas y consistentes.
Solución
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 1
some-alt