Tutorial/Control de facturas multidivisa

Crea un control de facturas multidivisa en Excel

Descarga un libro de Excel para facturas en EUR, GBP, JPY e IDR, con tipos de cambio fechados, conversión a USD mediante fórmulas y trazabilidad.

ERexchangerate.dev·Actualizado el 8 sep 2026·8 min de lectura

El libro conserva cada importe en su moneda original y lo convierte a USD usando el dato fechado que eliges. Las facturas contabilizadas permanecen reproducibles porque la fecha, la fuente, data_updated_at y el tipo se guardan juntos.

Key points
Descarga el libro de facturas con datos fechados y fórmulas.
rate_per_usd son unidades de moneda por 1 USD.
Conserva fecha, fuente, sesión y data_updated_at de cada fila contabilizada.
Power Query añade snapshots nuevos sin sustituir los congelados.
Los tipos son indicativos y no constituyen asesoramiento fiscal o contable.

Descarga el libro

Descarga el libro de control de facturas y ábrelo en Excel. Incluye diez facturas ilustrativas, datos EUR/GBP/JPY/IDR, columnas USD y una bitácora. Sustituye los ejemplos por tus propios registros.

Entiende las cuatro hojas

Invoice Tracker contiene las facturas y fórmulas. FX Snapshots guarda una observación fechada por moneda. Audit Trail registra la decisión de congelar una fila. Read Me explica el flujo y sus límites.

Añade una factura en su moneda original

Escribe ID, cliente, fechas, moneda, neto, impuesto, fecha del tipo y estado en las celdas azules. Mantén Net, Tax y Gross en la moneda de la factura.

Añade el tipo de cambio fechado

Añade la observación histórica exacta que usaste. Guarda fecha, moneda, source, market_session, data_updated_at y tipo. El tipo significa unidades de la moneda de la factura por 1 USD. Usa un Snapshot ID único como EUR-20260602-v1. Valida exactamente una fila para ese ID y que la moneda del snapshot coincida con la factura. Si corriges una observación, añade v2; no sobrescribas v1. data_updated_at describe cuándo se actualizó el dato histórico; no lo sustituyas por effective_at.

Representative historical responsecopy
{
  "result": "success",
  "base": "USD",
  "date": "2026-06-02",
  "source": "ecb_daily",
  "sources": { "EUR": "ecb_daily" },
  "market_session": "open",
  "timestamp": "2026-09-08T11:52:18Z",
  "data_updated_at": "2026-06-02T00:00:00Z",
  "is_forward_filled": false,
  "rates": { "EUR": 0.85844 },
  "notice": "Indicative rates, not for settlement."
}

Revisa las columnas USD calculadas

El libro relaciona la fecha y moneda con FX Snapshots y divide cada importe por FX Rate / USD. Gross es Net + Tax; las columnas USD quedan vacías si falta el dato. Las fórmulas llegan hasta la fila 100 de facturas y la fila 100 de snapshots; amplía ambos rangos juntos. El estado Posted es una etiqueta y no bloquea celdas.

Excel formula · Net USDcopy
=IF(OR(F6<0,G6<0,H6<0,K6="",L6="Missing snapshot ID",L6="Duplicate snapshot ID",L6="Currency mismatch",L6="Invalid rate"),"",F6/K6)

Congela los valores contabilizados

Cuando contabilices una factura, conserva su fila de snapshot. Si la fuente cambia después, añade una nueva fila para una corrección y explica el motivo en Audit Trail.

Añade un dato nuevo con Power Query

El script de Power Query consulta una fecha y moneda explícitas. Carga el resultado como una fila nueva y no pongas una clave en un libro compartido. Power Query devuelve exactamente nueve columnas A:I. Carga primero una hoja de staging, copia solo la fila de datos sin encabezados y pégala como valores desde la fila 7. Refresh All vuelve a cargar la salida de la consulta: no añade automáticamente una fila inmutable. En Windows usa Data → Get Data → From Other Sources → Blank Query; en Microsoft 365 para Mac usa Data → Get Data → Launch Power Query Editor. Elige Anonymous; usa un proxy de servidor si necesitas una clave.

Power Query M · explicit snapshotcopy
let
    SnapshotDate = "2026-06-02",
    Currency = Text.Upper(Text.Trim("EUR")),
    Revision = "v1",
    SelectedDate = Date.FromText(SnapshotDate, [Format = "yyyy-MM-dd", Culture = "en-US"]),
    RelativePath = "v1/" & Date.ToText(SelectedDate, "yyyy-MM-dd") & "/USD",
    Endpoint = "https://api.exchangerate.dev/" & RelativePath & "?symbols=" & Currency,
    Payload = Json.Document(Web.Contents("https://api.exchangerate.dev", [
        RelativePath = RelativePath,
        Query = [symbols = Currency],
        Timeout = #duration(0, 0, 0, 10)
    ])),
    Source = if Payload[base] <> "USD" or Payload[date] <> SnapshotDate
        then error "Unexpected response base or date" else Payload,
    RawRate = Record.Field(Source[rates], Currency),
    Rate = if not Value.Is(RawRate, type number) or RawRate <= 0
        then error "Expected a positive numeric rate" else RawRate,
    SnapshotId = Currency & "-" & Text.Replace(SnapshotDate, "-", "") & "-" & Revision,
    Notes = "Response timestamp=" & Source[timestamp] & "; is_forward_filled=" &
        (if Source[is_forward_filled] then "true" else "false"),
    Snapshot = #table(
        {"Snapshot ID", "Snapshot Date", "Currency", "Source", "Market Session", "Data Updated At (UTC)", "Rate / USD", "API Endpoint", "Notes"},
        {{SnapshotId, SelectedDate, Currency, Record.Field(Source[sources], Currency), Source[market_session], Source[data_updated_at], Rate, Endpoint, Notes}}
    )
in
    Snapshot

Conserva la trazabilidad

Registra cuándo se contabilizó, qué snapshot se usó, su fuente/sesión y por qué está congelado. Conserva la respuesta original si tu proceso exige más evidencia. En Notes conserva el timestamp de la respuesta y is_forward_filled. Registra el Snapshot ID, la fuente, la sesión y el motivo de cualquier corrección.

Usa el resultado solo para informes

Es una herramienta ilustrativa para informes y análisis. No determina impuestos, contabilidad, cumplimiento, liquidación ni el importe que cobrará un proveedor de pagos. La capacidad de ejemplo termina en la fila 100; extiende las fórmulas y las búsquedas conjuntamente.

ER
exchangerate.dev
exchangerate.dev

Sigue leyendo

ReferenceAñade el tipo de cambio fechadoLeer TutorialAñade un dato nuevo con Power QueryLeer TutorialCómo obtener tipos de cambio en PythonLeer
Más ComparacionesFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
AprenderReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Tasas en VivoEUR/USDGBP/USDUSD/JPY