En funcion de determinadas condiciones (con codigo) quiero que se elimine
o no una hoja determinada. Esto lo he conseguido, el problema es que no se
como evitar que excel me presente el mensaje de aviso: "Pueden existir
..¿Deseas eliminar la hoja"(mas o menos), y me interesaria que no lo
presentara, sino que directamente eliminara la hoja. Pongo el codigo usado
por si srve de ayuda. (A este procedimiento se le llama desde otro)
Por cierto ¿podria decime alguien si seria mejor que este procedimiento
fuese function en vez de sub y , si es asi, porque?
Agradezco vuestra ayuda de antemano.
Un saludo y hasta pronto
Ivan
Sub NuevaHoja(HojaNueva As String, Titulos As Variant)
On Error GoTo salir
Worksheets.Add after:=Worksheets("Libros seleccionados")
ActiveSheet.Name = HojaNueva
On Error GoTo 0
Dim colT As Long, LetraT As Variant
colT = UBound(Titulos)
LetraT = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", _
"k", "l", "m", "n", "o", "p", "q", "r", "s")
With Worksheets(HojaNueva)
With .Range("a1:" & LetraT(colT) & "1")
.Value = Titulos
With .Font
.Bold = True
.Size = 10
End With
.HorizontalAlignment = xlCenter
.Interior.ColorIndex = 3
End With
End With
salir:
If ActiveSheet.Name <> HojaNueva Then ActiveSheet.Delete
End Sub
Application.DisplayAlerts=False
y despues pon:
Application.DisplayAlerts=True
Saludos,
KL
"Ivan" <klom...@kteleklinke.kes> wrote in message news:%23SRzFJ0...@TK2MSFTNGP05.phx.gbl...
> ... podria decime alguien si seria mejor que este procedimiento fuese function en vez de sub y si es asi, porque?
[hasta donde se]... la [unica] diferencia 'basica' entre los procedimientos Sub y Function es que...
-> si el caso es que el 'uso pretendido' de un procedimiento Function...
a) sera como funcion [de hoja de calculo] definida por el usuario...
NO 'puede' modificar el ambiente / entorno de la aplicacion
[colores de celda, formatos, tipos de letra, 'otras' celdas, etc.]
b) sera para uso de 'codigo_x_codigo'.. pudiera resultar en algunos casos [ligeramente] mas rapida su ejecucion ;)
aunque habria que 'cuidar' si los argumentos 'se pasan' por referencia [ByRef -por omision-] o por valor [ByVal]
asi como los tipos de datos asignados a los argumentos [Variant por omision, a menos que se especifiquen]
[por otro lado]... podrias comentar el 'por que' esperas que pudieran darse errores al asignar un nombre a una hoja 'nueva' ?
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
__ el codigo expuesto __
Unsaludo y hasta pronto.
Ivan
Se trata de crear una hoja para almacenar los registros nuevos,
modificados y/o eliminados (una hoja diferente para cada tipo de accion y
que se cearia solo en caso necesario) que al cerrar el libro se
eliminarian, previo traspaso a un libro-almacen de registros nuevos,
modificados y/o añadidos que haria la funcion de copia de seguridad para
poder restaurarlos en caso necesario (en el caso de los registros nuevos
seria posiblemente hasta que se actualizara el archivo de otros usuarios
via correo o similar). El tratamiento de errores es para evitar el nº9
cuando la hoja ya se ha creado en una accion con otro registro. Se trat
del archivo "Libreria" que ya conoces.
He estado intentando otra forma que en otro codigo parecia funcionar bien
(y que muestro a continuacion), pero en este a veces me da el error 1008
(cuando no otros) y al final, cansado de probar he optado por esta via que
de momento parece funcionar.
Por otro lado, en cuanto a la explicacion sobre function, creo entender
que la diferencia con sub basicamente radica en: a favor de la primera,
aparte de su uso directo como funcion en la hoja, su mayor velocidad (al
parecer no axcesiva) y en contra su incapacidad para realizar ciertas
acciones (formato, etc). No se si me equivoco, pero me da la impresion de
que en codigo, resulta mas practico el uso de proc. sub, dado que tambien
se le pueden pasar argumentos y parecen mas versatiles. ¿Estoy diciendo
una burrada?
Bueno, aqui expongo el codigo(este es para las modificaciones) con el que
me daba los errores mencionados (como comentario) y previamente el actual
que usa el pro. NuevaHoja:
Private Sub CopiaLibroModificado()
Dim ModificadoEl, TitulosN, DatosN
Dim filM As Long, LibroAct As String
If ActiveSheet.Name = "Listado" Then
LibroAct = "Listado"
ElseIf ActiveSheet.Name = "Libros seleccionados" Then
LibroAct = "Libros seleccionados"
End If
TitulosN = Array("Titulo", "Autor", "Genero", "Tema", "Pais", _
"Lo tiene", "Apellido autor", "Observaciones", "Editorial", _
"Fecha edicion", "NºFicha", "Nombre autor", "Modificado por", _
"El dia", "Motivo")
Call NuevaHoja("Libros modificados", TitulosN)
ModificadoEl = Now
With Worksheets("Libros modificados")
filM = .Range("a65536").End(xlUp).Offset(1, 0).Row
.Range("a" & filM & ":n" & filM).Value = vrtDatos
.Range("m" & filM) = Hermano(iH)
.Range("n" & filM) = ModificadoEl
.Visible = True 'False
FormatoHojaActiva2
End With
Worksheets(LibroAct).Activate
End Sub
'Private Sub CopiaLibroModificado()
' Dim ModificadoEl, filC As Long, LibroAct As String
' If ActiveSheet.Name = "Listado" Then
' LibroAct = "Listado"
' ElseIf ActiveSheet.Name = "Libros seleccionados" Then
' LibroAct = "Libros seleccionados"
' End If
' ActiveCell.EntireRow.Copy
' On Error GoTo NoHayHoja
' Worksheets("Libros modificados").Activate
'''Las variables Hermano, y xCop las obtiene del proc llamante.
' With Worksheets("Libros modificados")
' filC = .Range("a65536").End(xlUp).Offset(1, 0).Row
' .Range("a" & filC).PasteSpecial xlPasteValues
' .Range("m" & filC) = Hermano(iH)
' .Range("n" & filC) = ModificadoEl
' .Range("o" & filC) = xCop
' .Visible = True 'False
' .Activate
' FormatoHojaActiva2
' End With
' Worksheets(LibroAct).Activate
'NoHayHoja:
' If Err.Number = 9 Then
' Worksheets.Add after:=Worksheets("Libros seleccionados")
' ActiveSheet.Name = "Libros modificados"
' With Worksheets("Libros modificados")
' With .Range("a1:o1")
' .Value = Array("Titulo", "Autor", "Genero", "Tema", "Pais", _
' "Lo tiene", "Apellido autor", "Observaciones", "Editorial", _
' "Fecha edicion", "NºFicha", "Nombre autor", "Modificado por",
_
' "El dia", "Motivo modificación")
' With .Font
' .Bold = True
' .Size = 10
' End With
' .HorizontalAlignment = xlCenter
' .Interior.ColorIndex = 3
' End With
' End With
' Resume
' End If
'End Sub
> ... El tratamiento de errores es para evitar... cuando la hoja ya se ha creado en una accion con otro registro
> ... otra forma que en otro codigo parecia funcionar bien... pero en este a veces me da el error 1008 (cuando no otros)
> ... en cuanto a la explicacion sobre function, creo entender que la diferencia con sub basicamente radica en:
> a favor de la primera, aparte de su uso directo como funcion en la hoja, su mayor velocidad (al parecer no axcesiva)
> y en contra su incapacidad para realizar ciertas acciones (formato, etc).
> No se si me equivoco, pero me da la impresion de que en codigo, resulta mas practico el uso de proc. sub
> dado que tambien se le pueden pasar argumentos y parecen mas versatiles. Estoy diciendo una burrada?
ninguna 'burrada' solo una aclaracion: en cuanto a la 'incapacidad' [de un procedimiento func] para aplicar formatos etc.
SOLO 'aplica' cuando el procedimiento function esta 'planeado' para ser usado EN 'llamadas' en formulas en hojas de calculo
[como las funciones 'nativas' o integradas del excel, como suma(...), promedio(...), etc.]
NO aplica cuando 'la funcion' sirve al proposito de otras llamadas -> por codigo ;)
[ejemplo]: en el caso del procedimiento que expones en el primer mensaje...
1) podrias 'cambiarlo' a un procedimiento Function +/- como sigue:
de -> Sub NuevaHoja(HojaNueva As String, Titulos As Variant)
a -> Function NuevaHoja(ByVal HojaNueva As String, ByVal Titulos As Variant)
2) habria que 'cuidar' lo siguiente:
a) un procedimiento Sub que 'toma' argumentos... NO puede ser 'llamado' desde la interfase del usuario [p.e. con alt+F8]
b) un procedimiento Function SI se podria [intentar a] 'llamarlo' [p.e. desde alguna formula en celdas en hojas de calculo]
[aunque como en este caso... 'la funcion' no funcionaria] :D
c) o... haces el procedimiento function 'Private' [con lo cual solo seria 'transparente' para codigos de su mismo modulo]
o... declaras el modulo completo como Option Private Module [en el area de las declaraciones]
para no salirme -demasiado- 'del tema'... si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
No se si sera excederme en la consulta, pero la verdad es que las
funciones, asi como el paso por valor o por referencia, me tienen
totalmente despistado, a pesar de leer y releer numerosas explicaciones al
respecto no acabo de (por decirlo de alguna manera) "interiorizarlo". No
acabo de entender (si quitamos el tema del uso en hoja) la diferencia
entre funcion y sub. La principal explicacion general parece ser que el 1º
devuelve un valor, pero, o yo no tengo claro lo que es un valor (cosa
bastante posible), o el sub tambien lo devuelve. Y, aunque con funciones
propias practicamente no he hecho nada, me da la impresion de que al
contrario pasa lo mismo, que una funcion tambien puede devolver algo que
no es un valor (o quizas que yo creo que no es un valor). En cuanto al
paso por valor o por referencia tengo la misma sensacion de abstraccion,
tampoco acabo de comprender la diferencia o al menos de fabricarme una
explicacion dentro de lo concreto (lo que me lleva a pensar que quizas mi
problema este en la comprension del concepto valor).
Disculpa por este rollo. Mas que una consulta parece una reflexion, pero
en numerosas ocasiones, estas dudas, me hechan para atras a la hora de
encarar algun procedimiento. Si puedes echame una mano de nuevo, sumaremos
otro agradecimiento a la pila.
a pesar de que en algunas ocasiones al consultar la 'ayuda en linea' de las aplicaciones ['pareciera' como que]...
NO alcanza a 'evidenciar' una 'profunda claridad' para comprender el tema que se consulta y sus implicaciones :))
una 'persistente' re/consulta y 'puesta en practica' sobre las situaciones que se necesita resolver [tambien como que]...
van 'disipando la bruma' y [cada vez mas] 'aclarando el panorama' de lo que dicha 'ayuda en linea'... va 'dejando entre lineas'
[hablando de 'rollos'... este rollo que te cabo de aventar si que esta muy 'rollero'] :))
1) 'el valor'... que pueden [o no] devolver los procedimientos function -> se asigna AL MISMISIMO 'nombre' del procedimiento ;)
por lo cual NO seria posible [p.e.] 'tomar' el valor de una variable, haciendo referencia al nombre -> de un procedimiento Sub :-\
-> a menos que... DENTRO de un procedimiento Sub, se establezcan/modifiquen/re-asignen valores a variables PUBLICAS
que [entonces SI] podrian ser 'recogidas' [las variables o sus valores] por otras partes en otros procedimientos [mismo proyecto]
2) sobra mencionar que 'el tipo' del valor devuelto pudiera ser 'de cualquier tipo' [String, Integer, etc. incluso 'matrices'] ;)
3) sobre el tema de si los argumentos de los procedimientos [Sub o Function] son 'pasados/tomados' ByRef o ByVal
te paso algo de informacion [segun 'extractos de' la ayuda en linea de vba-excel] en seguida ;)
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
- los procedimientos le indican a la aplicacion como ejecutar una tarea especifica
- se utilizan para dividir tareas de codigo complejas en unidades mas manipulables
- son una secuencia [con nombre] de instrucciones que se ejecutan como una unidad
- los 'tipos' de procedimientos [generalmente] son Sub, Function o Property
- un procedimiento Property [generalmente] se usa para crear y manipulas propiedades 'personalizadas'
- un procedimiento Function [similar a un procedimiento Sub] 'puede' [ademas] 'devolver' un valor/resultado/...
dicho valor [o resultado] ES asignado al nombre del procedimiento Funciton
- un procedimiento Sub [a diferencia de los procedimientos Funciton] NO 'puede' devolver un valor/resultado/...
- TODOS pueden 'tomar' argumentos [dentro de los parentesis del procedimiento]
- cuando un procedimiento 'toma' argumentos, estos pueden ser 'solicitados' de dos maneras...
ByRef [por referencia] significa que el valor de la variable PUEDE ser cambiado por el procedimiento que lo 'recibe'
- ByRef 'trabaja' con la variable 'original' [o sea, la asignacion o referencia original de la variabe]
ByVal [por valor] significa que que el valor de la variable NO PUEDE ser cambiado por el procedimiento que lo 'recibe'
- 'trabaja' con una copia del valor de la variable 'original'
si no se especifica el modo en que se solitica el parametro, se asume -por omision- que sera pasado ByRef
ByRef 'consume' menos recursos que ByVal
__ consulta original __
> ... las funciones, asi como el paso por valor o por referencia, me tienen... despistado
> a pesar de leer y releer numerosas explicaciones al respecto no acabo de... "interiorizarlo".
> No acabo de entender (si quitamos el tema del uso en hoja) la diferencia entre funcion y sub.
> La principal explicacion general parece ser que el 1º devuelve un valor
> pero, o yo no tengo claro lo que es un valor... o el sub tambien lo devuelve.
> Y... me da la impresion de que al contrario pasa lo mismo, que una funcion tambien puede devolver algo que no es un valor
> (o quizas que yo creo que no es un valor).
> En cuanto al paso por valor o por referencia tengo la misma sensacion de abstraccion
> tampoco acabo de comprender la diferencia o al menos de fabricarme una explicacion dentro de lo concreto
> (lo que me lleva a pensar que quizas mi problema este en la comprension del concepto valor).
> ... Mas que una consulta parece una reflexion, pero en numerosas ocasiones, estas dudas
Muchas gracias de nuevo, voy a ver si acabo de asimilarlo.