Leitura e Escrita de Valores de Células
Deslize para mostrar o menu
A principal função do VBA é ler e escrever o Valor de uma célula:
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(row, column) faz a mesma coisa usando números em vez de letras — especialmente útil ao utilizar loops, pois a variável do loop é um número, não uma 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
Parecem intercambiáveis, mas não são:
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
Use .Value quando você deseja apenas o número. Use .Formula ao inserir uma fórmula em uma célula — por exemplo, para construir a coluna Total programaticamente em vez de digitá-la uma vez e copiá-la:
ws.Range("H2").Formula = "=E2*F2*(1-G2)"
NumberFormat
Controla como um valor é exibido sem alterar o número subjacente:
ws.Range("F2:F6").NumberFormat = "$#,##0.00" ' currency
ws.Range("G2:G6").NumberFormat = "0%" ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy" ' date
Isso é mais importante do que parece — uma célula pode conter 0.1 e exibir "10%" ao mesmo tempo, e apenas NumberFormat controla essa segunda parte.
Tarefa
- Escrever um
Subque leia o Cliente e o Total do Pedido ORD1003 em duas variáveis e os exiba em umMsgBox. - Alterar o Status do ORD1002 para "Shipped" usando Cells(linha, coluna) em vez de Range.
- Aplicar
NumberFormat = "$#,##0.00"às colunas Unit Price e Total, e "0%" à coluna Discount %.
1. Lendo o Cliente e o Total do ORD1003
- Primeiro, descubra em qual linha está o ORD1003 — conte para baixo na tabela a partir dos dados iniciais do Capítulo 3: ORD1001 está na linha 2, então ORD1003 está duas linhas abaixo.
- Cliente e Total estão em colunas diferentes — conte na linha do cabeçalho (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status) para encontrar a letra de cada uma.
- Declare uma variável para o nome do cliente (
String) e outra para o total (Double), referencie a planilha explicitamente conforme ensinado no Capítulo 3 (ThisWorkbook.Worksheets("Orders")), e leia o.Valuede cada célula para sua respectiva variável. - Una as duas variáveis em uma mensagem com
&antes de passá-las aoMsgBox— esse padrão já foi utilizado no Capítulo 2.
2. Alterando o Status do ORD1002 com Cells(linha, coluna)
Cells(row, column)utiliza números simples, não letras — você já sabe em qual linha está o ORD1002 pela tabela; para a coluna, apenas conte a posição em vez de digitar uma letra (Status é a última das nove colunas).- É uma atribuição direta:
.Cells(row, column).Value = "Shipped", não é necessário ler nada antes.
3. Aplicando NumberFormat em três colunas
NumberFormaté definido da mesma forma para um intervalo quanto para uma célula — basta aplicar emF2:F6,H2:H6eG2:G6(confira qual letra corresponde a Unit Price, Total e Discount % antes de digitar).- Cada coluna recebe uma linha própria, pois Unit Price/Total precisam de formatação de moeda e Discount % de formatação percentual — não tente aplicar ambos os formatos em uma linha só.
- Referenciar o intervalo usando a mesma variável
wsjá definida mantém todas as linhas curtas e 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
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo