Más de Macros

Hola Cesar, cordial saludo,
De nuevo soy yo para molestarte por una ayudita con esta benditas macros.
Te cuento que en la macro que te anexo no me está funcionando en su totalidad por eso recurro a ti con dos preguntas al respecto, en donde comedidamente solicito tu colaboración.
1) Cuando se define un condicionante, él puede encontrar verdadero en la primera búsqueda y seguir la instrucción en caso de que así sea, pero si es falso, el condicionante debe dejar una instrucción para que continúe el condicionante explorando la siguiente instrucción. En este caso el condicionante quiere que cuando el valor de Celda sea "Cali" vaya a los libros relacionados dos columnas a la derecha y llame el archivo excel ahí relacionado y ejecute la operación de copiar los rangos "Ingresos" y "Costos" con destino al libro de "presupuesto 2003.xls"; pero si el valor de Celda no es Cali debe valorar si la celda es igual a "Medellín"y ejecutar la misma macro de copiar los libros que cumplan con esa condición. (En este caso tanto los libros origen de donde va a copiar la información, como el libro destino ya están abiertos).
Como podrás observar la macro que te mando anexa no tiene el código escrito así porque al dejar un segundo "if" dentro del primero me reporta un error que dice "Loop no puede ejecutarse sin un inicial de Do", y la verdad está relacionado "Do While y ... Loop"; por esa razón recurrí a correr por separado la Búsqueda de la primera ciudad y luego la búsqueda de la segunda, sin embargo el problema continúa.
2) Al correr esta macro me encuentro que el contador se enloquece y a pesar de tener la condición de parar cuando el contador sea igual a numero de clientes, no la ejecuta. Creo que es porque el condicionante "If"; toda vez que la macro obliga al desplazamiento de celda que esta parada en la columna de "ciudad" se desplace con la instrucción "(Activecell.value)" dos columna a la derecha para llamar al archivo cuando el "if" es verdadero.
Confiando en tu ayuda,
Atentamente
Ricardo bolaños
Anexo Macro en desarrollo
Sub Macro7_CONSOLIDA_PyG_POR_CIUDAD()
'
' Macro3 Macro
' Macro grabada el 06/04/2003 por Ricardo A. Bolaños
' Actualiza la Información consolidada por Negocio y por Ciudad
'
'
' Acceso directo: CTRL g
'
Windows("Presupuesto 2003.xls").Activate
Application.Goto Reference:="IngCiudad_1,CostCiudad_1,IngCiudad_2,CostCiudad_2"
Selection.ClearContents
Windows("MAINMENU II.xls").Activate
Application.Goto Reference:="HOME1"
Application.Goto Reference:="CIUDAD"
contador = 0
ActiveCell.Offset(0, 0).Select
Do While contador < range("NClientes").Value
ActiveCell.Offset(1, 0).Select
If (ActiveCell.Value) = "CALI" Then
ActiveCell.Offset(0, 2).Select
Windows(ActiveCell.Value).Activate
Application.Goto Reference:="Ingresos"
Selection.Copy
Windows("Presupuesto 2003.xls").Activate
Application.Goto Reference:=range("IngCiudad_1")
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
Windows("MAINMENU II.xls").Activate
Windows(ActiveCell.Value).Activate
Application.Goto Reference:="Costos"
Selection.Copy
Windows("Presupuesto 2003.xls").Activate
Application.Goto Reference:=range("CostCiudad_1")
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
Windows("MAINMENU II.xls").Activate
ActiveCell.Offset(0, -2).Select
End If
ActiveCell.Offset(contador + 1, 0).Select
Loop
Do While contador < range("NClientes").Value
ActiveCell.Offset(1, 0).Select
If (ActiveCell.Value) = "MEDELLIN" Then
ActiveCell.Offset(0, 2).Select
Windows(ActiveCell.Value).Activate
Application.Goto Reference:="Ingresos"
Selection.Copy
Windows("Presupuesto 2003.xls").Activate
Application.Goto Reference:=range("IngCiudad_2")
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
Windows("MAINMENU II.xls").Activate
Windows(ActiveCell.Value).Activate
Application.Goto Reference:="Costos"
Selection.Copy
Windows("Presupuesto 2003.xls").Activate
Application.Goto Reference:=range("CostCiudad_2")
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
Windows("MAINMENU II.xls").Activate
ActiveCell.Offset(0, -2).Select
End If
ActiveCell.Offset(contador + 1, 0).Select
Loop
Application.Goto Reference:="HOME1"
End Sub.
Tabla de busquda
CLIENTE CIUDAD RUTA "1" ARCHIVO
1 Alkosto CALI C:\Ricardo Documentos\Contratos\SLI S.A\Alkosto\ALK.XLS ALK.XLS
2 Andina de Herramientas CALI C:\Ricardo Documentos\Contratos\SLI S.A\Andina de Herramientas\AND.XLS AND.XLS
3 Angeos MEDELLÍN C:\Ricardo Documentos\Contratos\SLI S.A\Angeos\ANG.XLS ANG.XLS

1 Respuesta

Respuesta
1
Esta vez no comprendí muy bien el código pero analizándolo encontré algunas observaciones que te pueden ayudar.
1. Para lo del IF con una segunda condición puedes utilizar la siguiente estructura
IF Condicion1 THEN
InstruccionesCondición1
ELSEIF Condición2 THEN
InstruccionesCondición2
.
.
.
ELSEIF CondiciónN THEN
InstruccionesCondiciónN
ELSE
Instrucciones
(esto es para el caso de que no se cumpla ninguna de las N condiciones anteriores
END IF
Entonces, según tu conveniencia puedes usar el ELSE sólito (para los casos en los que sólo hay dos condiciones posibles) es decir si es verdadero cumple una seri de instrucciones y si es falso otro grupo de condiciones. [No olvides el end if al final de todo no?]
2. En cuanto a lo del contador veo que incrementas la celda activa pero no incrementas el contador en ninguna parte. Para solucionar esto tienes dos alternativas, la primera es aumentar el contador(contador=contador+1) y la segunda es cambiar la condición de finalización del loop por ejemplo puedes escribir
do while activecell. Value<>""
Instrucciones
loop
Por último desafortunadamente el editor de Todoexpertos no me permite ver si justificas tu código acorde con cada instrucción (esto facilita visualizar si falta algún end o algún loop o algo así). es muy util sobretodo cunado trabajas con varios If anidados pues en ese caso es muy fácil confundir los End If
Creo que con esas observaciones puedes mejorar tu macro e incluirla en un solo Loop, si no me expliqué bien o necesitas alguna aclaración ya sabes. De lo contrario te pido el favor de finalizar la pregunta con una valoración acorde con la calidad y oportunidad de la respuesta.
Gracias Cesar por contestarme la pregunta.
Lo del doblre condicionante lo solucione con el If y con el Else y funciona perfectamente todo deltro de un mismo Do.. Loop, pero sigo teniendo dificultades con el contador, a pesar que cuando termina el Loop el tiene la instrucción de Contador = Contador +1 pero el queda operrando infinitamente.
Como vas Ricardo, no se si entendí mal pero entiendo que la instrucción contador=contador +1 te quedó después del loop (debe estar antes)
Si no es así el problema se debe al condicional del do while porque tu incrementas el contador pero la referencia a la celda la haces con Offset teniendo en cuenta el contador... por lo que puedes tener una duplicidad de criterio que en resumen lo que no hace es llegar al final.
Si esto te ayuda maravilloso, de lo contrario contéstame esta respuesta con el código modificado y lo miramos a ver que le hacemos.
Cesar Tenías razón con respecto al contador. Había una instrucción mal definida que ya corregí.
Muchas gracias por tu colaboración y estoy aprendiendo mucho con tu ayuda y con un manual que baje de internet.

Añade tu respuesta

Haz clic para o