Sei sulla pagina 1di 271

EXCEL MACROS

PARA EL SUPERCONTADOR

Alejandro Quiceno García


1
2
Excel Macros para el Súper Contador

3
4
Excel Macros para el Súper Contador

Volumen 1

Alejandro Quiceno García

Reconocido como MVP-Microsoft 2014-2015-2016

Alejandro Quiceno – Excel Audi


Excel Macros para el Súper Contador
© Alejandro Quiceno García

5
ISBN 978-958-46-7645-0, edición original publicada por Alejandro Quiceno García,
Cali, Colombia.

Marcas Comerciales:
• Excel se refiere a Microsoft Excel, la hoja de cálculo de la suite de aplicaciones
Microsoft Office, propiedad de Microsoft Corporation, el nombre se utiliza solo en
beneficio de la misma.

Editor e Impresor: Alejandro Quiceno García


Diseño de cubierta: Alejandro Quiceno García
Primera edición: Alejandro Quiceno García, Colombia, diciembre 2015

© 2015 Alejandro Quiceno García


Internet: http://alejandroquiceno.blogspot.com
Email: alejoquiceno@gmail.com
ISBN 978-958-46-7645-0

Derechos reservados
Esta obra es propiedad intelectual de su autor. Los derechos de publicación son
exclusivos de Alejandro Quiceno García. Prohibida la reproducción parcial o total por
cualquier medio, ya sea electrónico, fotográfico, mecánico, escáner, por fotocopia, por
registro u otros métodos sin el permiso previo y por escrito de Alejandro Quiceno García.
Cualquier reproducción parcial o total podrá ser decomisada por autoridad competente y
el infractor objeto de judicialización.

NOTA IMPORTANTE
Las indicaciones técnicas y programas (macros) incluidos, han sido elaborados con gran
cuidado por el autor y reproducidos bajo estrictas normas de control, sobre archivos
planos de ejemplo. Estos archivos planos y macros no necesariamente deben funcionar a
la perfección en archivos planos de la misma referencia. Son una guía para que el lector
arme sus propias macros.

Alejandro Quiceno García o su nombre comercial Excel Audi no será jurídicamente


responsable por: errores u omisiones; daños y perjuicios que se pudieran atribuir al uso
de la información comprendida en este libro o los archivos de ejemplo enviados, ni por la
utilización indebida que pudiera dársele, o por las consecuencias derivadas del uso de
las metodologías explicadas.

Es deber del usuario verificar si la información procesada es fiel a la realidad


económica, de acuerdo y como así lo ordena la normatividad vigente.

Impreso en Colombia – Printed in Colombia

6
7
8
Contenido

Contenido ........................................................................................................ 9
Ceder lo que se ha conseguido resulta peligroso ............................................. 11
Por favor no piratees ni hagas copias ilegales de un libro ............................... 13
Prologo .......................................................................................................... 17
Introducción................................................................................................... 21
La versión de Excel que maneja este libro ....................................................... 25
Los Macros de Excel ....................................................................................... 27
Como se hace una macro................................................................................ 27
Como se activa el grabador de macros ........................................................... 29
La herramienta Código ................................................................................... 33
Seguridad de Macros:............................................................................................ 33
Macros ................................................................................................................. 35
Visual Basic ........................................................................................................... 37
............................................................................................................................. 37
Grabar Macro ....................................................................................................... 41
Mis Primeras Macritos .......................................................................................... 43
Macro asociada a una imagen de botón para desplazamiento ..........................................43

Referencias relativas y absolutas ........................................................................... 59


Aterriza el poder de tu hoja de cálculo ...............................................................................61
Que es la celda activa? ........................................................................................................64

Macro que nos monta una función suma en hoja anexa ......................................... 65
Consideremos otro asuntito: ..............................................................................................71
La carpintería de los contadores que trabajan a pedal .......................................................75

Macro para depurar un archivo de terceros del sistema Helisa DOS ................ 77
Macro que ejecuta sobre un archivo externo. ....................................................................82
Macro que valida si el archivo abierto es el correcto .........................................................88
Macro que valida el nombre del archivo ............................................................................90
Macro que elimina la basurita de los encabezados ............................................................93
Con un recorrido tipo Do Until...........................................................................................94
Detectar si una celda cumple o no una condición ..............................................................98
Con un recorrido tipo For Next ........................................................................................113
Eliminar la basura con Filtros ............................................................................................115

Eliminar la basura con fórmulas y la herramienta Ordenar ................................... 125

9
Grabar una formula con una MACRO ............................................................................... 133
Macro de una fórmula que se copia a todo lo largo de un rango. Método 1................... 135
Macro de una fórmula que se copia a todo lo largo de un rango. Método 2................... 136
Eliminar la basura con la herramienta ordenar. ............................................................... 142
A veces lo viejo era más sencillo. ..................................................................................... 144

Macro que depura el balance de comprobación UFCG0141 del sistema CG1 8.5
.................................................................................................................... 151
Macro que depura el libro auxiliar del sistema helisa win.............................. 162
Macro que depura el libro auxiliar del sistema World Office .......................... 172
Macro que depura el libro auxiliar del sistema SIIGO .................................... 184
Bonos Extra: ................................................................................................. 188
Macro que organiza el listado auxiliar softland ....................................................189
Macro que organiza el listado auxiliar saint..........................................................199
Macro que depura el libro auxiliar Zeus ...............................................................209
Macro que depura el libro auxiliar del sistema CG v 8.5 UFCG1033 .......................219
Macro que depura el libro Inventario y Balances del software contable Activo
Megasistemas .....................................................................................................243
Apendice 1 ................................................................................................... 253
Destruye el romance que tienes con el ratón .................................................................. 253

Referencias bibliográficas ............................................................................. 267


Agradecimientos .......................................................................................... 269

10
Ceder lo que se ha conseguido resulta peligroso

Nadie entrega de buenas a primeras sus conocimientos, y menos


cuando ese bagaje intelectual le ha costado esfuerzos y dinero.
Acceder a información con la que puedes establecer la diferencia es un
tesoro intangible que bien administrado puede ser bastante lucrativo.
Automatizar los procesos contables es un sueño que puede ser hecho
realidad de la mano de este libro.
Si permite o facilita que le fotocopien el libro, el único perjudicado es
usted.

11
La persona que lo fotocopia, una vez obtenga lo que quería de usted,
se irá y –probablemente– aprenderá, será su competencia y en cuanto
le vaya bien no se acordará de usted y negará que lo que es fue gracias
a su ayuda o a su descuido.
Aprenda lo que aquí está y no lo deje a la vista, ni lo preste. Monte sus
reportes con macros de Excel, pero sea cuidadoso y reservado. Que tu
informe a la junta directiva sea fantástico. La gente se desencanta en
cuanto conoce los secretos del mago. Haga el esfuerzo de callar, por
muy feliz que se sienta de poder hacer tareas de varios días en tan solo
unos minutos.
Fue usted quien adquirió estos conocimientos. Usted es el elegido para
beneficiarse de este libro... ¡no lo desperdicie!
¡Muchos éxitos!,
Alejandro Quiceno García

12
Por favor no piratees ni hagas copias ilegales de un
libro

Todos sabemos que los profesores salvo contadas excepciones, no son un gremio
pudiente, ni de estrato social alto. En el negocio de los libros, la gran mayoría de autores
recibe alrededor de un 10% del valor que usted está pagando por el libro. ¿Cómo es
posible esto? La mayoría de las librerías distribuidoras se toma para ellas un 55% del valor.
Del restante 45% entran el editor y el impresor, también hay que descontar el costo del
libro que puede ser hasta de un 20% del valor que usted está pagando. Después de que
todos ellos toman lo suyo, al final les dan solo regalías a los autores. A algunos ni siquiera
eso les dan, se “hacen los locos” con ese tema y simplemente registran, y eso cuando lo
hacen, “Regalías por pagar-Derechos de autor”. Finalmente tenemos el caso de los
impresores piratas, que toman el libro y lo clonan, lo cual se constituye en un robo
frentero y descarado.

13
Se lo digo porque conozco el tema, alguna vez llevé la contabilidad de una Editorial.

En mi caso lo que he hecho y le recomiendo a todos los que escriben libros lo hagan, es
que directamente asuman la edición y la impresión del libro. Pueden vender el libro
directamente o por lo menos del valor, podrán acceder al 45% del valor de venta de la
librería: descontado el costo del libro, por lo menos el autor ya no será tan explotado por
los demás. Así que, cuando tú pirateas un libro en realidad y en última instancia destruyes
la iniciativa del autor. No le estás ayudando a continuar adelante, no incentivas que el
profesor se anime a desarrollar nuevos temas que seguro tiene en su mente. “si me va
bien, sigo con la siguiente idea”.

Por favor, no me piratees, no me fotocopies. Eso es bajo y desleal. Este libro es un libro de
bajo costo y comparado con lo que podrás hacer y dinero que podrás conseguir,
prácticamente es un regalo.

Si tú permites que se fotocopie este libro, estás participando de esa situación, de ese
concierto para destruir. Si haces el empeño de adquirirlo, de comprarlo al autor, con
mayor gusto saborearás y estudiarás lo que hay en él. Si por el contrario nada te cuesta,
no habrá esmero en estudiar detenidamente lo que aquí hay, quizás hasta nunca lo hagas,
o no aplicarás correctamente lo aprendido. El conocimiento aquí adquirido te dará
potencial de uso de recursos los cuales podrás monetizar hacia futuro. No seas
desagradecido con la vida, si tú lo eres y culpas de tu situación a los demás y pagas con la
misma moneda, no esperes que esta no sea así contigo, pues es la actitud la que determina
el futuro

14
15
16
Prologo
“A mí me llaman el negrito del batey
Porque el trabajo para mí es un enemigo
El trabajar yo se lo dejo todo al buey
Porque el trabajo lo hizo Dios como castigo”.

Las opiniones expresadas aquí son del autor, tenga en cuenta que
se escriben con el ánimo de reflexionar un poco.

Este coro de canción, muy popular entre la cultura latinoamericana,


escrita en 1954 por el compositor Medardo Guzmán, y cantada por
Alberto Beltrán.

Si desea puede verla en YouTube escribiendo esta ruta en su


navegador:

https://www.youtube.com/watch?v=EhDqFTUSfd8

Extraordinario ritmo y arreglo musical, una de las canciones insignes


del folclor latinoamericano, deliciosa de bailar con una pareja que se
mueva sabroso, como dice la misma canción.

Sin embargo, es grave que la canción defina y taladre el asunto de


que el trabajo es nuestro enemigo, además de bajarnos a nivel de
bestia al compararnos con el buey.

Estas letras musicales, debes tener mucho cuidado con ellas pues
van calando en tu subconsciente al punto de tener la capacidad de
poder programar la misma actitud con la que se encara la vida.

Hemos sido víctimas de los horrores de la esclavitud, y los prejuicios


raciales entre otros delitos de lesa humanidad.

Pero usted, no importa su color, raza o


religión, también le corre parte del creador
por sus venas, en su código ADN. Así que
usted también en parte tiene el poder
creador.

17
Jamás olvide eso. Aléjese de todo aquello que lo ralentiza, de todo
aquello que te sonsaque de lo que realmente es importante para ti.
¿Y cómo sabes que es lo que es realmente importante para ti? Todo
aquello que contribuya a tu prosperidad y a tu bienestar. Si sientes
que algo no está en consonancia con tu talento, déjalo.

No desperdicies los mejores años de tu vida luchando por la misión


y visión de otros. Los jefes se dan el lujo de saber, en el periodo de
prueba, si usted les sirve o no. De igual forma, usted en dos meses
se aprende un puesto, y se lleva ese capital intelectual, que puede
que no sea la gran cosa, -aunque ellos así lo crean-, pero con dos
meses, también es suficiente para saber y, por lo tanto, si no le gusta
la cosa, salte –de saltar- de allí y busca una mejor oportunidad.
Como quiera que sea, acumulaste puntos de experiencia, y eso es
total: No tiene precio.

18
Una vez un señor supongo que gerente de empresa, me dijo que las
macros era hacer apología a la pereza. Francamente me sorprendió
con esa declaración, pues según él, el empleado de oficina debe
estar atornillado a la silla “económica” –ergonómica- 12 horas, y cree
que esa es la justa retribución por el sueldo de hambre que debe de
pagar.

El tipo no ha caído en cuenta que en una organización lo que importa


son los indicadores casi que en tiempo real.

¡Que hubo! ¿Cómo vamos?


¿Cómo va el recaudo hoy? ¿Las ventas? ¿La
operación?

Mientras usted carpintea en Excel perdiendo tiempo en lugar de


agregar valor a la organización, destruyendo ese buen nombre que
la “academia” en su gran ego universal se llena supuestamente al
haberle dado a usted ese título universitario, usted lo socaba siendo
lento al procesar la información en la computadora, concretamente
usando las hojas de cálculo.

Pero la verdad es que pocos enseñan bien. Hasta antes de la internet,


a nadie le interesaba sacarlo a usted de la inmunda cognoscente.
Ahora todo mundo se desgañita haciendo videos en YouTube y
compartiendo información por toda la web.

Antes porque no sabías. Ahora el método es nuevo: Atiborrarte de


información para que tu cerebro colapse.

Eso también se ve en el tema de los libros de “macros” de Excel. Los


compras y con decepción ves que son libros que solo las ultimas
20 hojas hablan de macros, y es un “remojoncito”. Además, por lo
general son temas de macros para nada prácticos, que no tienen que
ver con lo que haces.
Estoy seguro que este libro te va a gustar. Por favor no permitas que
lo fotocopien, “si así no lo hiciereis que dios y la patria os lo
demanden”.

El profe que escribe este material no nació


en cuna de oro, si tú lo fotocopias y lo
entregas revendiéndolo o no, me asaltas.

19
Pero lo peor no es eso, lo peor es que
habrás cometido la brutalidad de que ese
otro si se ponga a estudiar en serio, y te
deje literalmente lejos profesionalmente.

No seas bobito y no caigas en ese error.

Cuida este libro cual tesoro, y no lo dejes


por ahí mal parqueado o “pagoso” como
dicen las masas o los estratos populares.

¡Muchos Éxitos!

Alejandro Quiceno García

20
Introducción

“Venid a mí todos los que estáis trabajados y cargados, y yo os haré descansar.


Llevad mi yugo sobre vosotros y aprended de mí, que soy manso y humilde de corazón, y
hallaréis descanso para vuestras almas, porque mi yugo es fácil y ligera mi carga”
Mateo 11 28-30

Este libro está hecho para los contadores que trabajan en empresas.
No tanto para los contadores que usan Excel para llevar
contabilidad.

El libro se enfoca en el tema de los archivos planos que se bajan de


los software contables, ya que en estos trabajos, los contadores
dedican mucho tiempo de sus vidas laborales y hasta propias.

Si este es su caso, este libro le será de mucha utilidad. Es necesario


que usted abra su mente y se despoje de afanes y premuras.

Si usted es de los que se llenan de impaciencia, si usted es de esos


que, al salir de su casa, caminar 50 pasos y por ejemplo, digamos
que se olvidó de echarse el desodorante, y siente que desandar el
camino de regreso hasta casa es perder, creo que va a tener
dificultades para poder seguir este libro.

21
Porque aprender las macros es un constante tropezar y focalizar, al
principio tienes que cuidar de esta plantita, esa “brizna” de pasto
“perenne como la hierba” dedicarle algo de tiempo hasta convertirla
en un recio árbol a prueba de fuego. Ese profesional eres tú.

Si tú no eres de esos, mejor ni sigas. El mundo no es para ti. Esa


época del “dinero ya,” “que hay pa´hacer”, “a quien hay que coger”
esas épocas, ya pasaron. El mundo ya no es de los “vivos” (en el
sentido de astuto, sagaz, estafador, timador, etc) El mundo es de los
que prueban “finura”, de los que sí saben, de los que, si son capaces
de dar soluciones rápidas, que, si son capaces de apoyar la toma de
decisiones, no de destruir ni ralentizar la misión, que no se quedan
en el bla bla blá, que no se quedaron en el “tesauro” el “isoformo”, el
“knowledge”.

Que no llegan a los clientes a tramarlos de corbata y un falso


“Expertise”. De esos profesionales de firma x estamos hasta la
coronilla, esos explotadores de jóvenes.

El único que lo certifica a usted es el señor resultados. Los


cartoncitos son buenos para abrir puertas y sobrevivir, pero
consolidarse en la excelencia, eso solo lo da el Señor Resultados.

Si no hay nada más detestable para los accionistas o dueños de


compañías es ver exceso de mano de obra operativa. Factor
prestacional, Lastre laboral. Así son las cosas.

22
No hay cuña que más apriete que la del mismo palo:

Con el respeto de mis amigos afrodescendientes, no hay esclavista


más duro que un afroamericano. De la misma manera, no hay
competencia más desleal que la que un contador le puede montar a
otro contador. Matándose entre sí, en su “escalada irreflexiva”.

Dice el Dr. Laurence J. Peter en su libro “El principio de Peter” en


agosto de 1970:

“Como individuos, tendemos a trepar hacia nuestros niveles


de incompetencia. Nos comportamos como si lo mejor fuese
trepar cada vez más hacia arriba, y el resultado lo tenemos a
nuestro alrededor: las trágicas victimas de su irreflexiva
escalada.
Vemos a los hombres en grupos, y a la mayoría de la raza
humana pugnando por alcanzar una mejor posición como
sobre un molino de ruedas de escalones irregulares,
escalando con uñas y dientes para aniquilar a la población
del mundo, escalando producción de fuerza y elementos,
mientras se contamina el ambiente y se perturba el equilibrio
ecológico que mantiene la vida.
Si el hombre quiere rescatarse a sí mismo de una futura
existencia intolerable debe, ante todo, ver a donde lo
conduce su insensata escalada. Debe examinar sus objetivos
y comprender que el verdadero progreso se logra
moviéndose hacia delante en busca de una mejor forma de
vida.
El hombre debe comprender que la calidad de la experiencia
es más importante que la adquisición de inútiles artefactos
y posesiones materiales. Debe dar de nuevo significación a
la vida y decidir si usará su inteligencia para la preservación
de la raza humana y el desarrollo de las características
humanísticas del hombre, o bien si seguirá utilizando su
potencial creador en la escalada hacia una súper-colosal
trampa mortal.”

Yo sé que lo que le voy a decir está mal, pero…


¡ Aquí vengo a dotarte de una ametralladora
Gatling moderna, para que dejes el reguero
de los cadáveres de colegas caídos que no
aguantaron tu competencia !

23
Respecto a los contadores, esa escalada irreflexiva los arrastrará
hacia su destrucción, porque en unas cuantas décadas, sino mucho
menos, esta profesión se la tomará la inteligencia artificial.
Así que, ve tomando posiciones y mira como diversificas en la
manera en que te ganas la vida. Por lo pronto, las macros te ayudarán
a liberar tiempo para que verdaderamente prepares desde ya, tu plan
de retiro, analices tu entorno y no termines mal, presa de las
consecuencias de los actos de otros.

Para ya eso de echarle la culpa a los demás y al presidente de turno.

Si tú estás mal, es por tu culpa.

Ponte a estudiar que lo único que te saca de la dificultad es la


educación.

24
La versión de Excel que maneja este
libro
Este libro se ha realizado en Excel 2016. Salvo remotas
excepciones la mayoría de las imágenes aplican para Excel 2013 y
aun Excel 2010. Excel 2007 ya no lo recomiendo, ya que el motor
de la tabla dinámica no permite anidar una buena cantidad de
etiquetas.

25
26
Los Macros de Excel

Se le dice macro en Excel a una instrucción o conjunto de


instrucciones que se pueden ejecutar de manera automática. Estas
instrucciones son las acciones que se realizan en una hoja de cálculo
de Excel. Estas acciones se pueden grabar usando la herramienta
grabador de macros de Excel.

Como se hace una macro

La manera más fácil es hacerla con el grabador de macros. El


grabador de macros es una herramienta que trae Excel, y que al igual
que una grabadora de sonido, te permite grabar todo lo que haces
en Excel. Una vez que finalizas la grabación dando “stop” o “detener”
puedes ejecutar todo lo que hiciste de manera muy rápida.

Sin embargo, el grabador de macros puede ser muy “literal”, de


manera que cuando se vuelva a ejecutar la macro esta puede fallar,
ya que podría cambiar la base sobre la cual ella está realizando los
cambios. Por ejemplo, usted todos los meses puede bajar un archivo
plano del software contable y quiere hacer un reporte. Así que todos
los meses dicho archivo cambia en tamaño. La macro debería
ejecutar sin problemas, pero el grabador de macros tiende a grabar
sin tener en cuenta que el tamaño del archivo cambia. Por tal razón
lo que hace el grabador de macros se debe revisar un poco, afinar y
poner a punto la macro grabada para que lleve a feliz término la
tarea.

Vale la pena dedicarle tiempo a crear una macro, ya que en adelante


ella hará el trabajo por ti en segundos.

27
28
Como se activa el grabador de
macros
Por la ficha desarrollador:

Si no tiene esta ficha o pestaña activa, va por la ficha archivo:

Opciones:

29
Personalizar cinta de opciones:

Activa la casilla de verificación DESARROLLADOR.


Hecho lo anterior, deberá ver la ficha “Desarrollador” como una
nueva opción disponible en su cinta de opciones:

30
Esta ficha trae varios grupos de comandos.

De derecha a izquierda, son los siguientes:


XML:

Controles:

Complementos:

31
Código:

Este será el grupo de comandos que trabajaremos, ya que para


nuestros propósitos es el más importante.

Ahora veamos para que sirve cada uno de los botones de la sección
Código.

32
La herramienta Código

Seguridad de Macros:
Este botoncito existe desde que los chicos inquietos se “agarraron”
a hacer procedimientos cuyo propósito dejó de ser laboral, y más
bien se volvió lúdico y traspasando los límites, procedimientos
incluso delictivos.

Anteriormente los archivos de Office no traían seguridad de macros,


el módulo de macros estaba ahí, formando parte de cualquier
documento, ya sea que tuviera o no macros, este componente
siempre formaba parte de los archivos. Si se fija en los viejos
archivos de Excel 2003, el mismo archivo en esa versión es más
pesado. Si se fija en los nuevos archivos, son más livianos, ya que,
si el libro solo es un XLSX, no hace falta que contenga el
componente Visual Basic, además de que la arquitectura de los
nuevos archivos ha sido reestructurada por completo,
evolucionando las viejas hojas de cálculo hacia diseños más
flexibles, livianos y modernos.

Cuenta la historia que el 26 de marzo de 1999 un chico llamado


“Kwyjibo” lanzó el virus “Melissa”, el cual se propagaba via email con
un asunto “Aquí está el documento por el cual está preguntando”.
La macrito vigilaba el reloj del incauto que habia descargado y
abierto el documento. Cuando la hora era la precisa, el virus se
disparaba, autoreenviandose via email con archivo adjunto y todo, a
toda la libreta de direcciones del incauto.
En adelante la gente de Microsoft lo que hizo fue colocar la opcion
de seguridad de macros para que el usuario elija bajo su cuenta y
riesgo si abre o nó el archivo que contiene macros.
Al hacer clic en “seguridad de macros”, llegas aquí:

33
Por lo general la configuracion de macros se deja como se indica en
la imagen. Que Excel me diga si el archivo tiene macros o no, y me
permita decidir si las dejo actuar o no. Ya es cosa mía si me pongo
de inquieto a bajar archivos de internet sin precaucion. Hasta que no
te dañan la computadora no se escarmienta.

Por otra parte, debo decir que ya no se ven virus hechos con macros,
ahora todos andan infectandote via Internet, pues es mas rápido y
directo. En cuanto aperturas paginas web, tu computadora carga una
cantidad de archivos que tu navegador ensambla como pagina web.
Muchas cosas de la pagina web quedan por debajo, como los
procedimientos JavaScript. Asi mismo, cargan mas procedimientos
que tu no te das cuenta, salvo que tengas un buen KIT de
herramientas Antimalware, antispyware, bloqueadores de ventanas
emergentes, de publicidad no deseada, etc. En el canal de videos de
YouTube hice uno referente a “Como navegar y mantener la
computadora limpia” te sugiero que le eches un vistazo.

34
Macros

35
Al hacer clic allí, (en macros) Excel te lista las macros disponibles:

36
Visual Basic

37
En el visual basic es en donde se Editan las macros. Es como un
bloc de notas en donde reposan todas las instrucciones de una
macro. Como le mencionaba mas atrás, una macro se puede hacer o
crear con el grabador de macros, tambien se puede escribir
directamente. Los programadores de antaño programaban asi,
escribiendo directamente el lenguaje de programación. Hoy en dia,
ya no es tan dificil, ya que tambien se ha creado software similar a
este, que les ayuda a hacer los procedimientos. Cada dia se facilita
mas la integración entre el usuario final y la computadora.

Al hacer clic en Visual Basic, y en el caso en el que no halla ningún


libro abierto, podriamos ver esta ventana asi, vacía.

38
En el gran cuadro gris es en donde, en cuanto hay una macro para
editar, hay una especie de Bloc de notas en donde se vé el lenguaje
que hablan las macros. No es un lenguaje dificil, ya que es
angloparlante y al ser de raiz latina como el español, muchas
palabritas se entienden, además de que en el “Cole” nos insisten
mucho con el idioma extranjero Inglés.

Mas adelante volveremos a ella, de hecho casi todo el libro nos la


pasaremos en ella.

39
40
Grabar Macro

Con este Botoncito es que, al igual que una grabadora de sonidos,


comenzamos a grabar todas las acciones que hacemos en Excel.
Voy a aprovechar el tema para enseñarles a hacer una macro
asociada a un botoncito, y alli “matamos dos pájaros de un tiro”.

41
42
Mis Primeras Macritos
Macro asociada a una imagen de botón para
desplazamiento
Esta es una manera de llevar a cabo este cometido.
En un libro nuevo, por defecto Excel nos trae algunas hojas. Esto se
puede configurar en la sección Opciones, que le sugiero “chismosee”
un poco.

Lo que haremos es un botoncito que nos permita movernos por las


hojas, así el archivo o libro de Excel quedará más elegante y más
“presentado”

El primer paso consiste en dibujar un botoncito con una de las


autoformas que trae Excel. Para eso nos vamos por la opción
Insertar – Formas:

Ali verás una gran cantidad de símbolos y figuras:

43
Seleccionas el rectángulo redondeado:

En cuanto hagas clic, verás un símbolo + sobre la superficie de las


celdas.

Fíjate lo que te dice Excel en la parte de abajo:

Entonces has eso: Clic y le das forma a la imagen del rectángulo


redondeado. Debería quedarte algo así:
Además, verás que aparecen dos nuevas pestañas de opciones en la
cinta de herramientas:

44
Todo un “Kit” para hacer unas formas con todos los efectos.
Le sugiero que explore que hace cada botoncito de “esos”.

Por nuestra parte haga clic en cuadro de texto:

Haga clic sobre el botón y escriba INICIO:

Puedes seleccionar la palabra que has escrito, y por la ficha inicio,


lea bien, puede cuadrarle el tamaño de letra, el tipo, centrarla, etc.

45
El botoncito lo arrastras a la esquina de la hoja de Excel, para dejarlo
como una especie de barra de herramientas:

Selecciona el botón y en las herramientas de dibujo, Formato,


selecciona uno de los formatos predefinidos para el botón. Puedes
escoger el color y algunos efectos como sombras y cosas así:

46
La palabra INICIO, si lo deseas puedes ir por la ficha INICIO y
escogerle otro color de letra.

Bien. Ahora vamos al asunto de la macro. Queremos que cada vez


que se haga clic, queremos llegar a la hoja 1, que será la hoja Inicio.
Entonces lo que hay que hacer es seleccionar la hoja 2, y “prender”
el grabador de macros. Es decir, hacer clic en Grabar macro

En cuanto se hace clic allí, sucederá que Excel te pide una


información adicional:

47
Nombre de la macro: Puede escoger un nombre tal como
“IrALaHoja1” Sin espacios. Para ayudarse a leer, puede usar una
mayúscula al inicio de cada palabra, de manera similar a como se ha
hecho aquí. No le permite meter un nombre compuesto con
espacios.

Tecla de método abreviado: Para evitar ir hasta la cinta Desarrollador,


Macros, puede usar una combinación de teclas con la cual se ejecuta
la macro. No lo recomiendo ya que la gran mayoría de short-cuts o
atajos de teclado, ya están escogidos.

Guardar Macro En: Si la macro es exclusiva del libro, déjela allí. Si


es estándar y necesita invocarla a cada momento en cualquier
archivo de Excel, colóquela en el libro de macros personal. El libro
de macros personal es una hojita de calculo que mantiene disponible
constantemente, así que le permite invocar las macros a todo
momento.

Descripción: puede escribir quien hizo la macro y para que sirve.


Al dar clic en aceptar, verá como el botón grabar macro ha cambiado
por este:

También lo puede ver en la parte de abajo:

48
Bien, entonces:

Hacer clic en la Hoja 1 para seleccionarla y DETENER la macro


oprimiendo el cuadrito. Seguidamente puede hacer clic en el Visual
Basic, aquí:

Clic en Visual Basic y llegará aquí:

49
Puede ver que el libro lo grabé temporalmente como “ejemplo nuevo
libro xlsx”, pues en ese momento, solo llevaba el botoncito dibujado.

¿Puede ver a la izquierda un pequeño explorador de los del estilo de


los viejos Windows, lo recuerda?

Te muestra la estructura, los objetos y los modulos que ahora tiene


dicho archivo que ahora lo llama VBAProject. Puede ver que tiene
tres hojas, la hoja oculta Thisworkbook y una carpetica MODULOS.
Si hace clic en el + de MODULOS, puede ver que se despliega un
modulito:

Haga clic en Módulo 1:

50
Puede ver a la derecha que ya aparece lo que comentamos que
íbamos a hacer, pero en lenguaje de macros, esto es en Visual Basic.

Esta es la MACRITO que le da el desplazamiento al botoncito que


dibujamos.

Solo hace falta, asignar la macrito al botoncito. Para hacer esto,


simplemente regrese a Excel haciendo clic por acá:

O por acá:

Selecciona con un clic izquierdo el botón.

51
Verá que queda con esas “bolitas”. Haga Clic derecho y mire el menú
emergente:

Haga clic en Asignar macro y selecciona la macro 1:

52
Clic en aceptar.

Listo! El botoncito ya quedó asociado a la macro.

Observaciones:

1) Las macros comienzan con las palabras clave SUB y finaliza con
End Sub. Así:

Si olvida el End Sub (Fin de la Subrutina), le botará error.

2) Si le llega cambiar el nombre a la Hoja 1, cambiando el nombre a


la etiqueta de la hoja, la macro se le daña, ya que específicamente
está buscando la hoja que se llama la hoja 1.

Puede cambiar la macro por este otro método de invocación, que en


este caso se refiere es a la primera hoja del libro:

53
Puede ver que todos los comentarios se anteceden con un
apostrofo y quedan de color verde. Bueno, no lo verá ya que el libro
está impreso en escala de grises, pero todo lo que está antecedido
por un apostrofo, el compilador lo pasa por alto porque sabe que
esos son comentarios para que el usuario tenga alguna referencia
sobre la instrucción que viene a continuación. O, para que “el usuario
no se pierda”.

En este caso, se ha cambiado el procedimiento por

Worksheets(1).Select

En este estilo de invocación, no pasa nada si le cambias el nombre


a la hoja 1 por “INICIO”. La macrito y por lo tanto el botón, sigue
funcionando.

3) Así como selecciona la hoja 1, con el grabador de macros también


puede seleccionar una celda, puede ser una celda de más abajo
o de más a la derecha, y así el menú le sirve de navegador.
En este caso el código grabado le quedaría así:

54
Puedes ver que el grabador de macros, sigue escogiendo el
procedimiento de llamar a las hojas por su nombre en lugar que
por la posición que ocupan. Seguidamente, puedes ver que
seleccioné la celda A23.

Este código puede simplificarse, ya que no hace falta que Excel


haga dos pasos para ejecutarlo.
Puedes escribir este código de una sola línea, que Excel lo sigue
reconociendo, y pues lógicamente lo hace más rápido:

Como puede ver, ya se puede animar a escribir por usted mismo


una pequeña macrito a mano! Así:

55
Sub Macro3HechaPorAlejo()
Worksheets(1).Range("A23").Select
End Sub

Otra manera de escribir esta instrucción es asi:

Sub Macro3HechaPorAlejoSegundaVersion()
Worksheets(1).Cells(23, 1).Select
End Sub

El procedimiento CELLS, Celda, puede ser a veces mejor que


Range (Rango). Ya que te permite seleccionar mediante sus
“Coordenadas” la posición de la celda a la que queremos llegar.
Primero se le indica cual fila, y luego Cual Columna.

Dado que ya sabes que el 23 es la fila seleccionada, no


necesitarías grabar otra macro para seleccionar la fila 120.
Simplemente es copiar y pegar la macro y cambiar el 120 por el
23.

4) El archivo debe guardarse como Libro de Excel habilitado para


MACROS. Al hacerlo asi, verá que el archivo cambia por la
extensión XLSM

5) Puede seguir creando botones seleccionando el que ya hizo con


clic derecho, darle Control+C y luego Control+V (Copiar y pegar)

56
Le cambia el color, lo reposiciona, igual la macrito la copia y le
dice que en lugar de ir a la Sheet1, cambia por Sheet2, o
Worksheet2, y al reasigna por Asignar Macro, le cambia el texto
por el nombre de la hoja a la que desea que vaya ese botón. De
ahí en adelante crear un menú o barrita de navegación, es
cuestión de COPY-PASTE y unas pequeñas Ediciones!

6) En lugar de un botón, puedes poner un corazón, o hasta una


imagen, una foto, etc! Se asigna la macro y listo!

57
58
Referencias relativas y absolutas

59
Este es un botoncito que hace que la macro se grabe según el
deseado, en dos sentidos diferentes.

Por ejemplo, usted cuando físicamente está de pié detenido al frente


de un edificio en el centro de la ciudad, usted puede decir –ejemplo-
que

De manera absoluta:
Se encuentra en la Avenida Libertad No 34.

De manera relativa:
Se encuentra a 149.600.000 km del sol, en la latitud y longitud
coordenadas 3°27′ 00″N 76°32′ 00″O.

Cabe apuntar que, de manera relativa, realmente NO TIENE PIERDE.

Pero para Excel, de manera absoluta tampoco lo tendría.

Veamos la misma situación, pero en Excel.

La célula de la hoja de cálculo es la celda. (Cell en inglés). Excel


contiene 1.048.576 filas, y maneja también 16.384 columnas. Asi
que, multiplique: tiene 17.179 Millones 869 mil 184 CELDAS:

60
Aterriza el poder de tu hoja de cálculo
Ahora, ya que estamos hablando de este tema, aquí hay una pequeña
abstracción que le sería muy útil realizar, para que “aterrice” el poder
que tiene usted en su hoja de cálculo Excel (desde Excel 2007
Excel incorporó las “Un millón cuarenta y ocho mil quinientos
setenta y seis filas”

Imagina o SUPÓN que cada fila o columna de estas es un centímetro:

¿De cuanta distancia estamos hablando?

Debemos correr la “,” 5 posiciones, y esto sería 10,48 kilómetros.


¿Se imagina? Usted ni siquiera se camina eso cuando sale a hacer
ejercicio. Así que imagina que la hoja de cálculo (en inglés
spreadsheet)

61
Si se imagina el rollito de papel que se le pone a la maquina
sumadora, esos viejos “artefactos” del siglo 20, ese rollito podían
ser unos 20 metros y a usted parecerle eso suficiente.

Pues con Excel tiene 10 kilometros y medio de “papel virtual” y


además, con un ancho de 163,84 metros. (16.384 centímetros
divido entre 100, un metro).

Observe que Excel es muy largo, pero no tan ancho. Tenga en cuenta
esto, para cuando organice su información en forma de base de
datos, “tirela” ordenada hacia abajo, -esto es, en forma de base de
datos- de manera vertical.

Ok. Retornemos al tema que nos atañe en este apartado.


De manera Absoluta, puedo ubicarme en la celda B6:

Si grabara una macro habiendo hecho esto, hubiera quedado

Range(“B6”).Select

Las celdas Excel por defecto las “mete” dentro del procedimiento
“Rango”, por aquello de que un rango se forma desde una posición
hasta contener varias posiciones o categorías. Asi que un rango
puede estar formado por una celda. En este caso la B6. Y dado que
realmente esa es la celda que seleccioné, pues eso mismo es lo que
ha puesto la grabadora de macro, que el Rango B6. Seleccionado
Solo que en inglés. Pero la cosa se entiende. ¿o no? Me extraña si
no.

De manera relativa, podemos decir que desde la celda A1. El vértice,


Angulo u origen de todas las celdas, la celda A1, nos encontramos
5 filas más abajo y una columna a la derecha.

62
Si escribiera esto con el grabador de macros encendido, y con el
botón de referencias relativas activado, se crearía esta instrucción:

ActiveCell.Offset(5, 1).Range("A1").Select

Que viene a ser:

Celda Activa(5,1).Rango A1 Seleccionado.

Puede ver que si la celda A1 es el vértice desde donde se mide la


distancia en la Grilla o malla de celdas de Excel, el ejemplo del sol
como vértice espacial para definir nuestra posición astronómica es
el más adecuado.

Sin embargo, la mayoría de las veces, grabamos la macro con


referencia absoluta, porque no hay que pensar tanto si decimos:

Range(“B6”).Select
En lugar de

ActiveCell.Offset(5, 1).Range("A1").Select

Pero bueno, ya verá que hay ocasiones en las cuales debemos


recurrir a referenciar el movimiento de una celda en la acción llevada
a cabo, con la instrucción ActiveCell.Offset, pues es frecuente que
el grabador de macros al ser tan literal en sus grabaciones, tal como
le contaba al inicio de este libro, “la embarre”. Así que, en esos
puntos en los que debemos movernos, -ejemplo- por lo general
desde la última fila pasarnos a la celda de al lado, necesitamos
decirle que se DESVÍE una celda a la derecha, en lugar de haber
definido de manera absoluta la celda, tendremos que corregir por
“Celda activa, desvíese solo una celda a la derecha, sin moverse de
la misma fila”

Que sería igual a escribir:

Activecell.offset(0,1).select

Esta instrucción Active Cell Offset es la que le permite a usted, que


su macrito, siempre vaya hasta la ultima fila y se pase a la celda de
la derecha, y si su archivo cambia de tamaño, pues con esta
instrucción, Excel entiende que usted baja hasta la ultima fila de su
“cuadro” o base de datos y que SE PASE a la celda de al lado, o de
la que esté un poquito mas allá, DESVIANDOSE, pero no señalando
de manera absoluta el siguiente punto, porque ¡Queda mal!

63
Que es la celda activa?
Dentro de los movimientos que hacemos en la hoja de cálculo, la
celda activa es la celda que está siendo seleccionada, o por donde
están pasando las acciones. La celda o rango “que se toca”, que lleva
la acción es la que se vuelve celda activa.

Es como si el balón de la acción pasara de celda a celda o a rangos


de celdas.

Con esto terminamos la explicación de las herramientas que se


encuentran en el grupo Código. Ahora veamos otro ejemplo para
introducirnos un poco más en el mundo de las macros.

64
Macro que nos monta una función

suma en hoja anexa

Esta segunda macrito nos servirá para introducirlos de una vez


en el tema de las variables.

Supongamos que tenemos esta listita en la hoja2:

Y en la hoja 1, queremos hacer la suma:

Al realizar el ejercicio de iniciar el grabador de macros, y realizar


la acción de montar la suma en la celda, sin amarrar el rango
como absoluto (esto es, sin oprimir F4 mientras se tiene el rango
seleccionado) obtenemos la función de manera Relativa, este
código:

OJO: No confundir grabar macro de manera relativa con las formulas


amarradas de manera relativa, absoluta o mixta.

65
Pero si grabamos la formula amarrando el rango –esto es de
manera absoluta): (observe los signos $ en letras y números de
columnas y filas respectivamente)

El código generado seria el siguiente:

Normalmente grabamos los rangos como absolutos. Además,


observe que son mucho más fáciles de leer.

R2C2:R4C2
Esto significa Row =R= Fila. Column = C = Columna
Fila 2 Columna 2 : Fila 4 Columna 2

Es decir:

¡El problema aquí, es que cuando la lista crezca con un personaje


más, tal como “Muchilanga”, esa macro no queda sirviendo para
nada!

66
Lo que se requiere es que la macro ajuste el rango de suma ella
sola.

¿Pero cómo se hace esto?

Primero, haciendo que Excel reconozca cual es la última fila de la


región activa o corriente de esa hoja. Que, en el primer caso,
Bernabé era el último por lo tanto la última fila era la numero 4.

Y en el segundo caso, pasó a ser la numero 5.

Para poder acceder a la última fila de manera rápida, es


conveniente hacerlo con un atajo de teclado. Veamos un poco
ese tema para poder continuar con la tarea.

Algunos Atajos de teclado de utilidad

Hay unos short-cuts o atajos de teclado que nos permite


movernos muy rápidamente en la región corriente de las hojas.

La región corriente es la zona de celdas que contiene la


información.

Por ejemplo, un atajo de teclado muy útil es la combinación de


teclas Control+Inicio. Te lleva directo a la celda A1.

La combinación de teclas Control+ cualquier flecha, te lleva en


un “santiamén” al final de la dirección marcada. Oprimir la tecla
FIN+Flecha hace el mismo efecto.

Estos atajos los encuentra publicados en cualquier cantidad de


páginas web que hablan de Excel. Republicarlos aquí me ocuparía
un espacio que sirve para mostrarle otras cosas.

Bien. Al decirte que hay que hacer que Excel reconozca cual es la
ultima fila, es lo mismo que grabar una macro con un nombre tal
como

67
Sub UltimaFila()

en donde nos ubicamos en la celda A1 y le damos FIN + Flecha


hacia abajo.
Algunos recomiendan que se haga la aproximación a la última fila
por abajo, por aquello de que podrían haber filas en blanco y eso
sería muy grave, ya que allí se detendría el cursor 1. Asi que la
macro que debe grabarse, para hacer que Excel reconozca la
última fila sigue los siguientes pasos:

1. Selecciona la última fila de Excel por la columna A, esto


es la fila A 1.48.576. Para poder grabar la macro, debe
ubicarse, antes de encender el grabador de macros “por
allí cerquita”, para que no le queden instrucciones basura:

Luego de estar allá abajo, allí al lado de la celda A


1.048.576, ahí si prende el grabador de macros y
selecciona esa celda.

2. Oprime Fin + Flecha arriba

Detiene la macro.

1
En informática un cursor es un indicador que se usa para mostrar la posición en un monitor o en
otros dispositivos de visualización que responderán a las pulsaciones en un dispositivo de entrada
de texto o a las acciones en un dispositivo apuntador. El cursor de ratón puede denominarse
puntero de ratón, debido a la forma de flecha de algunos sistemas.

68
Obtenemos algo así como esto:

Esta macro todavía toca “pulirla”, ya que por este solo hecho que
es hacer que Excel se estrelle con la última fila, Excel aún no sabe
que esa celda es la última.

Primero que todo, hay que simplificar el código. Como le mostré


anteriormente, podemos unir Selec con Selection y dejar una
sola sentencia, así:

Ahora viene la definición de la variable última fila (Row), que sería


así:

Observe que le decimos a Excel que la palabra ultima es igual a


la fila ROW que se encuentra cuando Excel BRINCA, SALTA o
Viene por abajo desde la Celda A 1.048.576

Observaciones:

1. En lugar de ultima, puede ser la letra “u”:

69
2. En lugar de Range, puede referirse a la última celda de
Excel, la A 1.048.576 usando Cells, asi:

Con alguna frecuencia, verá que Excel le despliega unas


ayudas para orientarse, por ejemplo, al escribir Cells, Excel
apoya sugiriendo el Indice de la Fila (Row Index) y el índice
de la Columna (Column Index)
Este método Cells es muy bueno.

Anécdota: En uno de los libros de Bill Jelen “Mister Excel”,


cuando recién salió Excel 2007, en su libro él nos enseñó
el comando para referirnos a la última fila para el caso en
que el documento que se abriera usara Excel 2003 u
Excel 2007. Como sabe, Excel 2003 trae apenas
65.536 filas, así que esta macro última fila, un Excel
2003 no sería capaz de procesarla y botará error.

Ya no tenemos Excel 2003, aunque a veces los software


contables cuando exportan los informes a Excel,
continúan haciéndolo en formatos viejos de Excel 97. Si
se abriera directamente un archivo RELIQUIA de esos, esta
macro fallaría. Entonces la cosa es decirle que tome la
última fila así:

70
Application Rows Count. Que cuente las filas de la
aplicación.

El master “Mister Excel” sabe mucho, es mi profesor


predilecto.

Consideremos otro asuntito:


Resulta que nosotros vamos montar esa macro DESDE la hoja1. En
esta macro no estamos referenciando para nada en que hoja
estamos trabajando.

Entonces la macro se grabaría desde la hoja1, seleccionamos la


hoja2, tocamos la última celda, y desde allí, saltamos con Fin flecha
arriba para estrellarnos con la última fila de la hoja2.

Esto causaría nuevamente este código algo BURDO:

Ok. Y una vez en la hoja 2, tendríamos que regresar a la hoja1, celda


G8 para montar allí la formula suma.

La macro depurada en principio puede quedar así.

Observe que unimos después del hoja2 con un punto la siguiente


sentencia.

Ahora, conocida la última fila, necesitamos editar la macro que


monta la suma en G8, esta:

71
Esa última parte que dice R4 C2 (Fila 4 Columna 2)
Hay que decirle que en lugar de R4, va R-ultima, o R-“u”.
Esto se escribe así:

Observe que esta parte:

R4C2

Quedo asi:

R" & u & "C2

El 4 quedó reemplazado por el

" & u & "


Pero esta macro puede generar problemas. Asi que seria mejor
definir la variable U así:

72
Mejorada quedaría así:

Y podemos afinarla aún más diciéndole que el rango G 8 vá en la


primera hoja de trabajo:

En esta instrucción Excel no hace ninguna selección de celda.

Aquí hemos visto de manera tangencial el asunto de la jerarquía de


los objetos de Excel.

Sin saberlo, ya estás trabajando sobre los objetos de Excel.

Un poco de teoría sobre la jerarquía de los objetos de Excel

La jerarquía más grande es el objeto aplicación. Es decir, el Excel


como tal. Algo así como el conjunto universal Excel.

Excel está formado por los objetos libros de trabajo, en inglés


“Workbooks”.

Así que podríamos unir la jerarquía máxima, el objeto Excel, esto


es, la aplicación Excel con el objeto siguiente, un libro de trabajo
digamos… el libro1.xlsx. Usando un punto como concatenador: (el
punto que está después de application)

Application.Workbooks(“Libro1.xlsx”)

73
Ahora, un libro está formado por hojas de trabajo (Worksheets). De
la misma manera la podemos unir con un punto:

Application.Workbooks(“Libro1.xlsx”).Worksheets(1)

Las hojas están llenas de celdas. Podemos señalar la celda A1 de


la primera hoja, del libro llamado Book1.xlsx usando el objeto
RANGE:

Application.Workbooks(“Libro1.xlsx”). _
Worksheets(1).Range(“A1”).Value

Cuando nos referimos a una celda usando toda la “ruta” se dice


que se referenció completamente. Usted le puede decir a Excel
exactamente cual rango quiere, en que hoja, en que libro y no dejarle
opción al error.

Por lo demás, el hecho de que la extensión del libro sea un punto,


solo es coincidencia. El punto del nombre de un archivo no tiene
nada que ver con el concatenador punto que usamos para unir la
jerarquía de objetos de Excel.

No obstante, todo lo anterior puede ser algo redundante. Resulta


que el objeto aplicación, no hace falta mencionarlo, ya que se
sobrentiende que es Excel, pues es obvio que Excel como tal se
está ejecutando en la computadora. Asi que ese objeto no sería,
salvo algunas macros que invocan aplicaciones, mencionarlo en
algunos procedimientos. De tal manera que la expresión full que
realizamos hace un momento, podríamos dejarla asi:

Workbooks(“Libro1.xlsx”).Worksheets(1).Range(“A1”).Value

Lo otro es que, si estamos seguros de que estamos trabajando en


el libro Book1, pues tampoco haría falta indicarlo, con lo que la
instrucción nos quedaría asi:

Worksheets(1).Range(“A1”).Value

Por último, si usted está seguro que la primera hoja es la hoja


corriente, la hoja activa en la cual ejecuta las operaciones,
pues no haría falta tampoco mencionarla… con lo que la
instrucción quedaría aún más resumida, así:

Range(“A1”).Value

74
Contrario a lo que la gente pudiera pensar, no existe el objeto
CELDA.

La Celda es simplemente un objeto de tipo Rango que


consiste en un elemento.

Es bueno simplificar el código, pero tener cuidado de no


seleccionar un rango en una hoja que no es. Es por eso que
la referenciación completa o casi completa es la mejor
manera de definir las referencias.

La carpintería de los contadores que trabajan a


pedal

Con lo que hemos visto hasta el momento, ya podríamos


realizar macros muy útiles para las áreas contables. Y una de
las tareas que más consumen a los contadores, por toda
parte y por todo lado es la carpintería excesiva que realizan
cuando tratan de elaborar un reporte. Como saben el área
contable es fuente generadora de información para usuarios
internos y externos, así que el contador es el profesional que
prácticamente, se la pasa atendiendo requerimientos.

Por si fuera poco, a veces le piden de manera anti ética, que


genere un balance con un escenario para el banco, y otro
balance con otro resultado para otros entes de control.
¡Inaudito!

Vamos a ver un pequeño ejercicio de como depurar un


pequeño archivo de terceros.

75
76
Macro para depurar un archivo de
terceros del sistema Helisa DOS

Cuando un contador presta sus asesorías, está sujeto a trabajar con


el software contable que ya viene usando el cliente. Así, no es de
extrañar que encuentre casos en los cuales el software contable es
de la “época” del D.O.S. Para mis queridos lectores jóvenes, el D.O.S,
es el sistema operativo que existía antes de Windows, el D.O.S.
Acrónimo de “Disk Operating System”, El D.O.S. con el que Bill Gates
se dio a conocer, cuando agarró el negocio de preinstalar el D.O.S. a
todas las computadoras de IBM.

Es un escenario bastante terrible, pues como contador cabe esperar


que con software tal, no dispongas de muchas herramientas de
ayuda.

La cosa era así: el contador generaba el listado pero en lugar de


mandarlo o enviarlo a la impresora, lo enviaba a la opción disco.

El sistema lo enviaba a una carpetica del sistema, llamada a veces


PRT, iniciales de Printer, impresora. Asi que de allá había que
recuperarlo y traerlo a una carpeta de “Mis documentos”. Con el
explorador de Windows, podemos visualizar el archivo como lo
vemos en la imagen con la cual iniciamos este tema.

Seguidamente abrimos Excel. Archivo – Abrir - Examinar, y en la


parte que dice “Todos los archivos de Excel”, debes hacer clic en la
pestañita y seleccionar TODOS LOS ARCHIVOS, como te muestro
en la imagen a continuación:

77
La hacer clic allí, podrás ver los archivos que normalmente Excel no
te mostraría, ya que como es obvio, el explorador de Excel muestra
en principio, los tipos de archivos de Excel.

78
Aquí podemos ver un ejemplo de 3 archivos planos generados con
el viejo sistema Helisa DOS, Un libro auxiliar, un balance y un
directorio de terceros. Selecciona el directorio de terceros y a
continuación Excel traerá el asistente para importar archivos de
texto, una herramienta que también podemos ver en la cinta de
opciones cuando escogemos el menú Datos – Texto a Columnas.

Nos vamos por la opción “Delimitados”

79
DESACTIVAS las casillas de los separadores, es decir, NO
escogemos ningún separador.
Clic en siguiente.
En este paso, marcas todo como si fuera TEXTO:

Clic en finalizar:
Verás algo así como esto:

80
Este archivo, así como está, no nos sirve para trabajar. Seguramente
usted que conoce Excel y algunas metodologías de utilidad, me dirá,
¿Por qué el profe no se fue por la opción fijar ancho y colocar las
rayitas para separar los campos?

Por lo siguiente:

Cuando justificas la columna A, puedes ver que todo quedó


empaquetado en una sola columna. Fíjate que la sección del cuerpo
del reporte que contiene la información más relevante,
prácticamente es separar las columnas y listo. Pero, ¿y qué hay de
esas 5 líneas que están al comienzo de cada página?

¿Cómo las “peluqueamos” “de una”?

81
Esa es la macro que haremos a continuación. Una macro que me
organice este listado y me lo deje como una base de datos que a su
vez me permita explotar las herramientas de Excel. Al ser un archivo
viejito y fácil, nos adentraremos un poco más en las maneras
BASICAS, usando los temas vistos con la ayuda de funciones
lógicas y funciones de texto. Así iremos avanzando poco a poco.

La primera macro que haremos es la que me permita desde Excel,


dar clic en un botón, poder seleccionar el archivo y que verifique si
es el archivo directorio de terceros. Podemos ver que en la celda A3,
está el texto “directorio de terceros”, y en todos los archivos
generados aparece así que podemos hacer que, la macro evalúe si
es el archivo correcto.

Si nosotros tenemos el archivo plano “SMC Directorio Terceros


2011 HELISA” en el escritorio, abrimos Excel un libro cualquiera, le
damos grabar macro, y hacemos lo que hicimos hace un momento,
Excel nos generaría un código muy similar a este:

Tal como está, esta macro siempre funcionaría. Sin embargo. . .

Macro que ejecuta sobre un archivo externo.


. . . Lo ideal sería que la misma macro nos pida que
abramos el archivo nosotros mismos, y una vez abierto,
que ella haga unas validaciones y que, de allí en adelante,
la macro haga toda la conversión.

Por otra parte, es muy importante lograr que la macro


haga las operaciones NO EN EL ARCHIVO ORIGINAL, lo
ideal es que la macro solo abra el archivo, haga una copia
y deje el archivo original intacto; además, que haga las
operaciones en la copia grabada, y que la misma macro
NO QUEDE dentro del libro arreglado.

82
Para la primera parte, un ejemplo de dicha macro sería esta:

Dado que la imagen se ve muy pequeña, debido a que la instrucción


es de líneas muy largas, necesitamos hacerla más angosta.

Afortunadamente Excel nos permite hacer esto, y es colocando un


guion tipo barra al piso, así:

Para poder hacer las líneas más cortas, la clave está en usar el
concatenador ampersand, & seguido de una barra al piso y como
diríamos los jurásicos, un retorno de carro.

Bien, Ahora analicemos un poco que es lo que hace esta instrucción.

Para poder hacer que la macro ejecute sobre un archivo externo,


debemos definir como variable, que la macro se encuentra en el
archivo maestro.

A esto es que se refiere la primera sentencia:

Archivo_Maestro = ActiveWorkbook.Name

83
El usuario es el que da la palabra clave “Archivo Maestro”. En su
lugar podría colocar “Archivo Padre”. Lo que queramos. Esa cadena
de texto, es igual al objeto ActiveWorkbook.Name. Bien.

Ahora nos valemos de pequeños fragmentos de código que nos


permiten por ejemplo abrir un archivo o darle guardar como, etc.

Application.GetOpenFilename _
("Directorio Terceros (*.txt),*.txt", , "Abra el directorio" & _
" de terceros", , False)

Esta instrucción es la que nos permite abrir un archivo. Y lo que


hacemos es darle un nombre clave a ese archivo que abramos, por
eso lo antecede la palabra Archivo_PRT, una palabra definida en este
caso por mí, ya que es el archivo que iba para la PRinTer (Impresora)

Entonces, hasta este momento, ya definimos que el archivo maestro,


es el archivo Excel que contiene las macros “Maestras”, y que el
Archivo PRT, será el archivo que abramos. Si quisiera abrir un archivo
Excel, pues cambiaría la extensión .txt por .xlsx, y le editaría
“Directorio de terceros” y el “Abra el directorio”.

PROBAD, hijitos mios, VERIFICAD, Buscad, y hallareis!

Todo va bien, pero podría ocurrir que el archivo plano que he llamado
PRT, decidiéramos no abrirlo, y más bien cancelar la operación. Esta
es la instrucción que sigue:

Si resulta que no hay archivo PRT, es decir = Falso, Entonces, (en


inglés Then) montar este mensaje: “No ha abierto ningún archivo, por
lo tanto no se ha realizado el proceso.

84
Se colocan los avisos vbCritical y “Proceso incompleto”. Lo que está
en español se puede editar y cambiar por otra palabra si lo desea.
Cerramos los archivos sin guardar cambios

Else puede traducirse como “Si no…” Es decir, si el archivo PRT es


verdadero, es decir, se seleccionó, entonces es cambiar las alertas a
FALSO (para evitar mensajes de alerta de Excel) y a continuación,
viene la acción de abrir el archivo:

Workbooks.Open Filename:=Archivo_PRT

Y además, observe que el nombre del archivo que se abre, (Filename)


lo designamos como Archivo PRT.

Con estas instrucciones logramos que la macro haga las


operaciones en el archivo que abrimos, pero aún sigue siendo el
archivo original. Necesitamos abrir el archivo y darle un GUARDAR
COMO.

85
86
En la primera instrucción, hacemos que el Archivo PRT sea el archivo
que se abre, asi:

Archivo_PRT = ActiveWorkbook.Name

Luego procedemos a darle un “guardar como” al archivo plano, el


archivo se guarda como un archivo Excel, y ese archivo le montamos
el nombre “Archivo Final”.

Nuevamente se colocan los avisos vbCritical y “Proceso


incompleto”. Lo que está en español se puede editar y cambiar por
otra palabra si lo desea. Cerramos los archivos sin guardar cambios.

De esta manera, el archivo plano original queda intacto, y las macros


quedan en el archivo maestro.

La macro que nos hace el trabajito queda asi:

Sub MacroMejorada()
Archivo_Maestro = ActiveWorkbook.Name
Archivo_PRT = Application.GetOpenFilename _
("Directorio Terceros (*.txt),*.txt", , "Abra el directorio" & _
" de terceros", , False)
If Archivo_PRT = False Then
mensaje = MsgBox("No ha abierto ningún archivo." & _
" Por lo tanto no se ha realizado el proceso.", _
vbCritical, "Proceso Incompleto")
Workbooks(Archivo_Maestro).Close SaveChanges:=False
Exit Sub
Else
Application.DisplayAlerts = False
Workbooks.Open Filename:=Archivo_PRT
End If

Archivo_PRT = ActiveWorkbook.Name
Archivo_FINAL = Application.GetSaveAsFilename(fileFilter:= _
"Archivo De Microsoft Excel (*.xlsx), *.xlsx")
If Archivo_FINAL = False Then
mensaje = MsgBox("No ha guardado el archivo de excel " & _
"que contendrá la base de datos. " & _
"Por lo tanto no se ha realizado el proceso.", _
vbCritical, "Proceso Incompleto")

Workbooks(Archivo_PRT).Close SaveChanges:=False

Workbooks(Archivo_Maestro).Close SaveChanges:=False

Exit Sub
Else
Set NuevoArchivo = ActiveWorkbook

87
NuevoArchivo.SaveAs Filename:=Archivo_FINAL, _
FileFormat:=xlOpenXMLWorkbook, Password:="", _
WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False

Archivo_FINAL = ActiveWorkbook.Name
End If
End Sub

Esta macro que acabamos de ver le será de mucha utilidad, muchos


contadores me preguntan que como hacen para hacer que la macro
no quede, es decir que no se vaya en el archivo producido, pues por
lo general el trabajo realizado es para enviarse por email o cosas así.

Macro que valida si el archivo abierto es el correcto


Habíamos comentado que además de realizado lo anterior, sería
deseable que la macro valide si estamos abriendo el archivo correcto.

Ya que a veces estamos tan “bombardeados” de información y abrir


por error un archivo plano que no era. Entonces sería bueno, que la
macro revise algo en el archivo o algo en la información contenida
dentro del archivo y que, si no corresponde con lo esperado, pues
que se cierre con un mensaje de alerta.

En este caso podemos observar que el nombre del archivo se llama


“SMC Directorio Terceros 2011 HELISA”. Si estuviéramos seguros
que este nombre ha sido definido por el software, podríamos validar
el nombre del archivo. Sin embargo, como parece que no lo es,
tendremos que fijarnos en algo del contenido del mismo.

La solución parece estar en la tercera línea del archivo:

88
Observe el nombre:

Directorio de terceros. Este nombre, en esta celda A3, si lo podemos


validar, y parece que siempre es fijo.

Bien. Si ese es el caso, la cosa se hace así:

El procedimiento TRIM, que dentro de las funciones en español el


Excel nos lo presenta como la función Espacios( ) –ojo esto no es
una función, es para mostrarles lo que hace trim- hace lo mismo que
la función: Remover todos los espacios de una cadena de texto.

Así que lo que hacemos es montar un procedimiento de esos que


“Si tal cosa, esto, sino, esto otro”. Que el contenido de la celda es
“diferente” se denota con la combinación de signos menor que,
unido a mayor que. Aquí lo que hemos programado es que si el
archivo en esa celda A3, llega a ser diferente a la palabra “Directorio
de terceros”, avise con el MsgBox (Cajita de mensajes) que:

Y, si eso llegara a ser así, entonces que cierre el archivo sin guardar
cambios. Y eso se escribe así:

Además de cerrarse el archivo, que se cierre la macro maestra con el


Exit Sub.

En caso de que todo esté en orden, el Si condicional salta (de saltar)


hasta el End If, y la macro seguiría su proceso.

89
Macro que valida el nombre del archivo
Bien, estoy seguro que usted desea saber cómo hacer que la macro
revise el nombre del archivo como tal.

Para esto lo que hacemos es evaluar el nombre del archivo, si el


nombre de este archivo siempre fuera fijo, que es generado por el
mismo sistema y por lo tanto nunca cambia, la instrucción debe
montarse justo antes de que el archivo se proceda a abrir:

Sería algo así como esto:

90
91
Nuevamente nos apoyamos del procedimiento MID, que es análogo
a la función de Excel Extraer. Le hemos dicho a Excel que el archivo
plano lo llame Archivo PRT, ¿verdad?
Bien, entonces ese Archivo PRT lo sometemos a prueba con el
procedimiento MID, que lo que hace es Extraer la porción del
nombre del archivo sin su extensión. Sabemos que todos los
archivos terminan con un punto y por lo general, 3 letras de la
extensión del archivo. En este caso, el .txt son 4 caracteres, que
sumados a la cantidad de caracteres del nombre serian 39:

Para saber la cantidad de letras que tiene el nombre de un archivo,


copiamos el nombre del archivo en una celda y nos valemos de la
función Largo( ). En inglés LEN.

Entonces tenemos un total de 35 letras mas las 4 letras de la


extensión 39. Pero como la función largo se ubica en la siguiente
posición, la 40, entonces la prueba lógica no nos daría, ya que está
tomando un carácter de mas, el punto. Para solucionarlo,
simplemente le quitamos un carácter y listo.

Mid(Archivo_PRT, Len(Archivo_PRT) - 38, 35)

Tambien podrías validar la cantidad de caracteres (en lugar de su


contenido) del nombre del archivo con extensión y todo, seria
cambiar la prueba lógica por esta:

If Len(Archivo_PRT) < 39 Then

Obviamente las expresiones en español que van entre las comillas


se pueden cambiar.

Ok. Salvado lo anterior, ahora si procedemos a depurar el archivo.


Por fin!

92
Macro que elimina la basurita de los encabezados
Ahora sí, realizados los procedimientos para hacer que la macro que
hace el trabajo no se quede en el archivo final, que se hagan los
cambios en un nuevo archivo, y que por seguridad se valide que es
el archivo correcto, podemos proceder a la limpieza del listado. No
sobra indicar que las macros vistas anteriormente, son
procedimientos casi que universales. La primera vez que los hicimos
teníamos Windows XP y Excel 97 – 2003.

Bien. Recordemos como queda el archivo una vez que se abre:

Hay varias maneras de eliminar esas primeras filas, vamos a ver


algunas de ellas, y al hacerlo, lo voy introduciendo en algunos
procedimientos de utilidad.

93
Con un recorrido tipo Do Until

Esta quizás fue la primer macrito que logré hacer, hace muchos años,
leyendo uno de tantos libros de Macros básicas que andaban por
ahí. Fue mucha mi alegría cuando vi que la celda se deslizó a lo largo
de toda la columna toda velocidad, fue en menos de un segundo
hasta el final y había realizado el trabajo de una manera fantástica,
y era algo muy parecido a lo que necesitamos aquí. Eliminar unos
encabezados de listado que se repiten hacia todo lo largo, cuando
comienza una nueva página.

¡Resulta que este es uno de los grandes males de las áreas contables
y administrativas, y he visto que ponen a un auxiliar de oficina, para
que se siente a eliminar o a arreglar celda por celda!

En este caso, lo que debemos hacer es VER. Recorrer el listado con


despacio. Si el problema son los encabezados, tenemos que ver si
todos ellos son iguales los unos a los otros, o qué tienen en común
esas líneas, que las diferencia de las líneas que nos interesan.

94
¿Y cuáles son las líneas o filas que nos interesan?

Las filas transaccionales, o las que contienen la información


relevante.

Un breve recorrido revela lo siguiente:

Final del archivo:

Entonces. Necesitamos una macro que “vuele” las primeras 5 filas


de la hoja 1. Y en adelante, que revise celda por celda y la que sea
igual a:

95
1) EMPRESA HELISA BOGOTA
2) Nombre del Informe (Fechas Limite)
3) Que comience con la palabra “página”
4) Que comience con la palabra “NOMBRE DEL TERCERO”
5) Que comience con la palabra “Este informe”

La primera macro, la que nos vuela las primeras 5 filas, la podemos


hacer con el grabador de macros. Ojo. Ubique el cursor en la celda
B1:

Luego prenda el grabador de macros, hace clic en la celda A1 hasta


la A5, clic derecho y le da eliminar toda la fila. Luego detiene la
macro. Eso causará el siguiente código:

Les comentaba que ese Select se puede unir con Selection, y en


lugar de dos instrucciones, nos podemos quedar con una sola.
Marque la zona indicada asi:

Y dele clic en el teclado a SUPRIMIR, Borrar o DELETE.

96
El programita te queda así:

Perfecto.

En adelante eso no lo volverás a hacer a mano. Una vez eliminadas


las filas basura, la cosa nos queda así:

Ahora necesitamos decirle a Excel que las celdas que comienzan o


contienen uno de los 5 enunciados las elimine, con la sentencia
“Entire Row Delete” que significa:
“Fila entera Suprimir”

Por supuesto esa macrito le puedes cambiar el nombre, en este caso


le he puesto “PeluqueaEncabezado” todo unido.

97
Detectar si una celda cumple o no una condición

En primer lugar, tenemos que saber cómo escribir esa evaluación,


que, si la celda comienza por una de las palabras indicadas más
arriba, la borre. Ya sabemos que borrar se escribe EntireRow.Delete.

En la macro de la validación del nombre lo vimos, vimos unas


funciones de texto que pueden evaluar el contenido de la celda. Hay
que hacer una sentencia parecida, quedaría así:

98
Left es la análoga de la función Izquierda, y Trim, la análoga de la
función Espacios, que le quita todos los espacios en blanco a la
celda. Como la palabra Empresa tiene 7 letras, y la cadena de texto
completa dice:

“ EMPRESA HELISA BOGOTA”

Se hace necesario quitar los espacios en blanco, y después extraer


las 7 primeras letras de la izquierda. Al hacer eso, se evalúa si el
resultado es igual a “EMPRESA”. Si lo es, se procede a eliminar la
fila entera.

Detectar las filas que comienzan con la palabra “Nombre del


informe”, y página es muy similar, la instrucción queda así:

99
Ok. Ahora vamos a unir todas las instrucciones en una sola, usando
la instrucción O:

Las funciones Mid (para extraer algo de la mitad), Left (algo de la


izquierda) y Rigth (algo de la derecha) son muy útiles para evaluar
los contenidos de texto de una celda, y así tomar la decisión y por
lo tanto la acción.

Ahora necesitamos meter esta prueba lógica en un recorrido celda


por celda. El recorrido celda por celda por lo general se realiza con
el famoso Do – Until: “Haga hasta que”.

En primer lugar, el cursor debe posicionarse en la celda A1:

Para hacer que la celda vaya bajando de celda en celda, lo hacemos


incluyendo o invocando dentro del Do-Until la instrucción
ActiveCell.Offset, que ya habíamos visto al principio del libro:

Todo Do-Until finaliza con un Loop, y el Loop significa que repita el


ciclo hasta que la celda activa este vacía. Vacía se pone nada entre
comillas, unas comillas juntas, unidas.

100
Bien, dentro del Do Until y el Loop, va el Activecell.Offset:

Si ejecutas la macro, verás que ella ya está en condiciones de


recorrer toda la columna a toda velocidad.

¡Pero la recorre sin hacer nada!

Necesitamos que cuando recorra cada una de las celdas EVALUE si


tienen las condiciones por nosotros exigidas o no: si las tiene que
las elimine, y si no, que pase a la siguiente celda y siga revisando.

Esta macro que nos acabamos de “cranear” hace un momento, la


vamos a combinar con esta que hace el recorrido, así:

Observe que aquí ya integramos la evaluación celda por celda, y le


incluimos un ELSE (Si no,) ActiveCell.Offset(1,0) para que baje una
celda hacia abajo.

101
Al final del archivo observamos que nos quedó una última línea, que
hemos podido incluir en el combo de If’s. Incluyámosla.

Bien. La macro completa hasta el momento, queda así:

102
Sub MacroCompletaHelisa()

Archivo_Maestro = ActiveWorkbook.Name
Archivo_PRT = Application.GetOpenFilename _
("Directorio Terceros (*.txt),*.txt", , "Abra el directorio" & _
" de terceros", , False)
If Archivo_PRT = False Then
mensaje = MsgBox("No ha abierto ningún archivo." & _
" Por lo tanto no se ha realizado el proceso.", _
vbCritical, "Proceso Incompleto")
Workbooks(Archivo_Maestro).Close SaveChanges:=False
Exit Sub
Else
Application.DisplayAlerts = False

If Mid(Archivo_PRT, Len(Archivo_PRT) - 38, 35) <> _


"SMC Directorio Terceros 2011 HELISA" Then
mensaje = MsgBox("El archivo que intenta abrir no es correcto, " _
& "debe ser un Directorio de terceros Helisa Por lo" & _
" tanto no se ha realizado el proceso.", vbCritical, _
"Proceso Incompleto")
Workbooks(Archivo_Maestro).Close SaveChanges:=False
Exit Sub
Else
Application.DisplayAlerts = False

Workbooks.Open Filename:=Archivo_PRT
End If
End If

Archivo_PRT = ActiveWorkbook.Name

103
Archivo_FINAL = Application.GetSaveAsFilename(fileFilter:= _
"Archivo De Microsoft Excel (*.xlsx), *.xlsx")

If Archivo_FINAL = False Then


mensaje = MsgBox("No ha guardado el archivo de excel " & _
"que contendrá los Estados Financieros. " & _
"Por lo tanto no se ha realizado el proceso.", _
vbCritical, "Proceso Incompleto")
Workbooks(Archivo_PRT).Close SaveChanges:=False
Workbooks(Archivo_Maestro).Close SaveChanges:=False
Exit Sub
Else
Set NuevoArchivo = ActiveWorkbook

NuevoArchivo.SaveAs Filename:=Archivo_FINAL, _
FileFormat:=xlOpenXMLWorkbook, Password:="", _
WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False

Archivo_FINAL = ActiveWorkbook.Name
End If

'PeluqueaEncabezado()
Range("A1:A5").EntireRow.Delete

'MacroDeRecorridoQueEliminaBasura()
Range("A1").Select

Do Until ActiveCell = ""

If Left(Trim(ActiveCell), 7) = "EMPRESA" _
Or Left(Trim(ActiveCell), 18) = "Nombre del Informe" _

104
Or Left(Trim(ActiveCell), 6) = "Página" _
Or Left(Trim(ActiveCell), 18) = "NOMBRE DEL TERCERO" _
Or Left(Trim(ActiveCell), 4) = "Este" Then

Selection.EntireRow.Delete

Else

ActiveCell.Offset(1, 0).Select

End If
Loop

End Sub

105
Después de ejecutada la macro, el archivo queda asi:

Podemos ver que ya solo nos queda la información principal. Esto


normalmente se arregla seleccionando la columna A, yendo por la
opción datos – texto en columnas

Procedemos a poner las rayitas con mucho cuidado:

106
Ten cuidado, el nit que tiene un guión de separación, debes dejarlo
como tipo texto:

107
Al finalizar, justificar la columna:

Seleccionas desde la columna A a la E, y justificar:

Bien. Explicado paso a paso, lo que sigue es hacer lo mismo desde


antes de “particionar” (me excusan la violación idiomática) el archivo,
pero con el grabador de macros encendido. Esto causaría este
código:
Típicamente queda así:

108
Pero para que podamos ver bien la imagen, usemos los guiones al
piso para hacerla más angosta:

Esta macro no hay que hacerle mayor cosa, sobrarían las dos
selecciones de la columna A, y las columnas A hasta la E, pero no
pasa nada si las dejamos allí.

Este bloque se une a la anterior, la grande y ya quedaría listo todo,


solo faltaría colocarle los encabezados de columna. Para esto, lo que
haremos es insertar una fila en 1, y en cada celda colocar el rotulo
respectivo, esto generaría esta instrucción:

109
Se puede resumir o simplificar así: (lo que hago es editar el texto,
selecciono un segmento y borro o completo):

Observen como logramos reducir las líneas, lo cual hace que el


recorrido sea mejor y la macro ejecute aún más rápido, aunque a
nivel de nanosegundos…

Hay una manera que le aprendí a otro de los duros de Excel en el


mundo, el Señor John Walkenbach, este a diferencia de Bill Jelen que
se hace llamar “Mister Excel”, este decidió no quedarse atrás y se
hace llamar “Mister SpreadSheet” (Mister Hoja de Cálculo) en la
cual es posible montar todos esos encabezados en una sola línea.
La cosa es así:

110
Es una instrucción un tanto larga, vamos a acomodarla para que se
vea mejor, ya sabe, colocando la barra al piso:

Como puede ver, este estilo es mucho más veloz que el anterior, que
escribe celda por celda. Este, monta en todas las celdas, de un solo
tiro, los rótulos de los encabezados.
La macro que nos organiza el archivo directorio de terceros Helisa
queda así:

111
112
Con un recorrido tipo For Next

Esta es otra macro de recorrido, que puede ser un poco más


eficiente que la anterior, el pedazo que en la macro usamos el Do-
Until.
La única parte en la que hacemos el recorrido es la parte que
eliminamos esas líneas de los encabezados que quedaron inmersas
dentro del listado. Esa parte que con el procedimiento Do Until era
este:

Do Until ActiveCell = ""

If Left(Trim(ActiveCell), 7) = "EMPRESA" _
Or Left(Trim(ActiveCell), 18) = "Nombre del Informe" _
Or Left(Trim(ActiveCell), 6) = "Página" _
Or Left(Trim(ActiveCell), 18) = "NOMBRE DEL TERCERO" _
Or Left(Trim(ActiveCell), 4) = "Este" Then

Selection.EntireRow.Delete

Else

ActiveCell.Offset(1, 0).Select

End If
Loop

Con For Next podría quedar asi:

113
De la manera anterior, nos ayudamos de las variables. En esta macro
no se seleccionan celdas, Excel recorre “Por debajo” y va eliminando
la basura. Es mucho más rápida que el Do.

Recuerden que podemos asignar números a palabras clave que nos


identifican cosas en Excel, por ejemplo, si yo digo

EstaFila = 2

Cuando use esa palabra Excel ya sabe que me refiero es al 2. Es


muy útil combinar las variables (nombres) con el método CELLS, ya
que Cells, (Celda) referencia la celda con el número de fila y el
número de columna.

Así que, cuando decimos Cells(EstaFila,1) nos referimos a la


celda de la fila 2, columna 1.

El estilo For Next no recorre hasta que se llegue a una condición


especial, como Do until, que se detiene cuando la celda está vacía “”.
En for next se referencia el bloque de filas desde el principio:

Y el bloque de filas va desde la 2, que la hemos llamado “EstaFila”


hasta la última, y la última es la palabra que se refiere a la última fila
que contiene datos. La variable ultima ya la habíamos visto más
atrás.

114
Eliminar la basura con Filtros

Este procedimiento es uno de mis favoritas.


Resulta que los recorridos toman tiempo. En el momento en que
estés manejando un volumen muy grande de información, estos
recorridos se pueden tardar un tiempo importante, y en esto tiene
que ver la capacidad de tu computadora, su procesador y su
memoria ram. A más viejo, no será tan rápido.

Supongamos que tenemos un archivo de 500 mil filas, y


necesitamos hacer una macro de recorrido que le elimine algunas
celdas que contienen “basurita”.

Hagamos la cuenta:

115
Esto es un tiempo importante de espera. En una ocasión tuve que
organizar el archivo plano de un libro auxiliar de un hospital. No había
buen soporte ni había ingeniero de sistemas. Solo me quedó bajar el
libro auxiliar y convertirlo en una base de datos. Mis macros eran de
recorrido, y nunca me habían dado problemas hasta que llegué a esta
situación.

Lógicamente tuve que pensar en otra opción. La solución llegó


cuando observé que Yo personalmente cuando organizaba el archivo
plano, no me demoraba tanto. Y me di cuenta que manualmente mi
método era más rápido.

Este método era usar la herramienta filtro u ordenar la información.


Ambos son muy buenos, sin embargo, cuando se manejan archivos
gigantes, el filtro tiene un problema. Dado que hace que Excel oculte
las filas que están fuera del filtro, muestra las que queremos ver,
esto le supone un esfuerzo grandísimo en memoria y pudiera salir
un mensaje de que la memoria es insuficiente, o que no se muestran
algunos elementos.

Pero en archivos digamos de 10 mil celdas, con una computadora


rápida, el filtro puede levantar todo eso. Todo depende de la potencia
de la máquina. Aquí no te puedo dar valores exactos, ya que se
tendrían que hacer pruebas. Lo que sabemos es que, si la
información es muy grande, Excel sacará el aviso, levantará la mano
como pidiendo ayuda.

Bien. Si estamos en esta instancia del archivo plano:

116
Simplemente prendemos el grabador de macros, seleccionamos la
columna A, vamos por Datos – Filtro:

117
Desactivas el filtro:

Buscas las palabras que se refieren a los encabezados y activas la


casilla de verificación:

Dado que el primer elemento cae dentro de la eliminación,


Seleccionas la fila 1:

118
Haces con el teclado: Shift + Fin + Flecha abajo: para marcar todo el
rango:

Ubique el cursor en sobre la fila 1, pero en el número de la fila, bien


a la izquierda, toque el número 1 de la fila y haga clic derecho con el
ratón para que salga el menú emergente:

119
Le das clic a eliminar fila, y detienes la macro. Estas acciones causan
el siguiente código:

Este es el código que se genera desde Excel 2007 en adelante. Al


hacer el autofiltro, este detecta el tamaño de la región corriente, que
va desde la celda A1 hasta la A709. Esto ya sabemos que es un
problema, pues si queremos que la macro corra para otro momento,
seguramente el archivo habrá crecido en tamaño.

Sin embargo, nosotros ya sabemos cómo cambiar ese 709 por la


variable última fila:

Esta imagen está recortada para que pueda ver lo relevante, el


fragmento que falta es el mismo que está en la imagen anterior:

120
La variable ultima ya la vimos al comienzo del libro. Esta macro así
como está, ya funciona. Sin embargo, se puede mejorar o simplificar.
Una de las maneras seria esta:

Esta macro se inserta dentro de la grande, en el lugar de hacer el


recorrido con Do Until o for next.

Pero ojo, que el filtro no se ha llevado toda la basurita: nos ha dejado


aun estas dos filas y recordemos la del final:

De igual manera, inicias el grabador de macros, Seleccionas columna


A, Datos – Filtro. Te vas por filtro de texto:

121
De igual manera eliminas todas las filas.
Y eso causa el siguiente código. De igual manera solo es cambiar el
número de la última fila por la variable ultima.

Mejorada nos queda así:

122
Ustedes pueden evaluar cual método es el que les gusta más. En el
evento que el archivo sea demasiado grande, este método es mucho
más rápido que el recorrido celda por celda.

Sin embargo, este método de los filtros tiene un inconveniente. Es


muy veloz, pero le exige mucho recurso de memoria a Excel. Si
manejan archivos muy, muy grandes, por ejemplo, de 500 mil filas,
800 mil filas, casi el millón de filas, el filtro podría MORIRSE. Sin
embargo, hay una solución.

123
124
Eliminar la basura con fórmulas y la
herramienta Ordenar

Honestamente en archivos planos con demasiadas filas, las macros


de recorrido son muy largas, en el sentido de que su recorrido se
puede tardar demasiados minutos. Por lo que, en esos casos, no las
recomendaría. Los filtros son muy buenos, pero puede pasar que la
macro se detenga por capacidad de memoria.

Podemos usar varios recursos que le aumenten de manera increíble


la velocidad de depuración al archivo plano, y esto es usando
formulas o funciones lógicas combinadas con funciones de texto,
que a su vez trabajen con la herramienta ordenar para eliminar la
basura.

¿Qué es lo que hace que el filtro se “cuelgue” o en un terminó


folclórico “ se pifetié ” el Excel?

125
El esfuerzo gigante que hace para ocultar las filas que le ordenamos
no mostrar. Esto por debajo le exige un trabajo de recorrido a Excel
que en archivos de filas de mediano tamaño no se nota mucho
cuando monta el filtro. Cuando filtramos la basurita del archivo, lo
que hacemos es borrar todas estas filas filtradas. Este segundo
esfuerzo puede colapsar el Excel, ya que debe ir fila por fila
eliminando y reposicionando las filas adyacentes.

Lo que debemos hacer es ayudarle a Excel a que no tenga que hacer


este trabajo así. ¿Cómo?

Identificando con una marca, en una columna contigua las filas que
queremos eliminar. Esta marca la podemos hacer diciéndole a Excel
que coloque una “x” si la fila comienza con ciertos caracteres que la
delatan como fila basura. Esta fórmula o función sería una función
=Si( ) lógica, y en la prueba lógica usamos funciones de texto tales
como Izquierda, (Left) Derecha (Rigth) y Extrae (Mid). Otras
fórmulas que nos pueden ayudar son las funciones Hallar, encontrar,
largo, Esblanco, etc.

Como puede darse cuenta, conocer el tema de la formulación en


Excel es lo que podría rescatarlo a usted en la elaboración de una
macro que con recorridos se le puede tardar toda una mañana
organizando un archivo plano.

Veamos un ejemplo de solución para depurar la basurita con


fórmulas. O funciones. Recordemos la instancia en la cual debemos
deshacernos de esas filas “estorbosas”:

126
Una mirada más cercana a las líneas transaccionales nos revela que
estas comienzan con cierta cantidad fija de espacios en blanco:

Si selecciona una porción de celdas, y llama la herramienta Datos –


Texto en Columnas – Fijar Ancho, podrá saber mediante la regleta
que está allí, cuantas posiciones de espacios en blanco tienen las
filas transaccionales.

Esto nos permitirá establecer una función lógica que nos permita
identificar lo que no nos interesa. Por ejemplo, en la celda B,
podemos escribir una formula tal como esta:

=Extrae(A6;6;1)

127
En la celda B6, he montado una función de texto =Extrae( ) la
sintaxis de la función extrae es: Celda a trabajar: en este caso es la
A6. Posición a partir de la cual comienza la extracción de caracteres:
la posición número 6. ¿Cuantos caracteres vamos a extraer? Esto
se indica en el tercer argumento de la función.

Vemos que en todos los casos trae un carácter distinto de espacio,


como si se observa en la parte superior. Entonces, si esta función la
anidamos dentro de una =Si( ) lógica para que nos monte una “x” en
el lugar en donde en lugar de un carácter nos arroja un espacio,
tenemos:

En B1:

=SI(EXTRAE(A1;6;1)=" ";"x";"")

128
En principio la función se ve que cumple su cometido, sin embargo,
usted como buen auditor que es, siempre debe de revisar si todo
está ok. Un rápido recorrido nos muestra que más abajo existe una
fila basura que no está siendo marcada:

Entonces debemos afinar la función para que también monte una


“x” en los casos en los que la fila después de 5 espacios, comience
con la frase Nombre del Informe.

En primer lugar, debemos de saber de cuantas posiciones está


formada la frase “nombre del Informe”, y en segundo lugar, hallar
cual es la fórmula que nos extraería esa porción de texto.

Las posiciones las podemos saber con la herramienta Datos – Texto


en Columnas – Fijar Ancho:

129
Con esta información, procedo a montar la función extrae en la
columna B, misma fila:

=EXTRAE(A61;6;18)

En la A61 se encuentra toda la cadena de texto. A partir de la 6


posición, extraemos 18 caracteres, el resultado es “Nombre del
Informe”

Perfecto.

Entonces ahora vamos a crear una igualdad:

Observe lo que hace Excel. Al decirle que, si ese resultado es igual al


esperado, esto es, que, si es igual a “Nombre del Informe”, Excel nos
retorna, VERDADERO.

Ahora, para hacer que Excel nos ponga allí una x, simplemente es
montar esta prueba lógica dentro de un Si:

=SI(EXTRAE(A61;6;18)="Nombre del Informe";"x";"")

130
Esta será la segunda prueba lógica que le AÑADIREMOS a la
función que nos monta una marca X a las líneas basura que
queremos detectar de entre todo el archivo. Para unir las dos
fórmulas, esta:

=SI(EXTRAE(A1;6;1)=" ";"x";"")
=SI(EXTRAE(A61;6;18)="Nombre del Informe";"x";"")

La cosa sería asi:

En esta partecita que es la parte de lo que tiene que hacer la formula


si el valor es falso, se pega la segunda fórmula, cuidando que se
referencie la misma FILA:

=SI(EXTRAE(A61;6;1)=" ";"x";SI(EXTRAE(A61;6;18)="Nombre del Informe";"x";""))

Ok. Esta fórmula se pega a todo lo largo de la columna B.

131
132
Grabar una formula con una MACRO

Bien, esta parte nos servirá para ilustrar la manera que tengo para
grabar funciones.

Una vez ensayada y probada la formula, escríbala al principio de la


base de datos. Esto es, en este ejemplo, la celda B1.

Copias la fórmula que escribiste en la barra de fórmulas. Observa


como al seleccionar se sombrea la función:

133
Estando seleccionada la formula, haces Control+C. Luego oprimes
la tecla ESCAPE (ESC), para desbloquear el Excel.
Selecciona la celda B2. Vas a inicializar el grabador de macros:
Desarrollador – Grabar Macro. Seleccionas la celda B1. Vas a la barra
de fórmulas con un CLIC. Haces Control+V para pegar. Haces clic en
el signo de visto bueno que está a la izquierda de Fx. Detienes la
macro. Esto causa el siguiente código:

Por supuesto que puedes ver como Excel escribe una función o
formula “por debajo”, en lenguaje Visual Basic.

De esta manera, grabas las funciones de manera más segura, ya que,


al ser tan largas, y sabiendo que estamos siendo grabados, pues
como en todo escenario, ¡ nos aumentan los nervios !

134
Macro de una fórmula que se copia a todo lo largo
de un rango. Método 1
Ahora, esta función se debe pegar a todo lo largo del rango de la
columna B1, hasta la última fila.
Enciendes el grabador de macros y le das doble clic a la esquina de
la celda para que se rellene la formula hacia abajo:

Podemos reemplazar ese B709 por B – ultimafila, y eso ya lo


sabemos hacer!

En esta imagen, nos sobra ese B1 Select. Es repetitivo.

135
Macro de una fórmula que se copia a todo lo largo
de un rango. Método 2

Aprovechemos para aprender otro método para copiar esta función


o cualquier otra función o nombre, a todo lo largo de una columna.

Además de que veremos un método alternativo, veremos cómo


podemos hacer una sola instrucción en lugar de las tres
instrucciones del caso anterior.

Antes de que existiera el método del doble clic en la esquina de la


celda que genera el Autofill o relleno, nos tocaba hacer los
siguientes pasos:

1. Escribir la función en B1.


2. Copiarla con Control+C
3. Pasarnos a la celda adyacente, por la que pudiéramos
deslizarnos hacia abajo con Fin+Flecha abajo. En este caso
la celda adyacente que nos posibilita esa acción es la celda
A1 en la columna A. (Disculpen la redundancia, pero se me
hace necesaria)
4. Como indiqué en el paso anterior, una vez que la celda
activa se encuentra en A1, hacemos con el teclado de la
computadora un solo toque a la tecla FIN, y luego flecha
hacia abajo.
5. Nos pasamos a la celda adyacente, esto es, regresamos a
la última fila en B, usando el método visto,
ActiveCEll.Offset

136
6. Establecido el último punto del rango en el cual
copiaremos la función, hacemos la combinación de teclas
(obvio, con el teclado y al mismo tiempo)
Shift+Fin+FlechaArriba
7. Establecido el destino de lo que copiamos, hacemos
Control+V para pegar la formula a todo lo largo del rango.

Hecho lo anterior con el grabador de macros, se genera el siguiente


código:

Ok. Lea con mucha atención esta instrucción. Todo se vé en orden


menos ese
Range-B709

¿Porque? Por la razón de que es un rango fijo, y nosotros queremos


que esta macro corra siempre bien. Si el archivo que se vuelva a
trabajar, resulta de más extensión de filas, tendremos problemas con
esta instrucción.
Les comentaba en las instrucciones que aquí debemos de usar un
desplazamiento relativo, y simplemente es cambiar
Range("B709").Select

Por
Activecell.offset(0,1).select

137
Esta macro ahí como está funciona bien, ¿pero se puede mejorar?
Claro que si.
El procedimiento que monta la formula completo es este:

138
Aquí lo que se está haciendo, para aclararlo bien, es copiar una
formula en un rango. Este rango está formado por dos puntos. El
punto o celda Range(B1), y el punto al que se llega pasándose a la
celda de al lado, bajando al final y pasándose a la celda adyacente.
Bien. El primer punto ya lo tenemos, es el Range B1 en donde se
encasilló la formula
Ahora simplifiquemos los pasos que ejecutó el
grabador de macros para llegar al segundo
punto:
Comencemos por unir estas dos líneas:

Ese select con Selection, lo unimos. Es como cuando


simplificábamos operaciones algebraicas, ¿recuerda? Numerador
cancela denominador.
Y queda así:

Ok. Esta la podemos unir con la que sigue:

Simplificado queda así:

Este es el segundo punto, el de la parte de abajo.


Ok.

Ahora miremos la línea que sigue, esta:

Es la sentencia o instrucción que forma el rango en el cual se pegará


la formula copiada.
Pero vamos a meter en ella los dos puntos del rango, el primer punto
es Range b1, lo metemos y nos va quedando asi:

139
Observe que en lugar de Selection, le ponemos el primer punto del
rango. En la colita que dice Selection.End(xlUp) le ponemos el punto
de abajo, y nos queda así:

Cabe indicar que en esto no hay necesidad de escribirlo, solo de


seleccionar fragmentos copiarlos y pegarlos en el lugar de otros.

Habiendo reunido en una sola sentencia las dos anteriores, esas ya


sobran y se pueden eliminar.
Ahora enfoquémonos en la parte de la formula, esta parte:

¿Recuerda que más atrás trabajamos esta parte?


Fue así: que esto:

Se puede escribir así:

Entonces, se igual manera, La fórmula puede quedar así, no hay


necesidad de seleccionar sino tan solo de indicarle a Excel que en
esa celda va esa fórmula, y listo:

140
Observe que al igual que el nombre, la formula también va entre
comillas, al principio y al final, igual que el nombre del tercero.

Pero observe algo todavía que va más allá:


Este método Range, así como acepta una sola celda, también acepta
un rango de celdas.
Así que en lugar de Range(“B1”), podemos colocar el rango completo
que organizamos hace un rato, y la macro nos quedaría así:

La cosa queda así:

Así que toda esta macro:

Finalmente queda así:

141
Eliminar la basura con la herramienta ordenar.
Una vez que ya tenemos detectadas con una X las filas que
queremos eliminar, lo que hacemos es clasificar con la herramienta
Ordenar los registros marcados con x arriba y los que no, abajo. Los
de arriba que serán los marcados con x, procedemos a eliminarlos.

La cosa paso a paso sería así:


Selecciono la columna A y B:

Seleccionamos Datos – Ordenar:

En Ordenar por, seleccionamos la columna B, y en criterio de


ordenación, descendente de la Z a la A:

142
El resultado es el siguiente:

Al encender el grabador de macros obtenemos este código:

143
A veces lo viejo era más sencillo.

Una de las ventajas de estar en este trabajo desde hace muchos


años, es que los viejos que usamos los viejos Excel, sabemos que el
grabador de macros de antes era mejor en muchos aspectos.

Por ejemplo, hacer las mismas acciones, aplicado el grabador de


macros nos genera este código:

Y sabemos que, si unimos select con selection, esas dos líneas


quedan convertidas en una sola:

Pero hay más: podemos dejar únicamente las instrucciones mínimas


necesarias, es decir estas:

144
Columns("A:B").Sort Key1:=Range("B1"), Order1:=xlDescending

¿Porque cambió la manera en que trabajaba el grabador de macros? Por optimización


de recursos. Había mucha potencia en los equipos 2003 para 65 mil filas. Pero en
cuanto le aumentaron las filas a un millón y pico, tuvieron que replantear el codigo.
Los equipos no estaban a la altura del nuevo Excel. Pero ya lo alcanzaron y hoy en
día tenemos memoria de sobra, contando con el hecho de que tengas una buena
máquina, es decir lo último del mercado. Así que le podemos decir de nuevo, que
marque completamente la columna.

Todo lo que marcamos con una “x” nos queda alineado arriba. Y para
Excel, este recurso es mucho más potente de ejecutar que un filtro.
Ahora necesitamos deshacernos rápidamente de esas celdas
marcadas con “x”.

¿Cómo lo hacemos?

Excel tiene unas funcionalidades que hacen que el cursor se mueva


muy rápido, y son los famosos Shorcuts o atajos de teclado. Al final
del libro hemos dejado una lista bastante completa de los atajos de
teclado que le ayudarán a ganar mucha velocidad, contra lo que
puede hacerse si solo se usa el ratón y la interfaz gráfica.

Si nos ubicamos en la celda B1, y oprimimos FIN + Flecha hacia abajo,


observamos como Excel salta de manera inmediata hasta la última
fila, incluida la fila en blanco. Esta capacidad increíble para
seleccionar un rango o moverse de puntos distantes dentro de una
hoja de cálculo, es algo que debe de aprovecharse en el beneficio de
la depuración vía macros de los listados que se descargan de los
diferentes softwares contables.

En este caso, todo lo que ha sido marcado con una X, debe ser
eliminado. Sin embargo, ¿Cómo marcamos SOLO el rango que
contiene las X usando esta capacidad de Excel de saltar
rápidamente hasta el final?

145
Si observa, al ubicarse en la celda B1, y dar FIN + FLECHA abajo,
Excel prácticamente salta hasta el final, pero se detiene porque
debajo de esa última fila de datos hay celdas en blanco. Así que la
solución es esa: Insertar una fila en Blanco entre el bloque de datos
marcados con una X, del resto de datos. ¿Cómo?

Pudimos ver que la Herramienta Ordenar, lo hizo de manera


DESCENDENTE, para que las X quedaran arriba. Así que lo que
tenemos que hacer, es aprovechar la fila en blanco que está debajo
de todos los datos, esta fila:

Necesitamos que esa fila quede incorporada dentro del bloque de


datos a trabajar. El truco sería colocar en la Celda B710 la letra “a”:

Luego, al ordenar nuevamente las columnas A y B de manera


descendente por la Columna B, esta FILA, la 710, quedará intermedia
entre las celdas marcadas con las X y las que están en Blanco,
creando una intersección entre ambos bloques, así:

146
Este es el resultado:

Ahora, podremos usar el potencial del desplazamiento usando el


modo FINAL. Si nos ubicamos en la celda A1 y oprimimos Fin +
Flecha abajo, nos detendremos en la fila 51 de la imagen.

De manera similar podremos seleccionar un rango, y podremos


eliminarlo muy rápidamente. Bien. Ya tenemos la macro que nos
ordena las X arriba y los espacios debajo de estos.

Ok. Ahora con macros, necesitamos montar la letra “a” aquí:

147
El código es este:

Ahora sí, podremos HACER la macro que ORDENA LAS X ARRIBA, con lo que el código
quedaría así:

148
Una vez que tenemos el archivo con la basura en donde la
queremos, solo nos falta el código que nos borre todo el bloque de
las X de arriba en una sola instrucción:

Marcar el rango desde A1 hasta A49 es así:

Simplificado queda así:

A esa selección solo hace falta decirle ENTIRE.ROW.DELETE:

149
Unidas las tres instrucciones, la macro queda así:

Y unida la macro que señala las “x” tenemos:

Esta macro es la que reemplazaría el recorrido con el Do Until de la


macro total que realizamos en la página 109, y déjame decirte que
en mi opinión, es el mejor método de todos.

150
Macro que depura el balance de
comprobación UFCG0141 del sistema
CG1 8.5

Bien. Ya les conté los conocimientos mínimos que se requieren de


MACROS para poder depurar los archivos planos de cualquier
software contable. Ahora vamos a ver más casos reales de macros
que he realizado usando esta metodología. No está de más decir,
que aún existen otras maneras de escribir el código.

Resulta mis amigos que de tanto andar en esta actividad, no tardé


en darme cuenta que el problema de los contadores es el asunto de
la oportunidad, y no están siendo oportunos ya que, al momento de
hacer los reportes o informes, por lo general les toca partir de un
archivo plano descargado del aplicativo contable. Así que este es el
tema que atacaré a continuación. Pretendo con este libro mostrarles
cómo organizar unos cuantos archivos planos de las principales
casas de software, de tal manera que esta situación no sea una
piedra en el camino, sino que, por el contrario, con estas macros tu
logres un rendimiento casi que increíble.

Por otra parte, que logres llegar a esto:

En esta ocasión, veremos una macro y los pasos que nos ordena a
base de datos este reporte. Dado que ya vimos las técnicas al
detalle, no necesito mostrarte con plastilina porque hago una cosa
u otra, solo con comentarearla será suficiente. Descontado el hecho
de que tú le puedes colocar las macros que validan si es el archivo
correcto, el código principal de esta macro es el siguiente:

151
152
Sub OrganizaBaseDatos()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"

u = Range("A1048576").End(xlUp).Row

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range("A1") = 1
Range("A2") = 2
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A" & u & "")

Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _


"=OR(LEFT(RC[1],1)=""+"",LEFT(RC[1],1)=""|"",ISBLANK(RC[1]),LEFT(RC[1],3)="" "",MID(RC[1],2,1)=""+"",LEFT(RC[1],5)=""--
---"",MID(RC[1],4,5)=""Total"")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Columns("A:C").AutoFilter
ActiveSheet.Range("$A$1:$C$" & u & "").AutoFilter Field:=2, Criteria1:= _
"VERDADERO"
Range(Rows("2:2"), Selection.End(xlDown)).Delete Shift:=xlUp
Selection.AutoFilter
u = Range("A1048576").End(xlUp).Row

'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(LEFT(RC[1],1)="" "","""",""x"")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'

153
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(13, 1), Array(44, 1), Array(66, 1), Array(68, 1), _
Array(89, 1), Array(112, 1), Array(135, 1)), DecimalSeparator:=".", _
ThousandsSeparator:=",", TrailingMinusNumbers:=True

Columns("C:J").EntireColumn.AutoFit
'
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:J").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:J" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Columns("E:F").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range("A1").End(xlDown).Offset(1, 0).Select
Selection.EntireRow.Delete
ActiveCell.Offset(0, 2).Select
'
Range(Selection, ActiveCell.Offset(0, 1)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Cut
ActiveCell.Offset(0, 2).Select
ActiveSheet.Paste
u = Range("A1048576").End(xlUp).Row

'
Columns("A:L").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

154
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:L" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range("A1").End(xlDown).Offset(0, 3).Select

Range(Range("A1").End(xlDown).Offset(0, 3), Cells(2, 3)).SpecialCells(xlCellTypeBlanks).Select


Selection.NumberFormat = "General"
Selection.FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'Nos llevamos las cuentas a otra hoja:


Columns("C:D").Select
Selection.Copy
Sheets.Add After:=ActiveSheet
Worksheets(2).Name = "Cuentas"
ActiveSheet.Paste
Application.CutCopyMode = False

u = Range("A1048576").End(xlUp).Row

ActiveSheet.Range("$A$1:$B$" & u & "").RemoveDuplicates Columns:=Array(1, 2), _


Header:=xlNo
Worksheets("DatosBase").Select

'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(RC[5]&RC[7]&RC[8]&RC[9]="""",""x"","""")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

155
'

Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:L").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:L" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Range(Range("A1"), Selection.End(xlDown)).Offset(1, 0).EntireRow.Delete

u = Range("A1048576").End(xlUp).Row
'
Range("M2") = "=IF(RC[-5]=""CR"",-RC[-6],RC[-6])"
Range("N2") = "=+RC[-5]"
Range("O2") = "=+RC[-5]"
Range("P2") = "=+RC[-3]+RC[-2]-RC[-1]"
Range("M2:P2").Select
Selection.AutoFill Destination:=Range("M2:P" & u & "")
Range("M2:P" & u & "").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("G:L").Delete Shift:=xlToLeft
Columns("G:J").EntireColumn.AutoFit
'
Columns("B:B").Delete Shift:=xlToLeft
'Range("B1") = "Cuenta"
'Range("C1") = "Nombre de la cuenta"
'Range("D1") = "Nit"
'Range("E1") = "Nombre del tercero"
'Range("F1") = "Saldo inicial"

156
'Range("G1") = "Debito"
'Range("H1") = "Credito"
'Range("I1") = "Saldo final"

Range("B1").Resize(, 8) = Array("Cuenta", "Nombre de la cuenta", "Nit", "Nombre del tercero", "Saldo inicial", "Debito", "Credito",
"Saldo final")

Application.ScreenUpdating = True
Application.DisplayAlerts = True

Range("A1").Select
End Sub

157
Bien ahora pasamos a Explicar un poco todo esto.
Sub OrganizaBaseDatos()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Estas dos instrucciones son para evitar el “parpadeo” y que Excel


no le haga preguntas al usuario como si desea continuar o algo asi.

Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"

Creamos una copia de la hoja original, la hoja 1 y la renombramos


como Datos base
u = Range("A1048576").End(xlUp).Row

Creamos la variable ultima fila


Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1") = 1
Range("A2") = 2
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A" & u & "")

Creamos un numero serial o consecutivo

Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=OR(LEFT(RC[1],1)=""+"",LEFT(RC[1],1)=""|"",ISBLANK(RC[1]),LEFT(RC[1],3)=""
"",MID(RC[1],2,1)=""+"",LEFT(RC[1],5)=""-----"",MID(RC[1],4,5)=""Total"")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Insertamos una columna y en ella montamos una función que evalué


verdadero o falso para los casos en los que la fila comienza con un
“+”, un “|” si la fila entera está en blanco, si comienza con un espacio,
si el segundo carácter es un “+” si comienza con rayitas ----- o si
tiene la palabra total.

Columns("A:C").AutoFilter
ActiveSheet.Range("$A$1:$C$" & u & "").AutoFilter Field:=2, Criteria1:= _
"VERDADERO"
Range(Rows("2:2"), Selection.End(xlDown)).Delete Shift:=xlUp
Selection.AutoFilter

Eliminamos todos los casos verdaderos, que son la basurita con un


filtro.

u = Range("A1048576").End(xlUp).Row

Como eliminamos filas, hacemos que Excel evalúe nuevamente cual


es la última fila.
'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(LEFT(RC[1],1)="" "","""",""x"")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Dado que los número de nit están antecedidos por un espacio, nos
valemos de esta situación para detectarlos.
'
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(13, 1), Array(44, 1), Array(66, 1), Array(68, 1), _
Array(89, 1), Array(112, 1), Array(135, 1)), DecimalSeparator:=".", _
ThousandsSeparator:=",", TrailingMinusNumbers:=True

Con la herramienta texto a columnas, procedemos a partir el bloque


principal.

158
Columns("C:J").EntireColumn.AutoFit

Justificamos el ancho de todas las columnas de la C hasta la J.

'
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Hacemos el truquito de montar una fila en blanco como separador,


y redefinir de nuevo la ultima fila, que esta vez va por la columna B.

Columns("A:J").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:J" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Organizamos las cuentas en la parte superior, el separador letra “a”


en el intermedio y el bloque de los Nits abajo.
'
Columns("E:F").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Abrimos dos columnas, para darle su lugar a las cuentas, ya que las
columnas actuales comparten la cuenta y el nit. Dado que ya las
logramos separar, vamos a reubicar todos los nits a sus columnas
propias.

Range("A1").End(xlDown).Offset(1, 0).Select
Selection.EntireRow.Delete
ActiveCell.Offset(0, 2).Select
'
Range(Selection, ActiveCell.Offset(0, 1)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Cut
ActiveCell.Offset(0, 2).Select
ActiveSheet.Paste
u = Range("A1048576").End(xlUp).Row

Movemos todo el bloque de los NITS y sus nombres a su nueva


ubicación, y redefinimos la ultima fila, pues se eliminó la fila que tenía
el separador letra “a”.

'
Columns("A:L").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:L" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Ordenamos de nuevo por el numero serial, para retornar al orden


original, y proceder a copiar las cuentas con la técnica celdas en
blanco.

Range("A1").End(xlDown).Offset(0, 3).Select

Range(Range("A1").End(xlDown).Offset(0, 3), Cells(2, 3)).SpecialCells(xlCellTypeBlanks).Select


Selection.NumberFormat = "General"
Selection.FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

159
Hacemos el copiado masivo de cuentas. Tenemos cuidado de
ponerle formato general a las filas a rellenar, para que la formula a
introducir no quede como texto.

'Nos llevamos las cuentas a otra hoja:


Columns("C:D").Select
Selection.Copy
Sheets.Add After:=ActiveSheet
Worksheets(2).Name = "Cuentas"
ActiveSheet.Paste
Application.CutCopyMode = False

Como indica el comentario en el apostrofo, este bloque se llevará


las cuentas a una nueva hoja, para conservarlas.

u = Range("A1048576").End(xlUp).Row

En la nueva hoja, ubicamos la ultima fila para usarla en el siguiente


paso

ActiveSheet.Range("$A$1:$B$" & u & "").RemoveDuplicates Columns:=Array(1, 2), _


Header:=xlNo

Se eliminan los duplicados, asi quedan solo cuentas únicas.

Worksheets("DatosBase").Select

Las operaciones regresan a la hoja Datos Base.

'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(RC[5]&RC[7]&RC[8]&RC[9]="""",""x"","""")"

Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy


Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

En la columna B, en donde se están llevando a cabo las validaciones,


se procede a detectar las cuentas que tienen bloques en blanco.
Dado que la cuenta auxiliar ya fue copiada, y todas las cuentas se
llevaron a una hoja anexa, todas estas cuentas que tienen espacios
en blanco no las necesitamos.

Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:L").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:L" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Range(Range("A1"), Selection.End(xlDown)).Offset(1, 0).EntireRow.Delete

u = Range("A1048576").End(xlUp).Row

Volvemos a hacer el truquito de eliminar todas las cuentas marcadas


con una “x”, y de nuevo reconocemos la última fila.

'
Range("M2") = "=IF(RC[-5]=""CR"",-RC[-6],RC[-6])"
Range("N2") = "=+RC[-5]"
Range("O2") = "=+RC[-5]"
Range("P2") = "=+RC[-3]+RC[-2]-RC[-1]"
Range("M2:P2").Select
Selection.AutoFill Destination:=Range("M2:P" & u & "")
Range("M2:P" & u & "").Select

160
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

En la columna M, N, O y P, montamos fórmulas que arreglen los


valores. Este archivo tiene el detalle de que los valores negativos les
pone un CR en una columna adyacente al saldo inicial y al saldo
final. Por tal razón la primer formula es una función Si lógica.
Columns("G:L").Delete Shift:=xlToLeft
Columns("G:J").EntireColumn.AutoFit

Las columnas viejas que guardaban los valores viejos, las eliminamos
y justificamos desde la G a la J.

'
Columns("B:B").Delete Shift:=xlToLeft

Borramos la columna B, en donde realizabamos las validaciones.

'Range("B1") = "Cuenta"
'Range("C1") = "Nombre de la cuenta"
'Range("D1") = "Nit"
'Range("E1") = "Nombre del tercero"
'Range("F1") = "Saldo inicial"
'Range("G1") = "Debito"
'Range("H1") = "Credito"
'Range("I1") = "Saldo final"

Range("B1").Resize(, 8) = Array("Cuenta", "Nombre de la cuenta", "Nit", "Nombre del tercero", "Saldo


inicial", "Debito", "Credito", "Saldo final")

Como hay una fila en blanco, aprovechamos y en ella se ingresan los


encabezados. Se dejó con apostrofo el metodo celda a celda y el
metodo que inserta todo en una sola operación con el metodo resize
y array.

Application.ScreenUpdating = True
Application.DisplayAlerts = True

De nuevo activamos el screen updating y las alertas a normal.

Range("A1").Select

Dejamos el cursor ubicado al principio de la hoja de calculo.


End Sub

Fin de la Macro con End Sub

161
Macro que depura el libro auxiliar
del sistema helisa win
En esta ocasión trabajaremos el libro auxiliar del sistema contable
Helisa Win. Es importante recordar, que algunos software contable
tienen unos módulos que permiten que Excel entre y lea
directamente las tablas del software, pero estos complementos son
costosos y se cobran por usuario. Aquí damos una solución para el
caso en el cual el contador no cuenta con estos software de apoyo.

Esta ilustración es del libro de Mister Excel “40”

162
163
Es bueno aclarar, antes de que me caigan los envidiosos, que las empresas pueden adquirir unos complementos
que se le instalan al Excel y que le permiten a este, traer todos los registros limpios. Sin embargo, estos
aditamentos son costosos. Ya lo había mencionado en el libro Excel Aplicado a la auditoría, contaduría y
administración. El contador no puede esperar que el gerente le compre todo lo que pida, sobre todo si no hay
presupuesto. Así que siempre será el contador o la contadora la que le toque “bailar con el más feo”. Esto es, bajar
el listado y “peluquearlo” con Excel.
Una manera de hacer la macro que organice este archivo plano, es la siguiente. Aclarando que hay otros estilos y
maneras de hacer macros, por increíble que parezca.

Sub Macro1()
'
' Macro1 Macro
Application.ScreenUpdating = False
'
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "BaseDatos"
u = Range("A1048576").End(xlUp).Row

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range("A1") = 1
Range("A2") = 2
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A" & u & ""), Type:=xlFillDefault
Rows("1:6").Delete Shift:=xlUp
Range(Range("A1").End(xlDown).Offset(0, 1),
Cells(1)).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=+R[-1]C"
Columns("B:B").Select
Selection.Copy

164
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").EntireColumn.AutoFit

Range(Range("C1"), Range("C1").End(xlDown).Offset(-1, 0)).EntireRow.Delete

Range(Range("A1").End(xlDown).Offset(0, 2),
Cells(1)).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=+R[-1]C"

Columns("C:C").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("C:C").EntireColumn.AutoFit

Columns("D:D").Delete Shift:=xlToLeft
Columns("E:E").Delete Shift:=xlToLeft
Columns("F:F").Delete Shift:=xlToLeft
Columns("H:N").Delete Shift:=xlToLeft
Columns("I:J").Delete Shift:=xlToLeft
Columns("J:S").Delete Shift:=xlToLeft
Columns("G:G").Delete Shift:=xlToLeft
u = Range("A1048576").End(xlUp).Row

Columns("A:H").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields. _
Clear

165
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields. _
Add Key:=Range("D1:D" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:H" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range("D1").End(xlDown).Offset(1, -3).Select
Range(Selection, Selection.End(xlDown)).EntireRow.Delete

u = Range("A1048576").End(xlUp).Row
Columns("A:H").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:H" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

166
Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)) = "=+RC[-2]-RC[-1]"

Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)).Copy


Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Columns("C:C").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="(", FieldInfo:=Array(Array(0, 1), Array(9, 1)), _
TrailingMinusNumbers:=True
Columns("B:C").Select
Columns("B:C").EntireColumn.AutoFit
Columns("E:E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="(", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").Select
Selection.Replace What:=")", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

167
ReplaceFormat:=False
Columns("E:E").EntireColumn.AutoFit
Columns("A:K").Select
Columns("A:K").EntireColumn.AutoFit
Range("A1").Select
'
Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Range("A1") = "1"
'Range("B1") = "Cuenta Auxiliar"
'Range("C1") = "Nombre de la cuenta"
'Range("D1") = "Tercero"
'Range("E1") = "Nit"
'Range("F1") = "Fecha"
'Range("G1") = "Documento"
'Range("H1") = "Detalle"
'Range("I1") = "Debito"
'Range("J1") = "Credito"
'Range("K1") = "Valor Neto"

Range("A1").Resize(, 11) = Array("1", "Cuenta Auxiliar", "Nombre de la cuenta", "Tercero", "Nit",


"Fecha", "Documento", "Detalle", "Debito", "Credito", "Valor neto")

End Sub

168
Ok. Explicaremos un poco más en detalle que es todo esto.
Sub Macro1()
'
' Macro1 Macro
Application.ScreenUpdating = False
'
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "BaseDatos"
u = Range("A1048576").End(xlUp).Row

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range("A1") = 1
Range("A2") = 2
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A" & u & ""), Type:=xlFillDefault

Suelo comenzar el trabajo creando una copia de la hoja original, y


creando un numero serial. Esta macro es la misma para todos los
casos.

Rows("1:6").Delete Shift:=xlUp
Range(Range("A1").End(xlDown).Offset(0, 1), Cells(1)).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=+R[-1]C"
Columns("B:B").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").EntireColumn.AutoFit

Eliminamos las primeras 6 filas y rellenamos las cuentas y los


nombres de las cuentas, ya que ambos campos se hallan
combinados en la columna B. Finalmente justificamos el ancho de la
columna. Esta opción solo es válida si usted está seguro que todas
las cuentas manejan numero de tercero. En el evento de que no sea
asi, esta acción causará que se copien bloques de informacion con
terceros que en realidad no deberían estar allí. Verifique bien antes
de hacer este paso.

Range(Range("C1"), Range("C1").End(xlDown).Offset(-1, 0)).EntireRow.Delete

El relleno de datos en las celdas en blanco funciona en este caso


porque introducimos una formula que trae el dato de la celda
superior. Para rellenar los nombres de nits, necesitamos que el
primer valor a rellenar sea un nit. Pero resulta que en la columna de
los nits, tenemos 4 filas vacías. Por esta razón, antes de proceder a
hacer el relleno de nits con celdas especiales en blanco, debemos
eliminar estas filas vacías.

Range(Range("A1").End(xlDown).Offset(0, 2), Cells(1)).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=+R[-1]C"

Con esta sola instruccion, realizamos el relleno de los Nits en las


celdas en blanco.

Columns("C:C").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("C:C").EntireColumn.AutoFit

Desbaratamos la formula con copiar, pegado especial y justificamos


el ancho de la columna.
Columns("D:D").Delete Shift:=xlToLeft
Columns("E:E").Delete Shift:=xlToLeft
Columns("F:F").Delete Shift:=xlToLeft
Columns("H:N").Delete Shift:=xlToLeft
Columns("I:J").Delete Shift:=xlToLeft
Columns("J:S").Delete Shift:=xlToLeft
Columns("G:G").Delete Shift:=xlToLeft

Eliminamos columnas vacías.

169
u = Range("A1048576").End(xlUp).Row

Columns("A:H").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields. _
Add Key:=Range("D1:D" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:H" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Organizamos u ordenamos la información por la columna que


contiene la fecha, lo que no es fecha, son filas que no son lineas
transaccionales, y por lo tanto las podemos eliminar.

Range("D1").End(xlDown).Offset(1, -3).Select
Range(Selection, Selection.End(xlDown)).EntireRow.Delete

Desde la ultima posición de la ultima fila que tiene fecha en la


columna D, nos desplazamos hasta la columna A, y desde allí hasta
abajo, se eliminan todas las filas.

u = Range("A1048576").End(xlUp).Row
Columns("A:H").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:H" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Ordenamos nuevamente por el numero serial

Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)) = "=+RC[-2]-RC[-1]"

Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)).Copy


Range(Range("I1"), Range("F1").End(xlDown).Offset(0, 3)).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

En la columna de la derecha procedemos a montar un valor neto.

Columns("C:C").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="(", FieldInfo:=Array(Array(0, 1), Array(9, 1)), _
TrailingMinusNumbers:=True
Columns("B:C").Select
Columns("B:C").EntireColumn.AutoFit

Insertamos una columna en C, pues vamos a proceder a partir la


cuenta y el nombre de la cuenta, y esta partición pide espacio.
Recordemos que la cuenta y el nombre de la cuenta están mezclados
en una misma celda a lo largo de toda la columna B. Se procede a
partir el archivo con la herramienta Datos – Texto en Columnas,
opción fijar ancho (Fixed With).

Columns("E:E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="(", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True

170
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").Select
Selection.Replace What:=")", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

De igual manera, insertamos una columna en E. También tenemos


que el nombre del tercero y el nit están mezclados en una misma
celda a lo largo de toda la columna D. Se procede a partir el archivo
con la herramienta Datos – Texto en Columnas, opción delimitados.
El limitador es el paréntesis “ ( ”. Al final el parentesis de cierre es
reemplazado por nada.

Columns("E:E").EntireColumn.AutoFit
Columns("A:K").Select
Columns("A:K").EntireColumn.AutoFit
Range("A1").Select

Se justifican las Columnas.


'
Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Range("A1") = "1"
'Range("B1") = "Cuenta Auxiliar"
'Range("C1") = "Nombre de la cuenta"
'Range("D1") = "Tercero"
'Range("E1") = "Nit"
'Range("F1") = "Fecha"
'Range("G1") = "Documento"
'Range("H1") = "Detalle"
'Range("I1") = "Debito"
'Range("J1") = "Credito"
'Range("K1") = "Valor Neto"

Range("A1").Resize(, 11) = Array("1", "Cuenta Auxiliar", "Nombre de la cuenta", "Tercero", "Nit", "Fecha",
"Documento", "Detalle", "Debito", "Credito", "Valor neto")

Se montan los títulos con el metodo Resize. Se deja comentareado


con apóstrofo el metodo celda por celda
End Sub

171
Macro que depura el libro auxiliar
del sistema World Office
Este aplicativo envía el libro auxiliar a Excel bastante limpio. Por
limpio se entiende aquí, sin tanta “basurita” tal como líneas,
subtotales, encabezados por cada página con la información
implícita, etc. Sin embargo, hay que hacerle unas pequeñas cositas,
las cuales con el ánimo de no ser repetitivos en las tareas del dia a
dia, las podemos grabar en una macro.

172
173
La macro que depura este archivo es la siguiente:
Sub OrganizaAuxiliarWorldOffice()
'
Application.ScreenUpdating = False
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"

Rows("1:2").Delete Shift:=xlUp
'
Range("A1").CurrentRegion.RemoveSubtotal

u = Range("A1048576").End(xlUp).Row

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range("A1") = "Serial"
Range("A2") = 1
Range("A3") = 2
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & u & "")
'
Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) =


"=IF(LEFT(RC[1],5)=""Total"",""x"","""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'

174
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:K").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B2:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:K" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range(Range("A1"), Selection.End(xlDown)).Offset(1, 0).EntireRow.Delete

u = Range("A1048576").End(xlUp).Row

'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=VALUE(TRIM(LEFT(RC[1],FIND(""
"",RC[1]))))"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("B:B").Select

175
Selection.Copy
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Range("D1") = "Cuenta"
'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=PROPER(TRIM(MID(RC[1],FIND(""
"",RC[1]),100)))"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("B:B").Select
Selection.Copy
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("E1") = "Nombre de la cuenta"
'
Columns("C:C").Delete Shift:=xlToLeft
'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) =
"=IFERROR(PROPER(TRIM(LEFT(RC[3],FIND(""Nit"",RC[3])-1))),"""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("B:B").Select
Selection.Copy

176
Columns("F:F").Select
Selection.Insert Shift:=xlToRight
Range("F1") = "Nombre del tercero"
'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) =
"=IFERROR(VALUE(TRIM(MID(RC[3],FIND(""Nit"",RC[3])+3,100))),"""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).NumberFormat = "#,##0"

Columns("B:B").Select
Selection.Copy
Columns("F:F").Select
Selection.Insert Shift:=xlToRight
Range("F1") = "Nit"
'
Columns("E:E").Select
Selection.Delete Shift:=xlToLeft
'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=IF(RC[6]=""SALDO
INICIAL"",""x"","""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'

177
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:M").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B2:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:M" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=+RC[9]-RC[10]"


Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Range(Range("K2"), Range("a1").End(xlDown).Offset(0, 11)).Select


Selection.ClearContents
'
Columns("B:B").Select
Selection.Copy
Columns("K:K").Select
Selection.Insert Shift:=xlToRight

178
Range("K1") = "Saldo inicial"
'
Range("A1").End(xlDown).Offset(1, 0).EntireRow.Delete

u = Range("A1048576").End(xlUp).Row
'
Columns("A:N").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:N" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Columns("N:N").Delete Shift:=xlToLeft
Columns("B:B").Delete Shift:=xlToLeft
Range("A1").Select
End Sub

179
Expliquemos un poco todo esto:

Sub OrganizaAuxiliarWorldOffice()
'
Application.ScreenUpdating = False
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"

Rows("1:2").Delete Shift:=xlUp
'
Range("A1").CurrentRegion.RemoveSubtotal

u = Range("A1048576").End(xlUp).Row

Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


Range("A1") = "Serial"
Range("A2") = 1
Range("A3") = 2
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & u & "")
'
Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Este paso es el mismo que hemos venido trabajando en las


macros prácticas, (salvo la instrucción Remover los subtotales y
eliminar las dos filas superiores): Crear la copia de la hoja, crear el
serial en la columna A, y una columna B para hacer las validaciones
masivas.

Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=IF(LEFT(RC[1],5)=""Total"",""x"","""")"


Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Se realiza una formula Si logica combinada con la funcion de texto


izquierda que detecte en donde está la palabra “Total” estas lineas
se requieren eliminar.
'
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:K").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B2:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:K" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range(Range("A1"), Selection.End(xlDown)).Offset(1, 0).EntireRow.Delete

En este paso eliminamos las líneas que contienen la palabra “Total”


con el método de crear un separador de celdas en blanco, para poder
eliminar las filas masivamente y sin mucha necesidad de recursos de
memoria Ram ni de procesador.

u = Range("A1048576").End(xlUp).Row

Actualizamos la variable ultima fila pues hemos eliminado una


cantidad importante de filas.

180
'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=VALUE(TRIM(LEFT(RC[1],FIND("" "",RC[1]))))"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Con esta fórmula que montamos en la columna B, extraemos el


código de la cuenta. Como vemos el archivo de ejemplo combina en
la columna C, cuenta y nombre de la cuenta. En esta ocasión a
diferencia del caso anterior, arreglamos el asunto con fórmulas.

'
Columns("B:B").Select
Selection.Copy
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Range("D1") = "Cuenta"

La cuenta extraida en la columna B de validaciones, la copiamos y la


insertamos en la columna D.

'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=PROPER(TRIM(MID(RC[1],FIND(""
"",RC[1]),100)))"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("B:B").Select
Selection.Copy
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("E1") = "Nombre de la cuenta"

Siguiendo el mismo metodo, en la columna B de validaciones,


extraemos el nombre de la cuenta, la copiamos y la insertamos en la
columna E.

'
Columns("C:C").Delete Shift:=xlToLeft

Se elimina la columna C, en donde estaba la cuenta y nombre


combinados.

'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) =
"=IFERROR(PROPER(TRIM(LEFT(RC[3],FIND(""Nit"",RC[3])-1))),"""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("B:B").Select
Selection.Copy
Columns("F:F").Select
Selection.Insert Shift:=xlToRight
Range("F1") = "Nombre del tercero"

Siguiendo el mismo método, extraemos el nombre del nit, ya que el


nit y el nombre están combinados en una misma columna. Se copia
el nombre extraido y se lleva a su destino final.

'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) =
"=IFERROR(VALUE(TRIM(MID(RC[3],FIND(""Nit"",RC[3])+3,100))),"""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

181
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).NumberFormat = "#,##0"

Columns("B:B").Select
Selection.Copy
Columns("F:F").Select
Selection.Insert Shift:=xlToRight
Range("F1") = "Nit"

Siguiendo el mismo método, extraemos el numero del nit, se copia


el numero extraido y se lleva a su destino final, se aprovecha y se le
da formato de numero con un separador de miles.

'
Columns("E:E").Select
Selection.Delete Shift:=xlToLeft

Eliminamos la columna que contenía el nit y el nombre.

'
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=IF(RC[6]=""SALDO INICIAL"",""x"","""")"
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

En la columna de validación rastreamos las líneas que nos traen el


valor del saldo inicial en cada cuenta, este valor no puede compartir
la misma columna débito o crédito, debe estar en una columna
propia.
'
Range("A1048576").End(xlUp).Offset(1, 1) = "a"
u = Range("B1048576").End(xlUp).Row

Columns("A:M").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range( _
"B2:B" & u & ""), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:M" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Ordenamos las filas que tienen los valores de saldo inicial en la parte
superior. (recuerde que las marcamos con una “x”, colocamos una
linea de celdas en blanco con el identificador “a”, y el resto de
información en blanco, al ordenar descendente, las columnas
marcadas con “x” quedan arriba.

Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)) = "=+RC[9]-RC[10]"


Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A2").End(xlDown).Offset(0, 1)).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

Al bloque detectado, sacamos el valor neto, ya que los saldos


iniciales estan en las columnas ya sea debito o credito.

Range(Range("K2"), Range("a1").End(xlDown).Offset(0, 11)).Select


Selection.ClearContents

Limpiamos los debitos y creditos de los saldos iniciales, pues ya nos


preparamos a montar el saldo inicial valor neto, en una columna
aparte.

'
Columns("B:B").Select
Selection.Copy

182
Columns("K:K").Select
Selection.Insert Shift:=xlToRight
Range("K1") = "Saldo inicial"

Montamos el saldo inicial calculado en la columna de validación B,


lo llevamos a su destino, su columna propia.

'
Range("A1").End(xlDown).Offset(1, 0).EntireRow.Delete

Se elimina la fila intermedia creada con celdas en blanco (la letra “a”)

u = Range("A1048576").End(xlUp).Row

Se vuelve a reconocer la ultima fila.

'
Columns("A:N").Select
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DatosBase").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("DatosBase").Sort
.SetRange Range("A1:N" & u & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Se organiza todo de nuevo por la columna A, que es en donde


tenemos el serial.

'
Columns("N:N").Delete Shift:=xlToLeft
Columns("B:B").Delete Shift:=xlToLeft

La columna N en donde aparecen unos saldos de linea las


eliminamos, asi como nuestra columna de validaciones temporales.
Range("A1").Select
End Sub

183
Macro que depura el libro auxiliar
del sistema SIIGO
Al igual que el World Office, este aplicativo del software Siigo envía
el libro auxiliar a Excel mucho más limpio. Por lo menos así lo pude
confirmar en este ejemplo que me han suministrado mis amigos.

Por limpio se entiende aquí, sin tanta “basurita” tal como líneas,
subtotales, encabezados por cada página con la información
implícita, etc. Sin embargo, hay que hacerle unas pequeñas cositas,
las cuales con el ánimo de no ser repetitivos en las tareas del día a
día, las podemos grabar en una macro.

Recordemos que estas casas de software tienen unos


complementos que envían a Excel la información en forma de base
de datos, no obstante, aquí ofrecemos una alternativa para los
contadores que no cuentan con dichos complementos.

184
185
Sub OrganizaLibroAuxiliarSiigo()
'
' Macro8 Macro
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'

Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"
'
u = Worksheets("DatosBase").Range("A1048576").End(xlUp).Row
'
Rows("1:6").Delete Shift:=xlUp
'
Columns("A:S").EntireColumn.AutoFit
'
Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1") = "Serial"
Range("A2") = 1
Range("A3") = 2
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & u & "")

'
Columns("K:L").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("J:J").Select
Selection.TextToColumns Destination:=Range("J1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 2), Array(5, 1), Array(17, 1)), TrailingMinusNumbers:= _
True
Columns("J:L").EntireColumn.AutoFit
Range("J1") = "Tipo Comp"
Range("K1") = "Comp"
Range("L1") = "No Linea"
End Sub

186
Como podemos ver es una macro bastante corta,
Sub OrganizaLibroAuxiliarSiigo()
'
' Macro8 Macro
'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'

Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"
'
u = Worksheets("DatosBase").Range("A1048576").End(xlUp).Row
'
Rows("1:6").Delete Shift:=xlUp
'
Columns("A:S").EntireColumn.AutoFit
'
Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1") = "Serial"
Range("A2") = 1
Range("A3") = 2
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & u & "")

'
Columns("K:L").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("J:J").Select
Selection.TextToColumns Destination:=Range("J1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 2), Array(5, 1), Array(17, 1)), TrailingMinusNumbers:= _
True
Columns("J:L").EntireColumn.AutoFit
Range("J1") = "Tipo Comp"
Range("K1") = "Comp"
Range("L1") = "No Linea"
End Sub

187
Bonos Extra:
A continuación, y adicionalmente, les comparto los siguientes
códigos para depurar archivos planos de algunos software contable
muy populares en el mercado Colombiano, los cuales estoy seguro
les serán de mucha utilidad.

Algunas de estas supermacros fueron desarrolladas hace algunos


años por lo que usted verá que hay formas mas eficientes de escribir
algunos apartes de ellas mismas, tema depuración y legibilidad del
codigo visual basic, como lo explicamos en este libro.

Nota: Estas macros las encontrará en el archivo de apoyo


que se le envía.
Recuerde que el archivo de apoyo se accesa con los datos del
cliente: numero cedula número de celular o email, de esta
manera si el archivo resulta pirateado, se sabrá quien fue la
persona que lo permitió. Cuide sus tesoros y capitalícelos.

188
Macro que organiza el listado auxiliar

softland

189
Sub Macro1()
'
' Macro1 Macro
Application.ScreenUpdating = False
'
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "BaseDatos"
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'Serial:
Columns("A:A").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1") = 1
Range("A2") = 2
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A" & u & ""),
Type:=xlFillDefault
'Eliminamos filas encabezados, totales de cuenta, totales por
tercero:
Columns("B:B").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _

"=IF(OR(TRIM(RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]
&RC[10]&RC[11]&RC[12])="""",TRIM(RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[
6]&RC[7]&RC[8]&RC[9]&RC[10]&RC[11]&RC[12])=""INFORME LIBRO
AUXILIAR"",LEFT(TRIM(RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[
8]&RC[9]&RC[10]&RC[11]&RC[12]),5)=""Desde"",LEFT(TRIM(RC[1]&RC[2]&
RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]&RC[1" & _

"0]&RC[11]&RC[12]),6)=""Cuenta"",LEFT(TRIM(RC[1]&RC[2]&RC[3]&RC[4]
&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]&RC[10]&RC[11]&RC[12]),13)=""Identfi
cador1"",LEFT(TRIM(RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]
&RC[9]&RC[10]&RC[11]&RC[12]),8)=""Nro.Reg."",LEFT(TRIM(RC[1]&RC[2]
&RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]&RC[10]&RC[11]&RC[12]),5
)=""TOTAL"",LEFT(TRIM(RC[1]&RC[2]&RC[3]" & _

"&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]&RC[10]&RC[11]&RC[12]),16)=""
Contabilidad
SQL"",RC[9]=""Página:"",RC[9]=""Fecha:"",RC[9]=""Hora:"",RC[6]<>""
"",RC[5]=""Saldo
Ant."",RC[1]=""Descripción"",ISNUMBER(RC[5]),ISNUMBER(RC[11])),""x
"","""")" & _
""
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"), Range("A1").End(xlDown).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Separador
Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 1) = "a"

190
'Nueva ultima fila:
u = Cells(Application.Rows.Count, 2).End(xlUp).Row
'
Columns("A:N").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:N" & u & "")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

'Eliminamos Filas:
Range("A1").Select
Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select
Selection.EntireRow.Delete
'Detectamos las cuentas:
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _

"=IF(AND(RC[1]<>"""",ISBLANK(RC[2]),RC[3]<>"""",ISBLANK(RC[4]),ISB
LANK(RC[5]),ISBLANK(RC[6]),ISBLANK(RC[7]),ISBLANK(RC[8]),ISBLANK(R
C[9])),""x"","""")"
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"), Range("A1").End(xlDown).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 1) = "a"
'Nueva ultima fila:
u = Cells(Application.Rows.Count, 2).End(xlUp).Row
'Separamos las cuentas arriba:
Columns("A:N").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:N" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply

191
End With
'Nos movemos a la interseccion Cuenta - resto de información y
eliminamos la a intermedia
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
Selection.EntireRow.Delete
'Nueva ultima fila:(Ojo va por la Columna A:
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'Guardamos la fila para formar el rango de celdas a mover:
a = ActiveCell.Row
Range("C" & a & ":E" & u & "").Select
'Dentro del rango seleccionado, insertamos celdas:
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
'Nueva ultima fila: (ojo va por la columna 1)
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'Ordenamos por el serial:
Columns("A:P").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:P" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Elimnamos la columna en blanco intermedia:
Columns("D:D").Select
Selection.Delete Shift:=xlToLeft

'Rellenamos las cuentas en los espacios en blanco:


Range(Range("A1").End(xlDown).Offset(0, 3),
Cells(3)).SpecialCells(xlCellTypeBlanks).Select
Selection.NumberFormat = "General"
Selection.FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Copiamos el formato de una vez:
Range("C1:D1").Select
Selection.Copy
Columns("C:D").Select

192
Selection.PasteSpecial Paste:=xlPasteFormats,
Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'Nos llevamos las cuentas a una hoja anexa:
Columns("C:D").Select
Selection.Copy
Sheets.Add After:=ActiveSheet
Worksheets(2).Name = "Cuentas"
ActiveSheet.Paste
Application.CutCopyMode = False
u2 = Cells(Application.Rows.Count, 1).End(xlUp).Row
ActiveSheet.Range("$A$1:$B$" & u2 & "").RemoveDuplicates
Columns:=Array(1, 2), _
Header:=xlNo
'Regresamos a la hoja 1:
Worksheets(1).Select
'
Columns("J:J").Select
Selection.Delete Shift:=xlToLeft
Columns("K:K").Select
Selection.Delete Shift:=xlToLeft
'Identificamos los nits:
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _

"=IF(AND(RC[1]<>"""",RC[2]<>"""",RC[3]<>"""",ISBLANK(RC[4]),ISBLAN
K(RC[5]),RC[6]<>"""",ISBLANK(RC[7]),ISBLANK(RC[8]),ISBLANK(RC[9]))
,""x"","""")"
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"), Range("A1").End(xlDown).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Separador
Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 1) = "a"
'Nueva ultima fila:
u = Cells(Application.Rows.Count, 2).End(xlUp).Row
'
Columns("A:P").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:P" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply

193
End With
'Elimanmos este bloque de cuentas, no nos hace falta aqui:
Range("C1:D1").Select
Range(Range("C1:D1"), Selection.End(xlDown)).Select
Selection.ClearContents

'Nos movemos a la interseccion Cuenta - resto de información y


eliminamos la a intermedia
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
Selection.EntireRow.Delete
'Nueva ultima fila:(Ojo va por la Columna A:
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'Guardamos la fila para formar el rango de celdas a mover:
a = ActiveCell.Row
Range("E" & a & ":H" & u & "").Select
'Ordenamos por el serial
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Columns("A:P").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:P" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Columns("F:G").Select
Selection.Delete Shift:=xlToLeft
'Identificamos las lineas que tienen el valor de la transacción:
Range(Range("B2"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(OR(R[-1]C[5]=""DN"",R[-1]C[5]=""CN""),""x"","""")"
Range(Range("B2"), Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B2"), Range("A1").End(xlDown).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'Separador
Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 1) = "a"
'Nueva ultima fila:
u = Cells(Application.Rows.Count, 2).End(xlUp).Row

194
'Ojo, esta vez hay que ordenar Ascendente para que el bloque a
mover quede abajo
'Después hay que desplazar todo una fila arriba
Columns("A:P").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:P" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

'Nos movemos a la interseccion Cuenta - resto de información y


eliminamos la a intermedia
Range("A1").Select
Selection.End(xlDown).Select
'Ojo, hay que dejar la fila de interseccion viva para
desplazar todo el bloque
'de abajo una posición arriba:
ActiveCell.Offset(2, 0).Select
'Selection.EntireRow.Delete
'Nueva ultima fila:(Ojo va por la Columna A:
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'Guardamos la fila para formar el rango de celdas a mover:
a = ActiveCell.Row
Range("G" & a & ":M" & u & "").Select
'Cortamos y desplazamos:
Selection.Cut
ActiveCell.Offset(0, 7).Select
ActiveSheet.Paste
'Ordenamos por el serial
Columns("A:U").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"A1:A" & u & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:U" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

195
'Desplazamos el bloque corrido a la derecha una fila hacia arriba
'Para reposicionar al frente de la informacion de la transacción.
Range("N1:U1").Select
Selection.Delete Shift:=xlUp
'Ordenamos descendente, en donde quedaron las "x" quedaron filas
vacías,
'asi que procedemos a borrarlas. Eso le sigue bajando tamaño al
archivo.
u = Cells(Application.Rows.Count, 2).End(xlUp).Row
'
Columns("A:U").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B1:B" & u & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:U" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Eliminamos Filas:
Range("A1").Select
Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select
Selection.EntireRow.Delete
'Eliminamos columnas vacias:
Columns("O:R").Select
Selection.Delete Shift:=xlToLeft
'Borramos la ultima parte del archivo:
Range("E1048576").End(xlUp).Offset(1, -4).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.EntireRow.Delete
'Vamos a hacer el relleno de los terceros. PEro esto se puede
hacer solo si se
'confirma si esta contabilidad maneja terceros en todas las
cuentas.
'Esta contabilidad maneja terceros menos en la cuenta 11
disponible.
'Asi que vamos a hacer el relleno hacia abajo a partir de Clientes
'Ubicamos la primera fila para formar el rango a rellenar con
variables:
Columns("C:C").Select
Selection.Find(What:="11", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Offset(1, 0).Select
a = ActiveCell.Row

196
u = Cells(Application.Rows.Count, 1).End(xlUp).Row
'
Range("E" & a & ":F" & u & "").Select
'
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.NumberFormat = "General"
Selection.FormulaR1C1 = "=+R[1]C"
Columns("E:F").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Nos deshacemos de todo lo que no es transaccion, ordenamos por
fecha.
Columns("A:R").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"K1:K" & u & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:R" & u & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Ya que las fechas quedan arriba, y la basura abajo, seleccionamos
el rango a borrar:
Range("K1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, -10).Select
'
Range(Selection, Selection.End(xlDown)).Select
Selection.EntireRow.Delete
'Eliminamos columnas en blanco:
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Columns("I:I").Select
Selection.Delete Shift:=xlToLeft
Columns("A:O").EntireColumn.AutoFit
'Ordenamos de nuevo por el serial:
Columns("A:Q").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:N" & u & "")

197
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Encabezados:
Rows("1:1").Select
Selection.Insert Shift:=xlDown,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Resize(, 14) = Array("Id", "Cuenta", "Nombre de la
cuenta", "Nit", "Nombre del tercero", "Nat", "Registro", "Tipo
Doc", "Fecha", "Numero Comp", "Doc Ref", "Detalle", "Debito",
"Credito")

'Formato del encabezado:


Range("B2").Select
Selection.Copy
Rows("1:1").Select
Selection.PasteSpecial Paste:=xlPasteFormats,
Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

'Guardamos
ActiveWorkbook.Save
Application.ScreenUpdating = True
Range("A1").Select
End Sub

198
Macro que organiza el listado auxiliar

saint

199
Sub OrganizaABaseDeDatos()
'Creamos una copia
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "BaseDatos"

ActiveCell.SpecialCells(xlLastCell).Select
Range(Selection, Cells(1)).Select
Selection.UnMerge

'hay algunas celdas ajustadas y otras no.


'Las ajustamos todas para luego quitarles ese formato a todas.
With Selection
.WrapText = True
End With
With Selection
.WrapText = False
End With

'Coloco el serial:
ultimafila = Range("A1048576").End(xlUp).Row
Columns("A:A").Insert
Range("A1") = 1
Range("A2") = 2
Range("A1:A2").AutoFill Destination:=Range("A1:A" &
ultimafila & ""), Type:=xlFillDefault
Columns("B:B").Insert

'Elimino todo comience con Fecha, Codigo, Procesado o una


celda en blanco:
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).FormulaR1C1 = _

"=IF(OR(LEFT(RC[1],6)=""Código"",LEFT(RC[1],5)=""Fecha"",LEFT(RC[1
],9)=""Procesado"",ISBLANK(RC[1])),""x"","""")"
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).Copy
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"

Range(Range("A1048576").End(xlUp).Offset(1, 18),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("A1"), Range("A1").End(xlDown).Offset(1,
0)).EntireRow.Delete

200
'Detecto las cuentas por las seis celdas en blanco que
tienen al lado y las separo:
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).FormulaR1C1 = _

"=IF(AND(ISBLANK(RC[3]),ISBLANK(RC[4]),ISBLANK(RC[5]),ISBLANK(RC[7
]),ISBLANK(RC[8]),ISBLANK(RC[9])),""x"","""")"
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).Copy
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"

Range(Range("A1048576").End(xlUp).Offset(1, 11),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'abrimos el espacio en donde desplazaremos las cuentas,
nits y nombres de terceros:
Columns("C:D").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

Range("E1").Select
Range(Range("E1"), Selection.End(xlDown).Offset(0,
1)).Select
Selection.Cut
Range("C1").Select
ActiveSheet.Paste
'COPIAMOS CUENTAS Y SALDOS A HOJA ANEXA:
Range(Range("A1").End(xlDown).Offset(0, 13),
Cells(1)).Copy
Sheets.Add
Worksheets(1).Name = "SaldoInicialCuentas"
ActiveSheet.Paste
Application.CutCopyMode = False

'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&

'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
Worksheets(2).Select
'Ordeno de nuevo por el serial
Range(Range("A1048576").End(xlUp).Offset(1, 13),
Cells(1)).Select
Selection.Sort _
Key1:=Range("A1"), Order1:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _

201
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

ultimafila = Cells(Application.Rows.Count,
1).End(xlUp).Row
'Relleno de cuentas con Rellenar celdas en Blanco
Range(Range("A1").End(xlDown).Offset(0, 3),
Cells(3)).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'ELIMINAR LAS CUENTAS COPIADAS QUE TIENEN LA MARCA X:


'Ordeno arriba las cuentas a eliminar:
Range(Range("A1048576").End(xlUp).Offset(1, 13),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'Elimino todas las filas:
Range("A1", Range("A1").End(xlDown).Offset(1,
0)).EntireRow.Delete

'Bloque que recupera los Nits:


Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).FormulaR1C1 = _

"=IF(AND(ISBLANK(RC[4]),ISBLANK(RC[5]),ISBLANK(RC[6]),(RC[7])<>"""
"),""x"","""")"
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).Copy
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"

Range(Range("A1048576").End(xlUp).Offset(1, 13),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'abrimos el espacio en donde desplazaremos las cuentas,
nits y nombres de terceros:

202
Columns("E:F").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

Range("G1").Select
Range(Range("G1"), Selection.End(xlDown)).Select
Selection.Cut
Range("E1").Select
ActiveSheet.Paste

Range("K1").Select
Range(Range("K1"), Selection.End(xlDown)).Select
Selection.Cut
Range("F1").Select
ActiveSheet.Paste

'Ordeno de nuevo por el serial


Range(Range("A1048576").End(xlUp).Offset(1, 15),
Cells(1)).Select
Selection.Sort _
Key1:=Range("A1"), Order1:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

'#################################################################
########################

'#################################################################
########################
'Sub CopiarTerceros()
ultimafila = Range("A1048576").End(xlUp).Row
Range("E1").Select
Do Until ActiveCell.Row = ultimafila
ActiveCell.End(xlDown).Select
If ActiveCell = ultimafila Then GoTo EndCopy
Selection.Resize(1, 2).Select
Selection.Copy
ActiveCell.Offset(1, 2).Select
If ActiveCell = "" Then 'Este if vá porque hay dos
renglones blancos entre fechas.
ActiveCell.Offset(0, -2).Select
Application.CutCopyMode = False
Selection.Resize(1, 2).Select
Selection.Copy
ActiveCell.Offset(1, 2).Select
End If
x = ActiveCell.Row
If ActiveCell.Offset(1, 0) = "" Then
y = ActiveCell.Row
If Cells(x, 3) = Cells(y, 3) Then
Range("E" & x & ":F" & y & "").Select
ActiveSheet.Paste
Application.CutCopyMode = False

203
Else
ActiveCell.Offset(0, -2).End(xlUp).Select
Do Until Cells(x, 3) <> Cells(y, 3)
Selection.Resize(1, 2).Select
Selection.Copy
If Cells(x, 3) = Cells(y, 3) Then
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
End If
Loop
End If
Else
Selection.End(xlDown).Select
y = ActiveCell.Row
If Cells(x, 3) = Cells(y, 3) Then
Range("E" & x & ":F" & y & "").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Else
ActiveCell.Offset(0, -2).End(xlUp).Select
Application.CutCopyMode = False
Do Until ActiveCell.Offset(0, -2) <>
ActiveCell.Offset(1, -2)
Selection.Resize(1, 2).Select
Selection.Copy
If ActiveCell.Offset(0, -2) =
ActiveCell.Offset(1, -2) Then
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
End If
Loop
Application.CutCopyMode = False
End If
End If
Loop
EndCopy: Range("A1").Select
'End Sub

'#################################################################
###

'#################################################################
###

'ELIMINAR LAS CUENTAS COPIADAS QUE TIENEN LA MARCA X:


'Ordeno arriba las cuentas a eliminar:
Range(Range("A1048576").End(xlUp).Offset(1, 15),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

204
'COPIAMOS CUENTAS Y SALDOS A HOJA ANEXA:
Range(Range("A1").End(xlDown).Offset(0, 15),
Cells(1)).Copy
Sheets.Add
Worksheets(2).Name = "SaldoInicialTerceros"
ActiveSheet.Paste
Application.CutCopyMode = False

Worksheets(3).Select
'Elimino todas las filas que contenian los terceros:
Range("A1", Range("A1").End(xlDown).Offset(1,
0)).EntireRow.Delete

'Indicamos el valor neto de la transacción:


Range(Range("P1"), Range("A1048576").End(xlUp).Offset(0,
15)).FormulaR1C1 = _
"=+RC[-2]-RC[-1]" 'Se arma el valor neto
Range(Range("P1"), Range("A1048576").End(xlUp).Offset(0,
15)).Copy
Range(Range("P1"), Range("A1048576").End(xlUp).Offset(0,
15)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'Se eliminan columnas en blanco:
Columns("K:M").Delete Shift:=xlToLeft

'Debitos y Creditos:
Range(Range("O1"), Range("A1048576").End(xlUp).Offset(0,
13)).FormulaR1C1 = _
"=+RC[-3]*1" 'Se organiza Debito y credito
Range(Range("O1"), Range("A1048576").End(xlUp).Offset(0,
13)).Copy
Range(Range("O1"), Range("A1048576").End(xlUp).Offset(0,
13)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

Columns("K:L").Select
Selection.Delete Shift:=xlToLeft
Columns("L:M").Select
Selection.Cut
Columns("K:K").Select
Selection.Insert Shift:=xlToRight
Range("A1").Select

'Organizamos el formato de las columnas de número:


Range(Range("A1").End(xlDown).Offset(0, 12),
Cells(11)).NumberFormat = "#,##0.00_);[Red](#,##0.00)"

'Justificamos los anchos de todas las columnas:


Columns("A:M").EntireColumn.AutoFit

205
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&

'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&

'Incluyo el grupo:
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).FormulaR1C1 = "=LEFT(RC[1],2)"
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).Copy
Range(Range("B1"), Range("A1048576").End(xlUp).Offset(0,
1)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").EntireColumn.AutoFit

'#################################################################
################################################

'Insertamos el subgrupo:
Columns("C:C").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).FormulaR1C1 = "=LEFT(RC[1],4)"
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).Copy
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("C:C").EntireColumn.AutoFit

'Colocamos el nombre del grupo:


Columns("C:C").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).FormulaR1C1 = _
"=VLOOKUP(RC[-1],[Walter.xlsm]Puc!R1C1:R359C2,2,0)"
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).Copy
Range(Range("C1"), Range("A1048576").End(xlUp).Offset(0,
2)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("C:C").EntireColumn.AutoFit

'Colocamos el nombre del subgrupo


Columns("E:E").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range(Range("E1"), Range("A1048576").End(xlUp).Offset(0,
4)).FormulaR1C1 = _

206
"=VLOOKUP(RC[-1],[Walter.xlsm]Puc!R1C1:R359C2,2,0)"
Range(Range("E1"), Range("A1048576").End(xlUp).Offset(0,
4)).Copy
Range(Range("E1"), Range("A1048576").End(xlUp).Offset(0,
4)).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("E:E").EntireColumn.AutoFit

'Colocamos los titulos o encabezados de columna:


Rows("1:1").Select
Selection.Insert Shift:=xlDown,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Resize(, 16) = Array(1, "Grupo", "Nombre del
grupo", "Subgrupo", "Nombre del subgrupo", "Cuenta", "Nombre de la
cuenta", "Tercero", "Nit", "Fecha", "Documento", "No.Doc",
"Detalle o descripción", "Débito", "Crédito", "Valor Neto")
Range("A1").Select

ActiveWorkbook.Save

MsgBox "A las " & Time & " la macro ha


finalizado con éxito." _
& vbNewLine & "Tiempo Transcurrido: " &
Format(Time - Inicio, "hh:mm:ss"), vbInformation, "Alejandro
Quiceno - Proceso Finalizado"
'MsgBox ("Tiempo Transcurrido: " &
Format(Time - Inicio, "hh:mm:ss"))

End Sub

207
208
Macro que depura el libro auxiliar Zeus

209
Sub DepuraLibroAuxiliarZeus()
'
' Macro9 Macro
'

'
Sheets.Add After:=ActiveSheet
Worksheets(1).Select
Cells.Select
Selection.Copy
Worksheets(2).Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Cells.Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'
Application.CutCopyMode = False

'Definimos la ultima fila como variable:


ultimafila = Range("A65536").End(xlUp).Row

'Borramos columnas en Blanco o sin información relevante:


Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Columns("D:E").Select
Selection.Delete Shift:=xlToLeft
Columns("I:J").Select
Selection.Delete Shift:=xlToLeft
Columns("J:J").Select
Selection.Delete Shift:=xlToLeft

'Creamos un rango fijo para hacer el autorelleno del numero


consecutivo
Columns("A:A").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
ActiveCell.FormulaR1C1 = "x"
Selection.AutoFill Destination:=Range("A1:A" & ultimafila &
"")
'Creamos el serial o numero consecutivo
Columns("B:B").Select

210
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("B1").Select
ActiveCell.FormulaR1C1 = 1
Range("B2").Select
ActiveCell.FormulaR1C1 = 2
Range("B1:B2").Select
Selection.AutoFill Destination:=Range("B1:B" & ultimafila &
"")
'Eliminamos la columna que nos ayudó a crear el serial o numero
consecutivo
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft

'
Columns("B:B").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

'
Range("B1").Select
ActiveCell.FormulaR1C1 = _

"=IF(OR(+RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]&RC[7]&RC[8]&RC[9]="""
",LEFT(RC[1],6)=""Unidad"",LEFT(RC[1],7)=""Listado"",AND(RC[1]="""
",LEFT(RC[7],5)=""Saldo"")),1,2)"
'
Selection.AutoFill Destination:=Range("B1:B" & ultimafila &
"")
Range("B1:B" & ultimafila & "").Select

Columns("B:B").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Columns("A:K").Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add
Key:=Range("B1:B" & ultimafila & "" _
), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:K" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'

211
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Offset(-1, 0).Select
'Range("B21235").Select
Range(Selection, Selection.End(xlUp)).Select
Selection.EntireRow.Delete
'Verificar de nuevo la ultima fila:
ultimafila = Range("A65536").End(xlUp).Row

Range("B1").Select
ActiveCell.FormulaR1C1 = "=IF(ISBLANK(RC[2]),1,2)"
Selection.AutoFill Destination:=Range("B1:B" & ultimafila &
"")
Range("B1:B" & ultimafila & "").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'
Columns("A:K").Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"B1:B" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:K" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

'
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate

ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

212
ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

'
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate

ActiveCell.Offset(-1, 2).Select
'
Range(Selection, Selection.End(xlUp)).Select
Selection.FormulaR1C1 = "=+RC[1]"
Columns("D:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate

ActiveCell.Offset(0, 1).Select

'
Range(Selection, Cells(1, 3)).Select

Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireRow.Delete
'
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate

ActiveCell.Offset(-1, 0).Select

'
ultimafila = Range("A65536").End(xlUp).Row

213
'
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add
Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:X" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Range("B1").Select
ActiveCell.FormulaR1C1 = "=IF(RC[7]=""Saldo Anterior"",1,2)"
Selection.AutoFill Destination:=Range("B1:B" & ultimafila &
"")
Range("B1:B" & ultimafila & "").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'
Columns("A:M").Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"B1:B" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:M" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Range("O1").Select
Selection.Copy
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Offset(-1, 2).Select

214
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
'
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add
Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:X" & ultimafila & "")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 2).Select
Range(Selection, Cells(1, 3)).Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"B1:B" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:X" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Columns("K:K").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Application.Goto Reference:="R1C12"
Range(Selection, Selection.End(xlDown)).Select
Selection.Cut
Range("K1").Select

215
ActiveSheet.Paste
'
ultimafila = Range("A65536").End(xlUp).Row
'
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Offset(-1, 9).Select
rango = ActiveCell.Row
Range(Selection, Cells(1)).Select
ActiveSheet.Range("$A$1:$K$" & rango & "").RemoveDuplicates
Columns:=Array(3, 4, 9, 11), _
Header:=xlNo
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"A1:A" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:Y" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
'
Columns("A:O").Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"I1:I" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:O" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("I1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, -8).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.EntireRow.Delete
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear

216
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"A1:A" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:Y" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Cells.Select
Cells.EntireColumn.AutoFit
'
ultimafila = Range("A65536").End(xlUp).Row
'
Range("B1").Select
ActiveCell.FormulaR1C1 = "=IF(RC[3]=""Documento"",1,2)"
Selection.AutoFill Destination:=Range("B1:B" & ultimafila &
"")
Range("B1:B" & ultimafila & "").Select

'
ultimafila = Range("A65536").End(xlUp).Row
'
Cells.Select
ActiveWorkbook.Worksheets(2).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(2).Sort.SortFields.Add Key:=Range( _
"B1:B" & ultimafila & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(2).Sort
.SetRange Range("A1:Y" & ultimafila & "")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
Columns("B:B").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

217
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Offset(-1, 0).Select
'Range("B1476").Select
Range(Selection, Selection.End(xlUp)).Select
Selection.EntireRow.Delete
Range("A1").Select
'
Rows("1:1").Select
Selection.Insert Shift:=xlDown,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1") = "id"
Range("B1") = "Criterio"
Range("C1") = "Cuenta"
Range("D1") = "Nombre de la cuenta"
Range("E1") = "Documento"
Range("F1") = "Fecha"
Range("H1") = "Descripcion"
Range("I1") = "Ref"
Range("J1") = "Tercero"
Range("K1") = "Saldo Anterior"
Range("L1") = "Debito"
Range("M1") = "Credito"
Range("N1") = "Acumulado"

Columns("G:G").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
End Sub

218
Macro que depura el libro auxiliar del

sistema CG v 8.5 UFCG1033

219
Sub OrganizaLibroAuxiliarUFCG1033SistemaCG18_5()
Range("A1").Select
If Left(Range("A1"), 1) = "+" Then
Range("A1").Select
Else
Range("A1").EntireRow.Delete
End If
'Inserto un numero serial, identificador de
registro, ordinal o como lo quiera llamar
ultimafila = Range("A1048576").End(xlUp).Row
Columns("A:A").Insert
Range("A1") = 1
Range("A2") = 2
Range("A1:A2").AutoFill Destination:=Range("A1:A"
& ultimafila & ""), Type:=xlFillDefault
'Inserto una columna para depurar las filas
Columns("B:B").Insert
'Primera depuración: elimino la mayor cantidad de
basura posible. Esta formula la puedes mejorar.
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(OR(MID(RC[1],2,1)=""+"",LEFT(RC[1],1)=""+"",LEFT(RC[1],1)=""|
"",LEFT(RC[1],1)=""-"",ISBLANK(RC[1]),LEFT(TRIM(RC[1]),1)=""-
"",LEFT(RC[1],6)=""VIENEN"",LEFT(TRIM(RC[1]),5)=""Total""),""x"","
""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 2),
Cells(1)).Sort Key1:=Range("B1"), _
Order1:=xlDescending, Header:=xlGuess,
OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete

'Segunda depuración: elimino totales:


'Los totales aparecen en puntos decimales del
saldo inicial, debito, credito y saldo final _
segundo espacio que comienza en la posición 23
MID(RC[1],23,2)="" ""
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(AND(MID(RC[1],69,1)=""."",MID(RC[1],91,1)=""."",MID(RC[1],112
,1)=""."",MID(RC[1],133,1)="".""),""x"","""")"

220
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 2),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'Rescatar las filas sin movimiento:
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(MID(RC[1],18,14)=""SIN
MOVIMIENTO"","""",""x"")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Range(Range("A1").End(xlDown).Offset(1, 2),
Cells(1)).Select
Selection.Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete

'Tercera depuración: elimino cuentas intermedias:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(LEFT(RC[1],11)=""
"",IF(ISNUMBER(VALUE(MID(RC[1],12,1))),IF(MID(RC[1],17,1)=""-
"","""",IF(MID(RC[1],14,1)="" "","""",""x"")),""""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _

221
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 2),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete
'xxxxxxxxxxxxxxxxxxxxxxx
'Este bloque fue complicado ya que los numeros de
tercero se mezclan con las cuentas, asi que se debió separar _
cosa por cosa:
'Separamos la clase de la cuenta:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[1],2,12)=""
"",MID(RC[1],14,1)<>"""",ISNUMBER(VALUE(LEFT(RC[1],1)))),IFERROR(V
LOOKUP(MID(RC[1],14,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R27C2,2,0),"
"""),"""")"
'"=IF(AND(MID(RC[1],2,12)=""
"",MID(RC[1],14,1)<>"""",ISNUMBER(VALUE(LEFT(RC[1],1)))),IFERROR(V
LOOKUP(MID(RC[1],14,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R27C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 2),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
'Una vez señaladas las cuentas, se toma la accion:
Range("C1").End(xlDown).Offset(1, 0).Select 'No se
puede unir pues necesito posicionarme en ese punto
Selection.EntireRow.Delete
Range(Selection, Selection.End(xlDown).Offset(1,
0)).Select 'No se.. me gusta aproximacion por abajo...
Selection.Cut
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)

222
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Separamos el grupo de la cuenta:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],3,12)=""
"",MID(RC[2],15,1)<>"""",ISNUMBER(VALUE(LEFT(RC[2],2)))),IFERROR(V
LOOKUP(MID(RC[2],15,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R27C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("D1"), Range("D1").End(xlDown)).Cut
Range("C1").Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Separamos el subgrupo:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],5,11)=""
"",MID(RC[2],16,1)<>"""",ISNUMBER(VALUE(LEFT(RC[2],4)))),IFERROR(V
LOOKUP(MID(RC[2],16,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R27C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

223
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
'Ya está la a, no hubo necesidad de eliminarla, la reusamos.
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("D1"), Range("D1").End(xlDown)).Cut
Range("C1").Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Separamos la cuenta:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],7,10)=""
"",MID(RC[2],17,1)<>"""",ISNUMBER(VALUE(LEFT(RC[2],6)))),IFERROR(V
LOOKUP(MID(RC[2],17,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R36C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a" Ya
está la a.
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("D1"), Range("D1").End(xlDown)).Cut
Range("C1").Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

224
'Separamos la cuenta auxiliar:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],9,9)=""
"",MID(RC[2],18,1)<>"""",ISNUMBER(VALUE(LEFT(RC[2],8)))),IFERROR(V
LOOKUP(MID(RC[2],18,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R36C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
Range(Range("D1"), Range("D1").End(xlDown)).Cut
Range("C1").Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Encontrar cuentas auxiliares que tienen un


parámetro mas corto:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],9,8)=""
"",MID(RC[2],17,1)<>"""",ISNUMBER(VALUE(LEFT(RC[2],8)))),IFERROR(V
LOOKUP(MID(RC[2],17,1),[MacroUFCG1033.xlsm]Hoja3!R1C1:R36C2,2,0),"
"""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlNo, OrderCustom:=1, MatchCase:= _

225
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal
If Range("B1") = "a" Then GoTo Salto
Range(Range("D1"), Range("D1").End(xlDown)).Cut
Range("C1").Select
ActiveSheet.Paste
Salto:
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Sigue Separar los terceros:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(MID(RC[2],20,1)=""
"",MID(RC[2],21,1)<>""""),IF(LEFT(RC[2],1)=""
"","""",""x""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 3),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

Range("D1").End(xlDown).Offset(1, 0).Select 'No se


puede unir pues necesito posicionarme en ese punto
Selection.EntireRow.Delete
Range(Selection,
Range("A1048576").End(xlUp).Offset(0, 3)).Select 'No se.. me gusta
aproximacion por abajo...
Selection.Cut
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 4),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

226
'Primera linea de detalle:
'Sigue Separar la linea de detalle:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(LEFT(RC[3],25)=""
"",IF(LEFT(RC[3],26)=""
"","""",""x""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 4),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

Range(Range("E1"), Range("E1").End(xlDown)).Select
'No se puede unir pues necesito posicionarme en ese punto
Selection.Cut
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 5),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range("F1").Delete
'Ahora dado que se alineó el detalle, nos quedan
filas en blanco. Vamos a eliminarlas _
para continuar reduciendo el tamaño del archivo
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(AND(ISBLANK(RC[1]),ISBLANK(RC[2]),ISBLANK(RC[3]),ISBLANK(RC[4
])),""x"","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

227
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 5),
Cells(1)).Sort Key1:=Range("B1"), Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete

'Sigue Separar Segunda Linea de Detalle


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(LEFT(RC[3],11)=""
"",IF(LEFT(RC[3],12)="" "","""",""x""),"""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 5),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

Range(Range("E1"), Range("E1").End(xlDown)).Select
'No se puede unir pues necesito posicionarme en ese punto
Selection.Cut
ActiveCell.Offset(0, 2).Select
ActiveSheet.Paste
'Se ordena nuevamente por el numero serial:(el
rango se amplía una columna mas)
Range(Range("A1048576").End(xlUp).Offset(1, 6),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range("G1").Delete
'Ahora dado que se alineó el detalle, nos quedan
filas en blanco. Vamos a eliminarlas _
para continuar reduciendo el tamaño del archivo
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(AND(ISBLANK(RC[1]),ISBLANK(RC[2]),ISBLANK(RC[3]),ISBLANK(RC[4
])),""x"","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy

228
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 6),
Cells(1)).Sort Key1:=Range("B1"), Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete

'SIGUE SACAR LOS SALDOS INICIALES A UN LADO.


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(AND(LEN(TRIM(LEFT(RC[3],114)))=0,MID(RC[3],133,1)="".""),""x"
","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 6),
Cells(1)).Sort _
Key1:=Range("B1"), Order1:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal

Columns("E:E").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("F1").Select
Range(Range("F1"),
Range("F1").End(xlDown)).Cut
Range("E1").Select
ActiveSheet.Paste

Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

' Eliminar lineas EURO, DOLAR Y MONEDA


'
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

229
"=IF(OR(LEFT(TRIM(RC[4]),5)=""DOLAR"",LEFT(TRIM(RC[4]),5)=""EUROS"
",LEFT(TRIM(RC[4]),6)=""MONEDA""),""x"","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
If Range("B1") = "a" Then GoTo Salto2
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete
Salto2:
Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Sacar las lineas sin movimiento y rescatar el


saldo inicial de las mismas, eliminar las _
lineas duplicadas

'Sigue hacer una copia de cuentas y terceros con


For Next (el archivo es muy grande para hacerlo con rellenar
celdas)
'Definimos la ultima fila como variable:
Finish = Cells(Application.Rows.Count,
1).End(xlUp).Row
'Copiamos las cuentas:
For ThisRow = 2 To Finish Step 1
If Cells(ThisRow, 3) = "" Then
Cells(ThisRow, 3).FillDown
End If
Next ThisRow
'Copiamos los Nits:

Start = Range("D1").End(xlDown).Row
'Copiamos los Nits:
For ThisRow = Start To Finish Step 1
If Cells(ThisRow, 4) = "" Then
Cells(ThisRow, 4).FillDown
End If

230
Next ThisRow

'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'Sigue copiar las cuentas a una hoja anexa
Range(Range("C1"), Range("C1").End(xlDown)).Copy
Sheets.Add
ActiveSheet.Name = "Cuentas"
ActiveSheet.Paste
Application.CutCopyMode = False
Fin = Cells(Application.Rows.Count,
1).End(xlUp).Row
ActiveSheet.Range("A1:A" & Fin &
"").RemoveDuplicates Columns:=1, Header:= _
xlNo

ultimafila = Range("A1048576").End(xlUp).Row
Columns("A:A").Insert
Range("A1") = 1
Range("A2") = 2
Range("A1:A2").AutoFill
Destination:=Range("A1:A" & ultimafila & ""), Type:=xlFillDefault

'Inserto una columna para ordenar las filas


Columns("B:B").Insert

'Separamos el codigo de la cuenta:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=TRIM(LEFT(RC[1],FIND("" "",RC[1])))"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

'Separamos el nombre de la cuenta:


Columns("C:C").Insert Shift:=xlToRight
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).FormulaR1C1 = _
"=TRIM(MID(RC[1],FIND("" "",RC[1]),200))"
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).Copy
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False

231
Application.CutCopyMode = False

Columns("D:D").Delete Shift:=xlToLeft 'Elimino


la columna que contenia codigo y nombre de la cuenta
'Organizamos el nombre:
Range(Range("D1"),
Range("A1048576").End(xlUp).Offset(0, 3)).FormulaR1C1 = _
"=LEFT(RC[-1],1)&LOWER(MID(RC[-1],2,100))"
Range(Range("D1"),
Range("A1048576").End(xlUp).Offset(0, 3)).Copy
Range(Range("D1"),
Range("A1048576").End(xlUp).Offset(0, 3)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range(Range("D1"),
Range("A1048576").End(xlUp).Offset(0, 3)).Cut
Range("C1").Select
ActiveSheet.Paste

Columns("A:C").EntireColumn.AutoFit
Range("A1").Select

'Retornamos a la hoja principal:


Worksheets(2).Select

'Sigue Eliminar filas en blanco:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=IF(AND(RC[3]="""",RC[4]=""""),""x"","""")"

'"=IF(AND(ISBLANK(RC[3]),ISBLANK(RC[4])),""x"","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
If Range("B2") = "a" Then GoTo Salto3
Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete
Salto3:

232
Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Trasladamos las lineas transaccionales:


Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _

"=IF(AND(MID(RC[4],5,1)=""/"",MID(RC[4],8,1)=""/""),""x"","""")"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 7),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range(Range("F1"), Range("F1").End(xlDown)).Cut
Range("I1").Select
ActiveSheet.Paste

Range(Range("A1048576").End(xlUp).Offset(1, 8),
Cells(1)).Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Dividimos columna principal y reacomodamos


columnas
'Columns("F:F").Delete Shift:=xlToLeft
Columns("I:I").Select
Selection.TextToColumns
Destination:=Range("I1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 5), Array(10,
2), Array(14, 9), Array(15, 1), Array(25, 1), _
Array(63, 1), Array(72, 1), Array(93, 1),
Array(114, 1), Array(135, 1)), _
DecimalSeparator:=".",
ThousandsSeparator:=",", TrailingMinusNumbers:= _
True
Columns("I:P").EntireColumn.AutoFit
Columns("G:H").Select
Selection.Cut
Columns("M:M").Select
Selection.Insert Shift:=xlToRight

233
Columns("E:E").Select
Selection.Cut
Columns("N:N").Select
Selection.Insert Shift:=xlToRight

'Separamos el CR del campo del saldo inicial:


Columns("N:N").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Columns("M:M").Select
Selection.TextToColumns
Destination:=Range("M1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(135,
1)), DecimalSeparator:=".", _
ThousandsSeparator:=",",
TrailingMinusNumbers:=True
Columns("M:N").EntireColumn.AutoFit

'Doceava depuración: Separamos el codigo de la


cuenta:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=TRIM(LEFT(RC[1],FIND("" "",RC[1])))"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

'Treceava depuración. Separamos el nombre de la


cuenta:
Columns("C:C").Insert Shift:=xlToRight
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).FormulaR1C1 = _
"=TRIM(MID(RC[1],FIND("" "",RC[1]),200))"
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).Copy
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Columns("D:D").Delete Shift:=xlToLeft 'Elimino la


columna que contenia codigo y nombre de la cuenta

'Organizamos Nit y tercero:


Columns("B:B").Insert

234
'Doceava depuración: Separamos el NIT:
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).FormulaR1C1 = _
"=TRIM(LEFT(RC[3],FIND("" "",RC[3])))"
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1048576").End(xlUp).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

'Treceava depuración. Separamos el nombre del


TERCERO:
Columns("C:C").Insert Shift:=xlToRight
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).FormulaR1C1 = _
"=TRIM(MID(RC[3],FIND("" "",RC[3]),200))"
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).Copy
Range(Range("C1"),
Range("A1048576").End(xlUp).Offset(0, 2)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Columns("F:F").Delete Shift:=xlToLeft 'Elimino la


columna que contenia codigo y nombre de la cuenta

Columns("B:C").Select
Selection.Cut
Columns("F:F").Select
Selection.Insert Shift:=xlToRight
'Recuperar los saldos iniciales de lo que no tiene
movimiento:
Columns("B:B").Insert
'
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(MID(RC[5],18,14)=""SIN
MOVIMIENTO"",""x"","""")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Range("B1048576").End(xlUp).Offset(1, 0) = "a"

235
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
'Encontrar las lineas consecutivas duplicadas y
eliminarlas:
'Las lineas duplicadas se deben a que la impresora
de punto repasa una segunda vez.
'Por regla general son consecutivas.

Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(+R[1]C[-1]-RC[-1]=1,""x"","""")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Range(Range("A1").End(xlDown).Offset(1, 20),
Cells(1)).Select
Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

Range(Range("A1"),
Range("A1").End(xlDown).Offset(1, 0)).EntireRow.Delete

'De nuevo señalo las filas "Sin movimiento":


Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(MID(RC[5],18,14)=""SIN
MOVIMIENTO"",""x"","""")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

236
Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

'Tomo las celdas sin movimiento y les rescato el


saldo inicial:
Range("G1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns
Destination:=Range("G1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(34,
1), Array(71, 1), Array(73, 9)), _
TrailingMinusNumbers:=True
Range("H1").Select
Range(Selection,
Selection.End(xlDown).Offset(0, 1)).Select
Selection.Cut
Range("O1").Select
ActiveSheet.Paste
Range("G1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Cut
Range("K1").Select
ActiveSheet.Paste

'Volvemos a ordenar:
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("A1"),
Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
'Fin de recuperar los saldos iniciales sin
movimiento.

'Organizamos los valores de los saldos iniciales


Columns("O:O").Select
Selection.Replace What:=",", Replacement:="",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False,
SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=".", Replacement:=",",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False,
SearchFormat:=False, _
ReplaceFormat:=False
Selection.Style = "Comma"

237
'Separo las lineas que tienen saldo inicial:
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(ISBLANK(RC[13]),"""",""x"")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

Range(Range("U1"),
Range("A1").End(xlDown).Offset(0, 20)).FormulaR1C1 = _
"=IF(RC[-5]=""CR"",-VALUE(RC[-6]),VALUE(RC[-
6]))"
Range(Range("U1"),
Range("A1").End(xlDown).Offset(0, 20)).Copy
Range(Range("U1"),
Range("A1").End(xlDown).Offset(0, 20)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Selection.Style = "Comma"
'Eliminamos las columnas de saldo inicial viejas
Columns("O:P").Select
Selection.Delete Shift:=xlToLeft
'Seleccionamos y trasladamos la columna de valor
corregida:
Columns("S:S").Select
Selection.Cut
Columns("O:O").Select
Selection.Insert Shift:=xlToRight
'Volvemos a ordenar:
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("A1"),
Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

238
'Recuperamos el valor del saldo Final:
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).FormulaR1C1 = _
"=IF(ISBLANK(RC[16]),"""",""x"")"
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).Copy
Range(Range("B1"),
Range("A1").End(xlDown).Offset(0, 1)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

'Range("B1048576").End(xlUp).Offset(1, 0) = "a"
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("B1"),
Order1:=xlDescending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

Range(Range("T1"),
Range("A1").End(xlDown).Offset(0, 19)).FormulaR1C1 = _
"=IF(RC[-1]=""CR"",-VALUE(RC[-2]),VALUE(RC[-
2]))"
Range(Range("T1"),
Range("A1").End(xlDown).Offset(0, 19)).Copy
Range(Range("T1"),
Range("A1").End(xlDown).Offset(0, 19)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False

Selection.Style = "Comma"
'Eliminamos las columnas de saldo inicial viejas
Columns("R:S").Select
Selection.Delete Shift:=xlToLeft
'Seleccionamos y trasladamos la columna de valor
corregida:

'Volvemos a ordenar:
Range(Range("A1048576").End(xlUp).Offset(1, 20),
Cells(1)).Select

Selection.Sort Key1:=Range("A1"),
Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

239
'Colocamos una columna que nos dé el movimiento
neto:
Range(Range("S1"),
Range("A1048576").End(xlUp).Offset(0, 18)).FormulaR1C1 = _
"=+RC[-3]-RC[-2]"
Range(Range("S1"),
Range("A1048576").End(xlUp).Offset(0, 18)).Copy
Range(Range("S1"),
Range("A1048576").End(xlUp).Offset(0, 18)).PasteSpecial
Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False,
Transpose:=False
Application.CutCopyMode = False
Selection.Style = "Comma"

'Dieciochoava depuración. Colocamos títulos.

Columns("B:B").Delete Shift:=xlToLeft
Columns("F:F").Delete Shift:=xlToLeft
Rows("1:1").Insert Shift:=xlDown
Range("A1").Resize(, 17) = Array(1, "Cuenta",
"Nombre de la cuenta", "Nit", "Nombre del tercero", "Fecha", "CC",
"Documento", "Primera línea de detalle", "Segunda línea de
detalle", "Tercera Linea de detalle", "Referencia", "Saldo
Inicial", "Debito", "Credito", "Saldo Acumulado", "Movimiento
Neto")
Columns("A:Q").EntireColumn.AutoFit

'Colocar clase,grupo y subgrupo:


Columns("B:G").Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("B1").Resize(, 6) = Array("Clase", "Nombre
de la clase", "Grupo", "Nombre del grupo", "Subgrupo", "Nombre del
Subgrupo")
'Cuadrar las formulas:
Range("B2").FormulaR1C1 = "=LEFT(RC[6],1)"
Range("C2").FormulaR1C1 = _
"=INDEX(Cuentas!C2:C3,MATCH(RC[-
1],Cuentas!C2,0),2)"
Range("D2").FormulaR1C1 = "=LEFT(RC[4],2)"
Range("E2").FormulaR1C1 = _
"=INDEX(Cuentas!C2:C3,MATCH(RC[-
1],Cuentas!C2,0),2)"
Range("F2").FormulaR1C1 = "=LEFT(RC[2],4)"
Range("G2").FormulaR1C1 = _
"=INDEX(Cuentas!C2:C3,MATCH(RC[-
1],Cuentas!C2,0),2)"
Range("B2:G2").Select
Range("B2:G2").Copy
Range(Range("A1").End(xlDown).Offset(0, 1),
Selection.End(xlUp)).Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False

240
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False

'Eliminamos la fila despues de la ultima fila:


Range("A1048576").End(xlUp).Offset(1,
0).EntireRow.Delete
Range("A1").Select

ActiveWorkbook.Save

MsgBox "A las " & Time & " la macro ha finalizado
con éxito." _

End Sub

241
242
Macro que depura el libro Inventario y

Balances del software contable Activo

Megasistemas

243
Sub Macro1()
'
' Macro1 Macro
'
Application.ScreenUpdating = False
'Sheets("INVENTARIOS Y BALANCES CIERRE S").Select
'Sheets("INVENTARIOS Y BALANCES CIERRE S").Copy
Before:=Sheets(1)

'Sheets("INVENTARIOS Y BALANCES CIER (2").Select


'Sheets("INVENTARIOS Y BALANCES CIER (2").Name = "BaseDatos"

Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "BaseDatos"
'End Sub
'Sub Macro5()
'
' Macro5 Macro
'

'
ActiveCell.SpecialCells(xlLastCell).Select
Range(Selection, Cells(1)).Select
'With Selection
'.WrapText = False
'End With
Selection.UnMerge
'End Sub

'Sub Macro2()
'
' Macro2 Macro
'

'
'Range("A1048576").Select
'Selection.End(xlUp).Select
'RePasar la variable ultima Donde se verifica si es negrita:
ultima =
Worksheets("BaseDatos").Range("A1048576").End(xlUp).Row

'End Sub
'Sub Macro6()
'
' Macro6 Macro
'

'
Rows("1:3").Select
Selection.Delete Shift:=xlUp
'End Sub
'Sub Macro7()

244
'
' Macro7 Macro
'Eliminamos vacías

'
Columns("A:C").AutoFilter
ActiveSheet.Range("$A$1:$C$" & ultima & "").AutoFilter
Field:=1, Criteria1:="="
Rows("2:2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter
'End Sub
'Sub Macro9()
'
' Macro9 Macro
'

'Eliminamos filas que comienzan por TOTAL:


Columns("A:C").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$C$" & ultima & "").AutoFilter
Field:=1, Criteria1:="=TOTAL*" _
, Operator:=xlAnd
Rows("2:2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter
'End Sub

Range("D1") = "Criterio"
'End Sub
'Sub EsNegrita()
ultima = Worksheets("BaseDatos").Range("A1048576").End(xlUp).Row
'OJO: Marcamos, no eliminamos porque necesitamos llevarnos las
cuentas para una hoja anexa
Range("C2").Select
Do Until ActiveCell.Row = ultima
If ActiveCell.Font.Bold = True Then
ActiveCell.Offset(0, 1) = "x"
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
'End Sub
'Sub Macro2()
'
' Macro2 Macro
'Eliminamos ultima fila:

'

245
Range("A1048576").End(xlUp).Select
If ActiveCell = "DIFERENCIA --->" Then
Selection.EntireRow.Delete
End If

'End Sub
'Sub Macro3()
'
' Macro3 Macro
'

'Montamos letra "a" para Ordenar lo que tiene negrita de lo que


no, separar el bloque de "x" para poderlo eliminar muy
rapidamente:
Range("C1048576").End(xlUp).Offset(1, 1) = "a"
'End Sub
'Sub Macro4()
'
' Macro4 Macro
'Borramos filas con Negrita
'Ojo, UltimaFila va por la columna D, para que tome la fila con la
"a"
ultima = Worksheets("BaseDatos").Range("D1048576").End(xlUp).Row
'
Columns("A:D").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"D2:D" & ultima & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:D" & ultima & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
Selection.End(xlDown).Offset(1, 3).Select
Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select
Selection.EntireRow.Delete
'End Sub
'Sub Macro3()
'
' Macro3 Macro
'Eliminamos la palabra criterio de la celda D1:

'
Range("D1").Select
Selection.ClearContents
'End Sub

246
'Sub Macro2()
'
' Macro2 Macro
'

'Insertamos Columna para detectar las negritas, las negritas son


las cuentas que necesitamos desplazar
'a la izquierda, en una nueva columna:
Columns("A:A").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
ActiveCell.FormulaR1C1 = "Criterio"

'End Sub
'Sub CuentasEnNegrita()
ultima = Worksheets("BaseDatos").Range("B1048576").End(xlUp).Row
'OJO: Marcamos, no eliminamos porque necesitamos desplazar las
cuentas a una columna aparte
'Hacemos un movimiento masivo de datos
Range("A2").Select
Do Until ActiveCell.Row = ultima
If ActiveCell.Offset(0, 1).Font.Bold = True Then
ActiveCell = "x"
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop

'Montamos letra "a" para Ordenar Arriba lo que tiene negrita de lo


que no, separar el bloque de "x" para poderlo eliminar muy
rapidamente:
Range("B1048576").End(xlUp).Offset(1, -1) = "a"
'redefinimos de nuevo la ultimafila, ya que aumentó por la letra
"a"
ultima = Worksheets("BaseDatos").Range("A1048576").End(xlUp).Row
'Antes de reubicar las cuentas, procedemos a colocar un numero
serial

'End Sub
'Sub Macro5()
'
' Macro5 Macro
'

'
Columns("A:A").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
ActiveCell.FormulaR1C1 = "Serial"

247
Range("A2").Select
ActiveCell.FormulaR1C1 = "1"
Range("A3").Select
ActiveCell.FormulaR1C1 = "2"
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A" & ultima & "")

Application.ScreenUpdating = True

'End Sub
'Sub Macro7()
'
' Macro7 Macro
'

'Insertamos dos columnas para mover los nits y los nombres de los
nits a sus nuevos destinos:
Columns("E:F").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove

'Ordenamos las cuentas en la parte superior para moverlas


MASIVAMENTE:

Columns("A:G").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B2:B" & ultima & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:G" & ultima & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

'Esta operacion que acabamos de hacer, de mover los campos de las


cuentas
'en la parte superior le aumenta muchisimo la velocidad de
ejecución a la macro,
'diferente de mover fila por fila.

'End Sub
'Sub Macro8()
'
' Macro8 Macro
'Movemos los nits y los nombres de nits:
ultima = Worksheets("BaseDatos").Range("A1048576").End(xlUp).Row
'

248
Range("B1").Select
Selection.End(xlDown).Select
Selection.EntireRow.Delete
primera = ActiveCell.Row
'Range("C227").Select
Range("C" & primera & ":D" & ultima & "").Select
Selection.Cut
ActiveCell.Offset(0, 2).Select
'Range("E227").Select
ActiveSheet.Paste
'End Sub
'Sub Macro9()
'
' Macro9 Macro
'

'Ordenamos por el serial para ordenar todo nuevamente:


Columns("A:G").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"A2:A1" & ultima & ""), SortOn:=xlSortOnValues,
Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:G" & ultima & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'End Sub
'Sub Macro11()
'
' Macro11 Macro
'

'Rellenamos Filas en blanco con las cuentas:


Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 3).Select
'Range("D1417").Select
Range(Selection, Cells(1, 3)).Select
'Range("C1:D1417").Select
'Range("D1417").Activate
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=+R[-1]C"
Columns("C:D").Select
'Range("C8").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _

249
:=False, Transpose:=False
Application.CutCopyMode = False
'End Sub

'Sub Macro2()
'
' Macro2 Macro
'
'En B2: =SI(Y(D2=D3;ESBLANCO(F2));"x";"")
'Insertamos una columna para señalar esas filas que tienen cuentas
con detalle de Nits _
pero que están vacías:
Columns("B:B").Select
Selection.Insert Shift:=xlToRight,
CopyOrigin:=xlFormatFromLeftOrAbove
'Incluimos su rotulo:
Range("B1").Select
ActiveCell.FormulaR1C1 = "Borrar"
'Incluimos la formula Si:
Range("B2").Select
ActiveCell.FormulaR1C1 =
"=IF(AND(RC[2]=R[1]C[2],ISBLANK(RC[4])),""x"","""")"
Selection.AutoFill Destination:=Range("B2:B" & ultima & "")
Range("B2:B" & ultima & "").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'End Sub

'Sub Macro4()
'
' Macro4 Macro
'

'
Range("B1").Select
Selection.End(xlDown).Select
ActiveCell.FormulaR1C1 = "a"
Columns("A:H").Select
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BaseDatos").Sort.SortFields.Add
Key:=Range( _
"B2:B" & ultima & ""), SortOn:=xlSortOnValues,
Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("BaseDatos").Sort
.SetRange Range("A1:H" & ultima & "")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin

250
.Apply
End With
'End Sub
'Sub Macro5()
'
' Macro5 Macro
'

'
'Range("A2").Select
'Range(Selection, Selection.End(xlDown)).Select
'Selection.EntireRow.Delete
'en la clase 3 vimos como es que resumimos estas 3 lineas en esta:
Range(Range("A2"), Selection.End(xlDown).Offset(1,
0)).EntireRow.Delete

'End Sub
'Sub Macro6()
'
' Macro6 Macro
'Redefinimos de nuevo la variable ultima, pues hemos eliminado
filas demás:
ultima = Worksheets("BaseDatos").Range("A1048576").End(xlUp).Row
'Eliminamos columnas de Serial y Criterio
Columns("B:C").Select
Selection.Delete Shift:=xlToLeft
'Organizamos el formato de las celdas copiadas:
Range("B2:C2").Select
Selection.Copy
Range("B3:C" & ultima & "").Select
Selection.PasteSpecial Paste:=xlPasteFormats,
Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
'End Sub
'Sub Macro7()
'
' Macro7 Macro
'

'
'Range("B1").Select
'ActiveCell.FormulaR1C1 = "CUENTA"
'Range("C1").Select
'ActiveCell.FormulaR1C1 = "NOMBRE DE LA CUENTA"
'Range("D1").Select
'ActiveCell.FormulaR1C1 = "NIT"
'Range("E1").Select
'ActiveCell.FormulaR1C1 = "NOMBRE DEL TERCERO"

Range("B1").Resize(, 5) = Array("CUENTA", "NOMBRE DE LA


CUENTA", "NIT", "NOMBRE DEL TERCERO", "SALDO FINAL")

251
Columns("A:F").Select
Columns("A:F").EntireColumn.AutoFit
Range("A1").Select
End Sub

252
Apendice 1
Destruye el romance que tienes con el ratón

En los talleres en vivo, en donde los acompaño "hombro a hombro" les he


insistido en que TIENEN QUE DESTRUIR LA DEPENDENCIA QUE TIENEN
CON EL RATÓN DEL COMPUTADOR. Hay casos en los que incluso el brazo
izquierdo lo han dejado COMPLETAMENTE OCIOSO. El sedentarismo de hacer
el mínimo movimiento, todo lo hacen con la mano derecha mientras el brazo
izquierdo lo dejan descansando la mayoría del tiempo sobre el escritorio o la
pierna. Cuando usan el ratón, este usa el menú de la interfaz gráfica y les obliga
a hacer varios clics antes de ejecutar la acción.

Esto hace quien tiene este “vicio laboral” se vea terriblemente lento. No es por
nada, pero incluso hay falencias en la misma mecanografía. Personas que usan
solo los dedos índices para escribir "Chuzografiar" Personas que para hacer
Control + C, usan ambos dedos índices: el izquierdo y el derecho, cuando
pueden ejecutar el movimiento en una fracción de segundo con la mano
izquierda y los dedos meñique e índice.

Una mano ociosa, y todo un juego de dedos ociosos, te hace ver como un
usuario lento, te perciben lento. Y si eres lento para entrar información en la
computadora, ¿que se pensará del resto de los procesos que llevas a cabo?
¿Incluidos los mentales?

No te hace pensar, ¿por qué hay personas más lentas que otras? porque sus

253
cerebros están RALENTIZADOS? En otras palabras: No has entrenado tu
cerebro para ser más ágil en tus procesos mentales. Hay casos de personas que
nunca pensaron que tendrían que hacer trabajo en la computadora porque para
eso tenían una asistente o un equipo "Task Force" que les hacía todas las cartas.
Pero los tiempos les han cambiado, y ahora ya no tienen personal y ya no se
puede dar esos lujos: Debe usar la computadora por sí mismo y descubre que
es: Lento.

Esto nos lleva a la siguiente idea:

Aléjate de todo aquello que te


hace lento.
El portal Bienestar Salud 180 cita entre otros las siguientes causas que matan
neuronas y por lo tanto te hacen lento (y esto se nota cuando hablas, cuando
escribes, y tus respuestas, que frecuentemente no comprenden la lógica
interpuesta por la persona con quien se conversa):

 No desayunar
 Estrés
 Hipertensión
 No dormir bien
 Fumar
 Comer mucho y muy grasoso.

Yo me permito añadir lo siguiente:


Alcohol - Drogas: Todos sabemos que también matan neuronas de una manera
muy efectiva. Todos sabemos que la Marihuana pacífica. Te hace lento y te ríes
hasta de estupideces. Te convierte en un excelente IDIOTA SOCIAL que no
razona ni reclama pasando a la acción. Por otra parte, aquellos auditores amigos
de sorber por esas ñatas (la nariz) PERICA o COCAINA, matan neuronas en
cantidades industriales. Al otro día es frecuente verlos con el fenómeno de "La
cajeadera" que es un movimiento ridículo que hacen con la quijada, ya que no la
sienten. Tremendos idiotas que hacen quedar mal la firma para la que se
desempeñan, que además tiene un área de recursos humanos que anda
"cazando mariposas" y no se entera de lo que pasa entre sus soldados en el
campo de acción.

La mala música: Parece increíble que con el ritmo logren dominar tus ondas
cerebrales, y no solo eso, al evocar situaciones, te transportan a momentos en
los cuales quedas presente en cuerpo, pero no en alma ni en espíritu, porque te
logran sacar de la dimensión.

254
¿Has visto las tumbadoras en los cultos de avivamiento? esquemas copiados de
los rituales africanos en los cuales se puede, a través de la música llevar al
éxtasis a los participantes y allí, quedan completamente a merced del que lleva
los hilos de la ceremonia. Eso NO es Dios. Es ser un títere o una marioneta de
un vivo que quiere esclavizarte para que trabajes para él.

Si la canción que escuchas, constituye una carga emocional que te saca de la


actividad cognoscente que ejecutas, es decir te saca de foco, apágala o no la
escuches. La carga emocional es un costo que no te puedes dar el lujo de
asumir. Enfócate en lo verdaderamente importante.

Porque permiten la música? Porque no queremos que seas tan efectivo.


Sabemos que puedes ser extraordinario si cultivas tus hábitos mentales, pero si
así fueras, destruirías el esquema organizacional, no tardarías mucho tiempo en
mostrar tan buenos resultados que comenzarías a pedir pista y a revaluar como
actúan tus superiores y jefes, sometiéndolos a la crítica del mejoramiento de
procesos, cosas que no tolerarás, y ellos tampoco, con lo que es cierto que "Los
caballeros las prefieren BRUTAS" Al analizar las cosas y buscar soluciones,
pones en riesgo el modelo de producción y el sistema económico de la
civilización entera. Y eso no es bueno para los que manejan los hilos del poder.

Todo lo que te saca de foco, apágalo. Futbol, televisión, radio, problemas


políticos, etc.

Las noticias: Es la tecnología la que soluciona los problemas, no la política.


Esas discusiones interminables de los procesos de Paz mundial, saberlo no te
sirve de nada, la solución no está a tu alcance, es algo que se escapa de tus
manos. Solo ocupa espacio en tu mente.

Los problemas políticos de la Contaduría: Que los que apoyan a las Big 4, que
los que apoyan la contabilidad social, es la misma figura de la guerra fría llevada
a los escenarios de la contaduría. Mientras tanto, la contaduría sigue siendo
incapaz de funcionar de manera ideal: Porque se ha divorciado de la tecnología.

La contaduría ayuda a una mejor toma de decisiones? tu apoyas a los


propietarios en su toma de decisiones? es decir, con miras hacia el futuro,
presupuestas, proyectas? sabes en donde estarán en los próximos 6 meses o
por lo menos puedes opinar con fundamento en la contabilidad y la economía? o
sigues despotricando contra la administración de impuestos del gobierno de tu
País y las reformas tributarias? Excusas excusas, interminables es que fue-que
que fue-que

Las deudas. Tener deudas es lo peor. Te amarra, te esclaviza y además si no te


organizas "financieramente" como ellos quieren, no tendrás Paz ni calma. No
podrás pensar correctamente en buenas soluciones. ¿Qué es lo que te lleva a
endeudarte? embarcarte en empresas que no puedes asumir (financiar) tu solo:

255
Desde formar una familia, hasta comprar un auto. (ojo con el "amor") Para todo
esto eres bombardeado mediáticamente con publicidad "presta yá", te crean
necesidades donde no las hay: Linea de crédito "La Credi - LIPO", etc. Te
bombardean para que te deshagas el fin de semana de tu dinero en un vive
ahora y muere después. La persona abrumada por las deudas no tarda en
disminuir su rendimiento y no tardarán en detectarlo las evaluaciones de
personal. Y si no levanta cabeza, será rechazado por el clan.

Un cerebro hermoso te da soluciones de vida y crea realidades. Los inventos


cambian a la humanidad. Es tu inventario más valioso. Puedes regenerarlo y
sacar de él, el mejor partido.

Lista de atajos de teclado:

256
257
258
259
260
261
262
263
264
265
266
Referencias bibliográficas
Las técnicas desarrolladas en este libro son fruto de tantos años de
organizar archivos planos que los contadores clientes del profesor
le envían en busca de apoyo y solución.

El reposicionamiento masivo de datos es una técnica que los libros


de macros de Excel, de los principales autores de Excel de Estados
Unidos no mencionan.

Hay un libro y dos Gurús de Excel que merecen ser mencionados


como referencias del autor:

Excel 2007 VBA Programmer's Reference


John Walkenbach
Bill Jelen

267
268
Agradecimientos
Dedico este libro a la madre de la industria, la necesidad.

Quiero que los contadores no estén tan sometidos a la desgracia de


haberse metido en una profesión en la cual pensamos que
tendríamos calidad de vida, pero tristemente nos hemos visto
envueltos en situaciones adversas, tristes y hasta pesarosas.

Son muchos los colegas caídos en combate. Es mi deber armarlos


a todos. (armarlos, de darles ARMAS) Lo triste del caso es que es
difícil sacar al contador del dogma, del ostracismo, del cubículo en
el que paga una condena, de su “zona de confort”, de su realidad.

Romper los paradigmas, hacer que se acerquen, que escuchen, que


levanten su mirada:

Muchos contadores se quejan de que no tienen tiempo, y no tienen


tiempo porque no se capacitan en desarrollar competencias que les
ayuden a eliminar los tiempos de operatividad.

Usted pudiera pensar que al profe le debe de ir bien, considerando


la cantidad de contadores que hay. Pero no es así. Usted es uno de
esos privilegiados que aún no ha alcanzado su nivel de
incompetencia, que pertenece a ese 1% de ELITE que si es capaz de
tener un sentido al extremo tan analítico, que no se ARREDRA para
analizar un código de una macro.

¿Usted puede creer? Le enseñé una macro que hace un formato en


un recorrido Do a mi hijo de 12 años y me dijo que no parecía tan
difícil.

Piénselo. Las cosas no son difíciles. Usted las ha vuelto difíciles.


Siempre tuviste una hoja de cálculo y siempre tuviste las macros.
Desde la época del lotus 123. Si no te enseñaron esto, es porque
alguien muy arriba, le interesa mantener

El ejercito de los contadores sin trabajo.

269
270

Potrebbero piacerti anche