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
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
- Escribir un
Subque lea el Cliente y el Total del pedido ORD1003 en dos variables y los muestre en unMsgBox. - Cambiar el Estado de ORD1002 a "Shipped" usando Cells(fila, columna) en lugar de Range.
- Aplicar
NumberFormat = "$#,##0.00"a las columnas Unit Price y Total, y "0%" a la columna Discount %.
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.Valuede cada celda en su variable correspondiente. - Une ambas variables en un solo mensaje con
&antes de pasarlas aMsgBox— 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
NumberFormatse establece de la misma manera para un rango que para una sola celda — solo tienes que aplicarlo aF2:F6,H2:H6yG2: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
wsque ya configuraste mantiene las tres líneas cortas y consistentes.
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
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
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
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
- Escribir un
Subque lea el Cliente y el Total del pedido ORD1003 en dos variables y los muestre en unMsgBox. - Cambiar el Estado de ORD1002 a "Shipped" usando Cells(fila, columna) en lugar de Range.
- Aplicar
NumberFormat = "$#,##0.00"a las columnas Unit Price y Total, y "0%" a la columna Discount %.
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.Valuede cada celda en su variable correspondiente. - Une ambas variables en un solo mensaje con
&antes de pasarlas aMsgBox— 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
NumberFormatse establece de la misma manera para un rango que para una sola celda — solo tienes que aplicarlo aF2:F6,H2:H6yG2: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
wsque ya configuraste mantiene las tres líneas cortas y consistentes.
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
¡Gracias por tus comentarios!