LIBRO Excel Macros para El SuperContadorFinal
LIBRO Excel Macros para El SuperContadorFinal
LIBRO Excel Macros para El SuperContadorFinal
PARA EL SUPERCONTADOR
3
4
Excel Macros para el Súper Contador
Volumen 1
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.
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.
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
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
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
10
Ceder lo que se ha conseguido resulta peligroso
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.
https://www.youtube.com/watch?v=EhDqFTUSfd8
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.
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.
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.
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.
¡Muchos Éxitos!
20
Introducción
Este libro está hecho para los contadores que trabajan en empresas.
No tanto para los contadores que usan Excel para llevar
contabilidad.
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ú.
22
No hay cuña que más apriete que la del mismo palo:
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.
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
27
28
Como se activa el grabador de
macros
Por la ficha desarrollador:
Opciones:
29
Personalizar cinta de opciones:
30
Esta ficha trae varios grupos de comandos.
Controles:
Complementos:
31
Código:
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.
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.
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.
39
40
Grabar Macro
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.
43
Seleccionas el rectángulo redondeado:
44
Todo un “Kit” para hacer unas formas con todos los efectos.
Le sugiero que explore que hace cada botoncito de “esos”.
45
El botoncito lo arrastras a la esquina de la hoja de Excel, para dejarlo
como una especie de barra de herramientas:
46
La palabra INICIO, si lo deseas puedes ir por la ficha INICIO y
escogerle otro color de letra.
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.
48
Bien, entonces:
49
Puede ver que el libro lo grabé temporalmente como “ejemplo nuevo
libro xlsx”, pues en ese momento, solo llevaba el botoncito dibujado.
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.
O por acá:
51
Verá que queda con esas “bolitas”. Haga Clic derecho y mire el menú
emergente:
52
Clic en aceptar.
Observaciones:
1) Las macros comienzan con las palabras clave SUB y finaliza con
End Sub. Así:
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”.
Worksheets(1).Select
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.
55
Sub Macro3HechaPorAlejo()
Worksheets(1).Range("A23").Select
End Sub
Sub Macro3HechaPorAlejoSegundaVersion()
Worksheets(1).Cells(23, 1).Select
End Sub
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!
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.
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.
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”
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.
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.
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.
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
Range(“B6”).Select
En lugar de
ActiveCell.Offset(5, 1).Range("A1").Select
Activecell.offset(0,1).select
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.
64
Macro que nos monta una función
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)
R2C2:R4C2
Esto significa Row =R= Fila. Column = C = Columna
Fila 2 Columna 2 : Fila 4 Columna 2
Es decir:
66
Lo que se requiere es que la macro ajuste el rango de suma ella
sola.
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()
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.
Observaciones:
69
2. En lugar de Range, puede referirse a la última celda de
Excel, la A 1.048.576 usando Cells, asi:
70
Application Rows Count. Que cuente las filas de la
aplicación.
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í:
R4C2
Quedo asi:
72
Mejorada quedaría así:
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)
Application.Workbooks(“Libro1.xlsx”). _
Worksheets(1).Range(“A1”).Value
Workbooks(“Libro1.xlsx”).Worksheets(1).Range(“A1”).Value
Worksheets(1).Range(“A1”).Value
Range(“A1”).Value
74
Contrario a lo que la gente pudiera pensar, no existe el objeto
CELDA.
75
76
Macro para depurar un archivo de
terceros del sistema Helisa DOS
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.
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:
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.
82
Para la primera parte, un ejemplo de dicha macro sería esta:
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.
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.
Application.GetOpenFilename _
("Directorio Terceros (*.txt),*.txt", , "Abra el directorio" & _
" de terceros", , False)
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:
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
Workbooks.Open Filename:=Archivo_PRT
85
86
En la primera instrucción, hacemos que el Archivo PRT sea el archivo
que se abre, asi:
Archivo_PRT = ActiveWorkbook.Name
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
88
Observe el nombre:
Y, si eso llegara a ser así, entonces que cierre el archivo sin guardar
cambios. Y eso se escribe así:
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.
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:
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.
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!
94
¿Y cuáles son las líneas o filas que nos interesan?
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”
96
El programita te queda así:
Perfecto.
97
Detectar si una celda cumple o no una condición
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:
99
Ok. Ahora vamos a unir todas las instrucciones en una sola, usando
la instrucción O:
100
Bien, dentro del Do Until y el Loop, va el Activecell.Offset:
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.
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
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")
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
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:
106
Ten cuidado, el nit que tiene un guión de separación, debes dejarlo
como tipo texto:
107
Al finalizar, justificar la columna:
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í.
109
Se puede resumir o simplificar así: (lo que hago es editar el texto,
selecciono un segmento y borro o completo):
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
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
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.
EstaFila = 2
114
Eliminar la basura con Filtros
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.
116
Simplemente prendemos el grabador de macros, seleccionamos la
columna A, vamos por Datos – Filtro:
117
Desactivas el filtro:
118
Haces con el teclado: Shift + Fin + Flecha abajo: para marcar todo el
rango:
119
Le das clic a eliminar fila, y detienes la macro. Estas acciones causan
el siguiente código:
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:
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.
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.
123
124
Eliminar la basura con fórmulas y la
herramienta Ordenar
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.
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.
126
Una mirada más cercana a las líneas transaccionales nos revela que
estas comienzan con cierta cantidad fija de espacios en blanco:
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.
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:
129
Con esta información, procedo a montar la función extrae en la
columna B, misma fila:
=EXTRAE(A61;6;18)
Perfecto.
Ahora, para hacer que Excel nos ponga allí una x, simplemente es
montar esta prueba lógica dentro de un Si:
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";"")
131
132
Grabar una formula con una MACRO
Bien, esta parte nos servirá para ilustrar la manera que tengo para
grabar funciones.
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.
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:
135
Macro de una fórmula que se copia a todo lo largo
de un rango. Método 2
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.
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:
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í:
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.
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.
142
El resultado es el siguiente:
143
A veces lo viejo era más sencillo.
144
Columns("A:B").Sort Key1:=Range("B1"), Order1:=xlDescending
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?
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?
146
Este es el resultado:
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:
149
Unidas las tres instrucciones, la macro queda así:
150
Macro que depura el balance de
comprobación UFCG0141 del sistema
CG1 8.5
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: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"")"
'
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
u = Range("A1048576").End(xlUp).Row
'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(RC[5]&RC[7]&RC[8]&RC[9]="""",""x"","""")"
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
Worksheets(1).Copy Before:=Sheets(1)
Worksheets(1).Name = "DatosBase"
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
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
158
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
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
'
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
Range("A1").End(xlDown).Offset(0, 3).Select
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.
u = Range("A1048576").End(xlUp).Row
Worksheets("DatosBase").Select
'
Range(Range("B1"), Range("A1").End(xlDown).Offset(0, 1)) = _
"=IF(RC[5]&RC[7]&RC[8]&RC[9]="""",""x"","""")"
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
160
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Las columnas viejas que guardaban los valores viejos, las eliminamos
y justificamos desde la G a la J.
'
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"
'Range("G1") = "Debito"
'Range("H1") = "Credito"
'Range("I1") = "Saldo final"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Range("A1").Select
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.
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
164
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").EntireColumn.AutoFit
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]"
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"
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
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
Columns("C:C").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("C:C").EntireColumn.AutoFit
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
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
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
170
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").Select
Selection.Replace What:=")", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("E:E").EntireColumn.AutoFit
Columns("A:K").Select
Columns("A:K").EntireColumn.AutoFit
Range("A1").Select
Range("A1").Resize(, 11) = Array("1", "Cuenta Auxiliar", "Nombre de la cuenta", "Tercero", "Nit", "Fecha",
"Documento", "Detalle", "Debito", "Credito", "Valor neto")
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
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
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
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
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: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
u = Range("A1048576").End(xlUp).Row
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
'
Columns("B:B").Select
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
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
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"
'
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
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.
'
Columns("B:B").Select
Selection.Copy
182
Columns("K:K").Select
Selection.Insert Shift:=xlToRight
Range("K1") = "Saldo inicial"
'
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
'
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
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.
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.
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
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
'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
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")
'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
'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
"=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
"=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
'#################################################################
########################
'#################################################################
########################
'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
'#################################################################
###
'#################################################################
###
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
'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
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
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
ActiveWorkbook.Save
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
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
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
"=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
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 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
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
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
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
"=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
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
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
231
Application.CutCopyMode = False
Columns("A:C").EntireColumn.AutoFit
Range("A1").Select
'"=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
"=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
233
Columns("E:E").Select
Selection.Cut
Columns("N:N").Select
Selection.Insert Shift:=xlToRight
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
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
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
'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.
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"
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
240
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWorkbook.Save
MsgBox "A las " & Time & " la macro ha finalizado
con éxito." _
End Sub
241
242
Macro que depura el libro Inventario y
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)
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
'
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
'
'
Range("D1").Select
Selection.ClearContents
'End Sub
246
'Sub Macro2()
'
' Macro2 Macro
'
'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
'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
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
'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
'
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"
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
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.
No desayunar
Estrés
Hipertensión
No dormir bien
Fumar
Comer mucho y muy grasoso.
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.
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.
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.
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.
267
268
Agradecimientos
Dedico este libro a la madre de la industria, la necesidad.
269
270