parece q esto es dificil de hacer

01/09/2004 - 08:33 por lamarse | Informe spam
Hola de nuevo.

Tengo este ultimo problema y por lo que veo no tiene solución. Llevo
varios dias y ni la encuentro y nadie me sabe decir nada.
¿Me podriais confirmar que no se puede hacer?

Muchas gracias

Victor [VDP]

-
Tengo una nueva problemática, donde vuelvo a necesitar de vuestra
ayuda.

A ver,

HOJA1
Contiene 2 RANGE's y 1 CELDA (entre otras cosas, pero esto es lo que
me interesa)

RANGE ("J4:J33")
RANGE ("O4:O9")
CELDA ("F2") = Contiene una fecha variable.

HOJA2
Contiene 1 clase de RANGE que se repite x cada FECHA.

RANGE ("C2:C7") = Este correspondería a la primera fecha, o sea,
30-08-04
RANGE ("D2:D7") = 31-08-04
RANGE ("E2:E7") = 1-09-04
Y así hasta finalizar el mes….. léase..
RANGE ("AI2:AI7") = finalizar el mes, pero en viernes.

Repetimos, pero dicho de otra manera:

Lunes 30/08/04 = Columna C (este es el primer RANGE)
Martes 31/08/04 = Columna D (este es el 2º RANGE)
.
.
Viernes 3/09/04 = Columna G (este es el 5º RANGE)
Sábado y domingo… saltamos las columnas H e I (que quedan para otro
uso)
. [Los Sábado y los Domingos, SIEMPRE se saltan sus columnas (q quedan
para otro uso)]
Lunes 6/09/04 = Columna J (este es el 6º RANGE)
.
. [Esto continua hasta que llegamos a fin de mes, pero no lo cortamos
a mitad de semana, sino que lo alargamos hasta el primer viernes del
próximo mes… léase

Viernes 1/10/04 = Columna AI (este es el 25º RANGE, y ultimo de esta
SERIE)

Una vez llegado a este punto, la siguiente fecha será en la Columna C
de nuevo, léase

Lunes 3/10/04 = RANGE ("C12:C17")

Así quedan los meses ordenados por franjas de filas concretas y se ven
en toda la HOJA (sin tener que desplazarla, aunque esto es mas o
menos, claro).

NOTA: Si esto lo complica demasiado, podemos prescindir de poner cada
mes, uno debajo de otro, y lo podemos poner TODO en RANGE
("LETRA/s2:LETRA/s7"), sin tener que bajar a
RANGE("LETRA/s12:LETRA/s17") (al fin y al cabo es comodidad, no
necesidad)

-
LA PROBLEMÁTICA:

Cuando en la HOJA1 realizo una modificación dentro del RANGE
("J4:J33") [exactamente después de haber modificado cualquier de sus
celdas, ni cuando estoy dentro, ni antes de la modificación],
Necesito que se COPIE el contenido del RANGE ("O4:O9") en la HOJA2, en
aquel RANGE correspondiente en función de la fecha que haya en CELDA
("F2") (de la HOJA1, claro).
O sea, que si HOJA1;CELDA ("F2") = 06/09/04, el contenido de
HOJA1;RANGE ("O4:O9"), se copiará en HOJA2;RANGE ("J2:J7"). Y así se
copia en un lugar u otro en función de la fecha que indique F2.

-
Las fechas serán hasta 1 año (no más), aunque imagino que no tendré
muchos problemas para modificarlo si al final decido incluir mas
fechas, ¿no?


Ya que estoy, expongo una

2ª PROBLEMÁTICA:

Cuando cierro el XLS, quisiera que me realice un SAVE AS, pero que
este sea AUTOMATICO y TRANSPARENTE. El nombre del FILE.xls, quiero que
sea un dia mas.
Amplio:
Yo trabajo con el file 30-08-04.xls (que es lunes), y cuando lo
cierro, quiero que AUTOMATICAMENTE y de FORMA TRANSPARENTE (sin
preguntar, ni que se vea) me cree un SAVE AS del mismo pero con el
nombre 31-08-04.xls (que es un dia mas, y será el martes). Cuando
llego al viernes, léase, 03-09-04.xls, y lo cierro, quiero que me cree
un SAVE AS con nombre del lunes 06-09-04.xls (y no asi del sábado
04-09-04.xls). Y así siempre.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
01/09/2004 - 10:38 | Informe spam
hola, victor [VDP] !

... este ultimo problema ... solucion ... varios dias y ni la encuentro [...]



espero haber 'acertado' [o al menos... estar 'cerca de...'] :))
¿comentas?
saludos,
hector.
en el modulo del libro [ThisWorkbook] ==Public Copia As String
Private Sub Workbook_Open()
Dim Dia As Integer, Mes As Integer, Año As Integer, Actual As String
Dia = Left(Me.Name, 2)
Mes = Mid(Me.Name, 4, 2)
Año = 20 & Mid(Me.Name, 7, 2)
Actual = LCase(Format(DateSerial(Año, Mes, Dia), "ddd"))
Select Case Actual
Case "vie", "fri": Dia = Dia + 3
Case "sáb", "sab", "sat": Dia = Dia + 2
Case Else: Dia = Dia + 1
End Select
Copia = Format(DateSerial(Año, Mes, Dia), "dd-mm-yy") & ".xls"
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Dir(Copia) <> "" Then Kill Copia
ThisWorkbook.SaveCopyAs Copia
End Sub
en el modulo de 'la hoja' [Hoja1?] ==Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("j4:j33")) Is Nothing Then Exit Sub
Dim Col As Integer: Col = Evaluate("Match(f2,Hoja2!1:1,0)")
Range("o4:o9").Copy Worksheets("Hoja2").Cells(2, Col)
End Sub
Respuesta Responder a este mensaje
#2 lamarse
01/09/2004 - 21:01 | Informe spam
Hola Hector.

Gracias de nuevo.
http://forum.milusion.com/02-09-04.xls

Ahi esta el XLS. Le he aplicado el código pero me peta en ambos casos.
Miralo tu mismo.

Dejame destacar un par de cosas:

1ª cosa
De entrada NO comenté (aunque lo intentas (yo), a menudo se me queda
algo en el tintero!!) que en la HOJA2, en una celda (en la fila 1
[SEP], fila 11 [OCT] y asi..) habia la fecha indicada (que se tenia
que contrastar). Supongo que eso te habrá tenido un poco loco (o
dificultado un poco mas el tema). Bueno, en fin, tal vez no es
necesario, pero lo indica (sin más para un poco de orden). Miralo en
el XLS, que se ve claramente.
Para ser exactos, me peta en ': Col Evaluate("Match(f2,Hoja2!1:1,0)")' que me lo marca en amarillo.

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("j4:j33")) Is Nothing Then Exit Sub
Dim Col As Integer: Col = Evaluate("Match(f2,Hoja2!1:1,0)")
Range("o4:o9").Copy Worksheets("Hoja2").Cells(2, Col)
End Sub

A ver si a ti te pasa igual.


2ªcosa
Al cerrar el XLS a ver... yo quiero poderlo salvar tantas veces
como quiera (es decir.. a medida que se trabaja en él, se van haciendo
copias del mismo (por aquello de si el PC te peta y pierdes tu
trabajo), o sea, el CONTROL+S (en ingles)). El caso es que, SOLO
cuando cierras el XLS, es cuando necesito que te cree el SAVEAS (no
asi con CONTROL+S, (aunque no se si lo hacia, pero me ha petado al
acerlo). Bueno, esto lo aclaro. En si, no me funciona. (no sé el
p.q.). Me da error en 'Kill copia' (se marca en amarillo).

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)
If Dir(Copia) <> "" Then Kill Copia
ThisWorkbook.SaveCopyAs Copia
End Sub

Depues.. si se da el caso de que yo cierro el XLS primero (y asi se
crea el del dia siguiente, y lo vuelvo a abrir, al cerrarlo..
encontrará que el SAVEAS que desea crear, YA EXISTE (pues se entiende
que lo ha creado la primera vez que lo he cerrado). Pues en dicho caso
tendria que sobre escribirse (se entiende que al abrirlo de nuevo has
podido realizar modificaciones y quiero que se reflejen en el XLS
SAVEAS resultante).


-
Cuando abras el XLS ya lo verás.


Muchas gracias de nuevo.
Espero que el XLS te solucione la vida (más que la explicacion en si).
Ves que en la hoja 'TRABAJO', en la columna RESULTADO, cuando cambio
el resultado de alguna de esas celdas, ves que en la columna TOTAL se
producen modificaciones, y estos numeros son los que necesito que se
copien en la Hoja2, en su correspondiente sitio, en funcion de la
fecha que indica en la HOJA 'TRABAJO' (F2) y que lo copie en el RANGE
que le corresponde.

Gracias de nuevo.

Victor [VDP]
Respuesta Responder a este mensaje
#3 Héctor Miguel
02/09/2004 - 00:56 | Informe spam
hola, victor [VDP] !

Ahi esta el XLS ... el codigo ... me peta en ambos casos ... destacar un par de cosas:
1ª cosa ... a menudo se me queda algo en el tintero!! [...]
Para ser exactos, me peta en: 'Col = Evaluate("Match(f2,Hoja2!1:1,0)")' que me lo marca en amarillo.
A ver si a ti te pasa igual.

2ª cosa ... quiero poderlo salvar tantas veces como quiera [...]
El caso es que, SOLO cuando cierras el XLS ... que te cree el SAVEAS [...]
En si, no me funciona. (no se el p.q.). Me da error en 'Kill copia' (se marca en amarillo).
Cuando abras el XLS ya lo veras.

[3ª cosa] ... ... en la hoja 'TRABAJO', en la columna RESULTADO ... se producen modificaciones
...estos numeros son los que necesito que se copien en la Hoja2 ... en funcion de la fecha ... (F2) [...]



[como bien dices...] 'hay cosas que... ¡ se quedan en el tintero !!! [y... NO siempre se pueden 'adivinar'] :))
te 'detallo' enseguida lo que pude 'evaluar' [y las propuestas de correccion]
si cualquier duda o informacion adicional... ¿comentas?
saludos,
hector.

1ª cosa ... la causa del fallo en el 'Evaluate' ...
[la linea que 'detecta' la columna en Hoja2 'correspondiente' a la fecha en Trabajo!F2]
se ocasiona debido a que en Trabajo!F2 le estas 'indicando' la fecha de Agosto-23
=>que NO 'existe' en la fila 1 de Hoja2<= [puesto que la primer fecha del 'calendario' es Agosto-30] :-(
-> si consideras que este tipo de 'situaciones de error' [obviamente que involuntarias] se presentara 'a menudo'...
seria conveniente diseñar un mecanismo de 'prevencion/correccion' en el codigo ;)
o... 'validar' la celda 'F2' [en la hoja 'Trabajo'] CON el rango de fechas ['calendarizadas' en Hoja2]

2ª cosa ...
a) para que la copia de respaldo se genere SOLO al salir del libro...
mueve el codigo al evento '_beforeclose' en el modulo del libro
b) la causa del fallo al 'eliminar' [si existe] una copia anterior de igual nombre...
[segun yo] no debiera de fallar :? [la instruccion 'Kill' es parte de las funciones integradas de vba]
c) si la falla se diera en la siguiente linea [la que 'guarda' el respaldo]...
'rescate' las siguientes 'observaciones' del 'tintero' [lease... del archivo] :))
1.- la linea que 'guarda' la copia de respaldo ['Copia'... segun el siguiente dia habil]...
utiliza al objeto-libro: ->ThisWorkbook.SaveCopyAs Copia<- PERO...
-> el 'nombre-codigo' [para vba] del libro... NO ES 'ThisWorkbook' ES... 'EsteLibro'
2.- [de lo anterior] 'deduzco' que... el libro ha sido [originalmente] 'generado/usado'...
en una pc con el excel ->Y VBA<- en idioma español [ademas de que]...
se le han 'ido agregando' hojas ->en otra/s pc/s<- con excel en ingles
la hoja 'Trabajo' tiene un 'codename' de ->Hoja6<- y la Hoja2 tiene un 'codename' de ->Sheet3<-

3ª cosa ... NO debera 'fallar' [una vez corregidas la 1ª cosa y la 2ª cosa] :DD

las modificaciones [propuestas] quedarian como sigue...
en el modulo de codigo [ThisWorkbook o... EsteLibro] ==Public Copia As String
Private Sub Workbook_Open()
Dim Dia As Integer, Mes As Integer, Año As Integer, Actual As String
Dia = Left(Me.Name, 2): Mes = Mid(Me.Name, 4, 2): Año = 20 & Mid(Me.Name, 7, 2)
Actual = LCase(Format(DateSerial(Año, Mes, Dia), "ddd"))
Select Case Actual
Case "vie", "fri": Dia = Dia + 3
Case "sáb", "sab", "sat": Dia = Dia + 2
Case Else: Dia = Dia + 1
End Select: Copia = Format(DateSerial(Año, Mes, Dia), "dd-mm-yy") & ".xls"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Dir(Copia) <> "" Then Kill Copia
Me.SaveCopyAs Copia
End Sub
en el modulo de codigo de la hoja [Trabajo] ==Private Sub Worksheet_Change(ByVal Target As Range)
Dim Col As Integer
If Intersect(Target, Range("j4:j33")) Is Nothing Then Exit Sub
Col = Evaluate("Match(f2,Hoja2!1:1,0)")
Range("o4:o9").Copy
Worksheets("Hoja2").Cells(2, Col).PasteSpecial xlValues
Application.CutCopyMode = False
End Sub
Respuesta Responder a este mensaje
#4 lamarse
02/09/2004 - 22:19 | Informe spam
Gracias Hector.

La primera parte me funciona. La segunda NO consigo que se inmute de
ese error en el Kill copia. Al final he realizado una prueba mas: he
empezado un LIBRO nuevo desde mi XP en ENG y desde el OFFICE XP en ENG
tambien. Todo de cero para que no sucediera el problema que me
comentas de disparidad de idiomas.
Parece que no ha servido de nada. Ahora tengo la primera parte
aplicada a mi proyecto en limpio (de 0 y eningles), pero me falta esta
ultima parte del SAVEAS. En fin, gracias de todas maneras.

Victor [VDP]
Respuesta Responder a este mensaje
#5 Héctor Miguel
02/09/2004 - 22:59 | Informe spam
hola, victor !

La primera parte me funciona. La segunda NO consigo que se inmute de ese error en el Kill copia. [...]



habia estdo 'tratando' de mantener en el directorio 'actual' la busqueda/eliminacion del 'respaldo' ;)
[por si ->de forma 'manual'<- cambiabas el archivo de directorio con un file/save as...]
es posible que 'eso' este [de alguna manera] causando conflictos con el 'Dir' y con el 'Kill' [?]
haz una prueba 'final' modificando las instrucciones 'previas' a cerrar el archivo en el modulo 'del libro'
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Respaldo As String: Respaldo = ThisWorkbook.Path & "\" & Copia
If Dir(Respaldo) <> "" Then Kill Respaldo
Me.SaveCopyAs Respaldo
End Sub

¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida