Ajuste de Estados Financieros Originales (Preservar Formato · Preservar Coherencia)
Condiciones de Activación
- El usuario envía estados financieros existentes (balance general, estado de resultados, flujo de efectivo, generalmente en formato .xls antiguo) y solicita "cambiar ciertos números a valores objetivo, ajustando otros datos automáticamente".
- Se especifica explícitamente "modificar sobre la tabla original" y "no alterar el formato/diseño/otras hojas".
- Involucra ajustes vinculados como utilidades retenidas, utilidad antes de impuestos, utilidad neta, etc.
Reglas Estrictas para el Usuario
- Nunca crear una nueva tabla desde cero sobre la original – se modifica sobre la original, el formato/diseño/otras hojas permanecen intactos.
- Solo modificar las celdas numéricas que necesitan cambiar, el resto no se toca.
- Después de la modificación, se debe garantizar la coherencia entre los tres estados:
Activo total = Pasivo total + Patrimonio netoUtilidades retenidas final − Utilidades retenidas inicial = Utilidad acumuladaUtilidad neta = Utilidad antes de impuestos − Impuesto a la renta
- Antes de entregar, se debe verificar el equilibrio mediante un programa, no a simple vista.
Selección Técnica (Según el Entorno)
Opción A: Excel COM (Windows + Office, 100% de fidelidad)
Adecuado para archivos .xls antiguos con celdas combinadas, bordes y fórmulas complejas:
import win32com.client, shutil
SRC, OUT = 'original.xls', 'version_ajustada.xls'
shutil.copy2(SRC, OUT) # No tocar el original
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
try:
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('Balance General')
ws.Cells(fila, col).Value = valor_objetivo # Solo modificar la celda objetivo
wb.Application.Calculate(); wb.Save(); wb.Close(True)
finally:
excel.Quit()
Opción B: openpyxl (Multiplataforma, .xlsx)
Buena preservación del formato, pero hay que tener cuidado con las fórmulas – openpyxl no lee los resultados calculados de las fórmulas (valores en caché). Si una celda tiene fórmula, hay que mantener la fórmula, no sobrescribirla:
import openpyxl
wb = openpyxl.load_workbook(OUT) # Nota: leer fórmulas con data_only=False
ws = wb['Balance General']
ws.cell(fila, col).value = valor_objetivo
wb.save(OUT)
Opción C: xlrd para Lectura + Opción A/B para Escritura
Para .xls antiguos, usar xlrd para escanear y localizar primero (solo lectura), luego realizar la modificación mediante COM o convertir a .xlsx para procesar.
Error Fatal: Escanear y Localizar Primero, No Adivinar Números de Fila/Columna
Los estados financieros antiguos suelen tener un diseño de doble columna (izquierda y derecha), donde la posición de las cuentas es contra-intuitiva:
- Balance general: Activos a la izquierda (columnas A
D), Pasivos + Patrimonio a la derecha (columnas EH). La etiqueta "Utilidades retenidas" está en la columna E (derecha), y los valores están en las columnas G/H – ¡no en C/D (izquierda)! - El uso de indexación 0 (xlrd) frente a indexación 1 (COM/openpyxl en la mayoría de las API) puede causar modificaciones en celdas incorrectas.
- Práctica correcta: Escanear primero por el nombre de la cuenta para localizar la fila, luego modificar la columna objetivo:
for r in range(1, 60):
etiqueta = str(ws.Cells(r, 1).Value or '') + str(ws.Cells(r, 5).Value or '')
if 'Utilidades retenidas' in etiqueta:
ws.Cells(r, 7).Value = objetivo_final # Columna G (derecha)
ws.Cells(r, 8).Value = objetivo_inicial # Columna H (derecha)
break
Lógica de Ajuste de Coherencia (Ejemplo: Ajuste de Utilidades Retenidas, Verificado)
Objetivo: Utilidades retenidas finales = X, Utilidades retenidas iniciales = Y.
Pasos de ajuste:
- Modificar las utilidades retenidas (columna derecha) al valor objetivo.
- Agregar un ajuste compensatorio del mismo monto en "Otras cuentas por cobrar" del lado de activos para mantener el equilibrio – si el patrimonio cambia pero los activos no, el pasivo se desequilibraría:
- Otras cuentas por cobrar final += (Nuevas utilidades retenidas finales − Utilidades retenidas finales originales)
- Otras cuentas por cobrar inicial += (Nuevas utilidades retenidas iniciales − Utilidades retenidas iniciales originales)
- Modificar el subtotal de activos corrientes y el total de activos (columna izquierda) al valor ajustado.
- Modificar el total de patrimonio y el total de pasivos + patrimonio (columna derecha) al valor ajustado.
- Estado de resultados: Ingresos operativos acumulados += (Utilidad acumulada objetivo − Utilidad acumulada original); Utilidad operativa / Utilidad antes de impuestos / Utilidad neta se actualizan de forma vinculada.
- El flujo de efectivo generalmente no se modifica (ajuste de ganancias/pérdidas sin entrada/salida real de efectivo).
⚠️ Las filas de total pueden no tener fórmula (valores numéricos fijos) – verificar .Formula. Si devuelve un número en lugar de =SUM(...), la fila de total debe modificarse manualmente al valor ajustado; cambiar los detalles no provocará una actualización automática.
Verificación (Obligatorio Antes de Entregar, Programática)
# Leer y verificar (usando el mismo motor de escritura)
assert abs(Activo_total − (Pasivo + Patrimonio)) < 0.01
assert abs(Utilidad_acumulada − (Utilidades_retenidas_final − Utilidades_retenidas_inicial)) < 0.01
assert abs(Utilidad_antes_impuestos_periodo − Objetivo) < 0.01
print('✓ Verificación de coherencia de los tres estados superada')
Autoevaluación de Calidad
- ¿Se modificó sobre la tabla original (no se recreó)? ¿El formato se mantiene igual?
- ¿Solo se cambiaron las celdas que necesitaban cambio?
- ¿La verificación programática de coherencia de los tres estados fue superada?
- ¿Hay una copia de seguridad del original?
Recordatorio de Cumplimiento
Si el estado financiero ajustado se va a utilizar para fines externos como préstamos, impuestos o auditorías, debe estar respaldado por comprobantes de ajuste reales. Su uso solo para fines de gestión interna no presenta problemas. Si se detecta que el usuario podría estar utilizando el estado ajustado para cometer fraude, se debe advertir sobre los riesgos de cumplimiento y negarse a ayudar en la falsificación.
🙋 Sobre el Autor
九品锦锂e | Convierto los errores que he cometido en skills "listos para usar", no escribo libros de texto. Este skill es la versión que uso yo mismo a diario.
WeChat: ly5419495 (Al agregar, menciona "SkillHub", te daré prioridad) Cuenta pública: 初五Agent (Busca en WeChat, allí publico análisis y métodos; también puedes leer sin agregarme a WeChat)
Otras herramientas que he hecho y que funcionan directamente están en esta estantería (copia y abre en el navegador): https://skillpay.alipay.com/public/jiupinjinlie
Si te atascas al usarlo, o tienes otros escenarios que quieras que convierta en skill, contáctame por cualquiera de los medios anteriores.
