Problema con debugging (un problema con VB)

03/12/2005 - 20:07 por Alejandro Garrammone | Informe spam
Hola grupo! les comento un poco, he hecho una macro en word (perdon que no
sea de excel, pero en el fondo es una funcion de VB la que tiene problemas)
para imprimir documentos largos, pero al hacer el debug correspondiente me
he dando cuenta de que nunca se ejecuta la sentencia FOR, o mejor dicho, se
evalúa y no se ejecuta su contenido. Alguien sabe por qué puede llegar a
pasar esto?
Aqui les transcribo el código:

Sub Impresion()
'
' Impresion Macro
' Macro recorded 28/11/2005 by Alejandro Garrammone
'

Dim tiempo As Date
Dim cant_rep As Integer
Dim cant_pag As Integer
Dim hora, min, seg As Integer
Dim tiempo_entre1 As Date
Dim tiempo_entre2 As Date
Dim flag As Byte
Dim inicio As Integer
Dim fin As Integer
Dim concat As String
Dim contador as integer



'inicio del cuerpo del programa
cant_pag = Selection.Information(wdNumberOfPagesInDocument)
cant_rep = cant_pag \ 240
'cant_rep + 1 es lo que tengo que tomar para el rango final
tiempo = Time()
hora = Hour(tiempo)
min = Minute(tiempo)
seg = Second(tiempo)
tiempo_entre1 = TimeSerial(hora, min + 15, 0)
tiempo_entre2 = TimeSerial(hora, min + 15, 59)

If cant_pag > 240 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
flag = 0
Do
If flag < 1 Then
fin = 240 * contador
inicio = fin - 239
concat = inicio & "-" & fin
Application.PrintOut FileName:="",
Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:=
_
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True,
Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0,
PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
flag = 1
End If
tiempo = Time()
Loop Until (tiempo > tiempo_entre1) Or (tiempo < tiempo_entre2)
tiempo = Time()
hora = Hour(tiempo)
min = Minute(tiempo)
seg = Second(tiempo)
tiempo_entre1 = TimeSerial(hora, min + 15, 0)
tiempo_entre2 = TimeSerial(hora, min + 15, 59)
Next contador
fin = contador * 240
inicio = fin - 239
fin = cant_pag
concat = inicio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Else
inicio = 1
fin = cant_pag
concat = incio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
End If
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
04/12/2005 - 06:48 | Informe spam
hola, Alejandro !

... una macro en word ... para imprimir documentos largos... la sentencia FOR... se evalua y no se ejecuta su contenido [...]



serviria si comentas que es lo que esperas que haga que no esta haciendo :))
si [como parece] lo unico que quieres es 'darle un respiro' entre bloques de 240 paginas a la impresora...
[creo que] necesitas 'sacar' las instrucciones de impresion... 'fuera' del bloque 'Do...Loop'
[y quizas te queden sobrando algunas 'variables'] ;)
prueba modificando el bucle 'For...Next' [y dentro el 'Do...Loop' pero en distinta posicion] +/- a lo siguiente...
[toma nota que he cambiado tus variables 'tiempo_entre1' y 'tiempo_entre2' por una que se llama... 'Espera' :))
=Dim Espera as Date
If cant_pag > 240 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 240 * contador
inicio = fin - 239
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 0, 16)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
Else ' [...]

[probablemente] podrias 'sacrificar' la -nueva- variable 'Espera' y el 'Do...Loop' por el metodo 'Wait' -?-
[que suspende las acciones del usuario y otras macros... PERO NO los procesos internos, como la impresion] ;)
[p.e. en lugar de la variable y el bucle do...loop intenta con]...
-> Application.Wait Now + TimeSerial(0, 0, 16)

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.

p.d. creo que...
-> no es correcto que postees la misma pregunta en dos [o mas] grupos de forma 'indistinta' :(
pudiera resultar en un 'desgaste innecesario' de 'busquedas de soluciones'...
y... las respuestas en un grupo NO 'beneficiaran' a los demas grupos 'excluidos' [por 'indistintos'] :\
-> si consideras que es de interes para otros grupos... prueba haciendo 'cross-posting' [NO 'multi-posting'] ;)
Respuesta Responder a este mensaje
#2 Alejandro Garrammone
04/12/2005 - 23:08 | Informe spam
Hola Héctor! Bueno, te cuento un poquito más. Estuve probando con el código
que me pasaste y sigo con el mismo problema. Estoy haciendo debugging con el
'F8' y lo que estoy notando es que cuando llega al FOR, el cursor se para
sobre él y luego de presionar nuevamente F8 pasa directamente a la sentencia
posterior al NEXT, o sea que lo que está dentro del bucle no se ejecuta
nunca.
El código que quiero hacer es exáctamente lo que has supuesto tú. Darle
respiro a un impresora sin que nadie tenga que estar delante de la
computadora, definiéndole los rangos y que sólo se preocupe por abastecerla
de hojas...pues la idea es imprimir documentos de 1000 a 5000 hojas.
Modifiqué mínimamente tu código para que funcione con un archivo de prueba
de 11 hojas solamente, el resto está intacto y le agregué la parte que le
faltaba (lo comenté para que veas que es lo que pretendo que haga).

Sub Impresion_1()

'
' Impresion Macro
' Macro recorded 28/11/2005 by Alejandro Garrammone, Argentina
' Colaboración de Héctor Miguel, Méjico
'

Dim tiempo As Date
Dim Espera As Date
Dim cant_rep As Integer
Dim cant_pag As Integer
Dim hora, min, seg As Integer
Dim inicio As Integer
Dim fin As Integer
Dim concat As String
Dim contador As Integer


'inicio del cuerpo del programa
cant_pag = Selection.Information(wdNumberOfPagesInDocument)
cant_rep = cant_pag \ 5
tiempo = Time()
contador = 1

If cant_pag > 5 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 5 * contador
inicio = fin - 4
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 2, 0)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
'como con \ solo obtengo 2 pasadas, sobre un documento de 11 hojas me va a
faltar
'la impresion del final, es por esto que agrego las lineas siguientes.
fin = contador * 5
inicio = fin - 4
fin = cant_pag
concat = inicio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Else
'esto es para documentos menores de 5 hojas, para lo cual no se necesita mas
de
'un unico rango
inicio = 1
fin = cant_pag
concat = incio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
End If
End Sub

Saludos, y gracias Héctor!

PD: Perdón por hacer Multi-posting, si puedes enséñame como hacer
cross-posting. Para subsanar mi error voy a postear en el otro grupo de
noticias lo que hemos avanzado hasta el momento.

"Héctor Miguel" escribió en el mensaje
news:OajIYZJ%
hola, Alejandro !

... una macro en word ... para imprimir documentos largos... la sentencia
FOR... se evalua y no se ejecuta su contenido [...]



serviria si comentas que es lo que esperas que haga que no esta haciendo
:))
si [como parece] lo unico que quieres es 'darle un respiro' entre bloques
de 240 paginas a la impresora...
[creo que] necesitas 'sacar' las instrucciones de impresion... 'fuera' del
bloque 'Do...Loop'
[y quizas te queden sobrando algunas 'variables'] ;)
prueba modificando el bucle 'For...Next' [y dentro el 'Do...Loop' pero en
distinta posicion] +/- a lo siguiente...
[toma nota que he cambiado tus variables 'tiempo_entre1' y 'tiempo_entre2'
por una que se llama... 'Espera' :))
=> Dim Espera as Date
If cant_pag > 240 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 240 * contador
inicio = fin - 239
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 0, 16)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
Else ' [...]

[probablemente] podrias 'sacrificar' la -nueva- variable 'Espera' y el
'Do...Loop' por el metodo 'Wait' -?-
[que suspende las acciones del usuario y otras macros... PERO NO los
procesos internos, como la impresion] ;)
[p.e. en lugar de la variable y el bucle do...loop intenta con]...
-> Application.Wait Now + TimeSerial(0, 0, 16)

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.

p.d. creo que...
-> no es correcto que postees la misma pregunta en dos [o mas] grupos de
forma 'indistinta' :(
pudiera resultar en un 'desgaste innecesario' de 'busquedas de
soluciones'...
y... las respuestas en un grupo NO 'beneficiaran' a los demas grupos
'excluidos' [por 'indistintos'] :\
-> si consideras que es de interes para otros grupos... prueba haciendo
'cross-posting' [NO 'multi-posting'] ;)

Respuesta Responder a este mensaje
#3 Alejandro Garrammone
05/12/2005 - 23:07 | Informe spam
Bueno, ya funciona relativamente bien, encontré el error (active la
declaracion obligatoria de variables en vb) y resultó que 'cant_rep' estaba
puesta en el for como 'can_rep', por lo que no funcionaba bien.
Ahora el problema con el que me estoy encontrando es que a medida que va
corriendo el programa, va cargando en el spool las impresiones, pero estas
no comienzan a imprimirse hasta que no termine de correr el programa.
¿Porqué me puede estar pasando esto?

Gracias y saludos.

"Alejandro Garrammone" escribió en el mensaje
news:OW6w78R%
Hola Héctor! Bueno, te cuento un poquito más. Estuve probando con el
código que me pasaste y sigo con el mismo problema. Estoy haciendo
debugging con el 'F8' y lo que estoy notando es que cuando llega al FOR,
el cursor se para sobre él y luego de presionar nuevamente F8 pasa
directamente a la sentencia posterior al NEXT, o sea que lo que está
dentro del bucle no se ejecuta nunca.
El código que quiero hacer es exáctamente lo que has supuesto tú. Darle
respiro a un impresora sin que nadie tenga que estar delante de la
computadora, definiéndole los rangos y que sólo se preocupe por
abastecerla de hojas...pues la idea es imprimir documentos de 1000 a 5000
hojas.
Modifiqué mínimamente tu código para que funcione con un archivo de prueba
de 11 hojas solamente, el resto está intacto y le agregué la parte que le
faltaba (lo comenté para que veas que es lo que pretendo que haga).

Sub Impresion_1()

'
' Impresion Macro
' Macro recorded 28/11/2005 by Alejandro Garrammone, Argentina
' Colaboración de Héctor Miguel, Méjico
'

Dim tiempo As Date
Dim Espera As Date
Dim cant_rep As Integer
Dim cant_pag As Integer
Dim hora, min, seg As Integer
Dim inicio As Integer
Dim fin As Integer
Dim concat As String
Dim contador As Integer


'inicio del cuerpo del programa
cant_pag = Selection.Information(wdNumberOfPagesInDocument)
cant_rep = cant_pag \ 5
tiempo = Time()
contador = 1

If cant_pag > 5 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 5 * contador
inicio = fin - 4
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 2, 0)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
'como con \ solo obtengo 2 pasadas, sobre un documento de 11 hojas me va a
faltar
'la impresion del final, es por esto que agrego las lineas siguientes.
fin = contador * 5
inicio = fin - 4
fin = cant_pag
concat = inicio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Else
'esto es para documentos menores de 5 hojas, para lo cual no se necesita
mas de
'un unico rango
inicio = 1
fin = cant_pag
concat = incio & "-" & fin
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
End If
End Sub

Saludos, y gracias Héctor!

PD: Perdón por hacer Multi-posting, si puedes enséñame como hacer
cross-posting. Para subsanar mi error voy a postear en el otro grupo de
noticias lo que hemos avanzado hasta el momento.

"Héctor Miguel" escribió en el mensaje
news:OajIYZJ%
hola, Alejandro !

... una macro en word ... para imprimir documentos largos... la
sentencia FOR... se evalua y no se ejecuta su contenido [...]



serviria si comentas que es lo que esperas que haga que no esta haciendo
:))
si [como parece] lo unico que quieres es 'darle un respiro' entre bloques
de 240 paginas a la impresora...
[creo que] necesitas 'sacar' las instrucciones de impresion... 'fuera'
del bloque 'Do...Loop'
[y quizas te queden sobrando algunas 'variables'] ;)
prueba modificando el bucle 'For...Next' [y dentro el 'Do...Loop' pero en
distinta posicion] +/- a lo siguiente...
[toma nota que he cambiado tus variables 'tiempo_entre1' y
'tiempo_entre2' por una que se llama... 'Espera' :))
=>> Dim Espera as Date
If cant_pag > 240 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 240 * contador
inicio = fin - 239
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 0, 16)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:=
_
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
Else ' [...]

[probablemente] podrias 'sacrificar' la -nueva- variable 'Espera' y el
'Do...Loop' por el metodo 'Wait' -?-
[que suspende las acciones del usuario y otras macros... PERO NO los
procesos internos, como la impresion] ;)
[p.e. en lugar de la variable y el bucle do...loop intenta con]...
-> Application.Wait Now + TimeSerial(0, 0, 16)

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.

p.d. creo que...
-> no es correcto que postees la misma pregunta en dos [o mas] grupos de
forma 'indistinta' :(
pudiera resultar en un 'desgaste innecesario' de 'busquedas de
soluciones'...
y... las respuestas en un grupo NO 'beneficiaran' a los demas grupos
'excluidos' [por 'indistintos'] :\
-> si consideras que es de interes para otros grupos... prueba haciendo
'cross-posting' [NO 'multi-posting'] ;)





Respuesta Responder a este mensaje
#4 Alejandro Garrammone
06/12/2005 - 00:12 | Informe spam
Traté de utilizar la funcion Wait, pero en word no está disponible :((
Siento que estoy en el 'horno'.

"Héctor Miguel" escribió en el mensaje
news:OajIYZJ%
hola, Alejandro !

... una macro en word ... para imprimir documentos largos... la sentencia
FOR... se evalua y no se ejecuta su contenido [...]



serviria si comentas que es lo que esperas que haga que no esta haciendo
:))
si [como parece] lo unico que quieres es 'darle un respiro' entre bloques
de 240 paginas a la impresora...
[creo que] necesitas 'sacar' las instrucciones de impresion... 'fuera' del
bloque 'Do...Loop'
[y quizas te queden sobrando algunas 'variables'] ;)
prueba modificando el bucle 'For...Next' [y dentro el 'Do...Loop' pero en
distinta posicion] +/- a lo siguiente...
[toma nota que he cambiado tus variables 'tiempo_entre1' y 'tiempo_entre2'
por una que se llama... 'Espera' :))
=> Dim Espera as Date
If cant_pag > 240 Then
For contador = 1 To can_rep Step 1 'ESTE ES EL FOR CON PROBLEMAS!
fin = 240 * contador
inicio = fin - 239
concat = inicio & "-" & fin
Espera = Now + TimeSerial(0, 0, 16)
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:=concat, PageType:= _
wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:=
_
True, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Do
tiempo = Time()
Loop Until (tiempo > Espera)
Next contador
Else ' [...]

[probablemente] podrias 'sacrificar' la -nueva- variable 'Espera' y el
'Do...Loop' por el metodo 'Wait' -?-
[que suspende las acciones del usuario y otras macros... PERO NO los
procesos internos, como la impresion] ;)
[p.e. en lugar de la variable y el bucle do...loop intenta con]...
-> Application.Wait Now + TimeSerial(0, 0, 16)

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.

p.d. creo que...
-> no es correcto que postees la misma pregunta en dos [o mas] grupos de
forma 'indistinta' :(
pudiera resultar en un 'desgaste innecesario' de 'busquedas de
soluciones'...
y... las respuestas en un grupo NO 'beneficiaran' a los demas grupos
'excluidos' [por 'indistintos'] :\
-> si consideras que es de interes para otros grupos... prueba haciendo
'cross-posting' [NO 'multi-posting'] ;)

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida