Cambiar una macro

19/05/2008 - 09:04 por Cecilia | Informe spam
Hola a todos
Tengo una macro con la que al escoger en la celda b1 se ejecuta. Ahora
quiero que no se ejecute solo con la celda b1 si no que haya que
escoger la celda b2 también para que se ejecute. Con esta, solo
seleccionando b1 me filtraba los datos que yo quería para cada
sección, ahora lo que quiero es que seleccionando b1+b2 me filtre por
sección (b1) y por responsable (b2), es decir que no se ejecute la
macro si no se han seleccionado las dos celdas.
La macro es la siguiente:
Private Sub Worksheet_Change(ByVal target As Range)
Application.ScreenUpdating = False
Select Case (ActiveSheet.Range("b1").Value)
Case "FRESCOS": Call restablecerhoja
Call ordena1
Rows("4:454").Select
Selection.EntireRow.Hidden = False
Range("C6:e6").Select
Call filtroareas
Range("b1").ClearContents
Range("A4").Select
Case "FRUTA": Call restablecerhoja
Call ordena2
Rows("457:907").Select
Selection.EntireRow.Hidden = False
Range("C459:E459").Select
Call filtroareas
Range("b1").ClearContents
Range("A457").Select
Case "CARNE": Call restablecerhoja
Call ordena3
Rows("910:1360").Select
Selection.EntireRow.Hidden = False
Range("C912:E912").Select
Call filtroareas
Range("b1").ClearContents
Range("A910").Select
Case "CHARCUTERIA": Call restablecerhoja
Call ordena4
Rows("1363:1813").Select
Selection.EntireRow.Hidden = False
Range("C1365:E1365").Select
Call filtroareas
Range("b1").ClearContents
Range("A1363").Select
Case "PAN": Call restablecerhoja
Call ordena5
Rows("1816:2266").Select
Selection.EntireRow.Hidden = False
Range("C1818:E1818").Select
Call filtroareas
Range("b1").ClearContents
Range("A1816").Select
Case "PESCA": Call restablecerhoja
Call ordena6
Rows("2269:2719").Select
Selection.EntireRow.Hidden = False
Range("C2271:E2271").Select
Call filtroareas
Range("b1").ClearContents
Range("A2269").Select
Case "COMIDA PREPARADA": Call restablecerhoja
Call ordena7
Rows("2722:3172").Select
Selection.EntireRow.Hidden = False
Range("C2724:E2724").Select
Call filtroareas
Range("b1").ClearContents
Range("A2722").Select
End Select
Application.ScreenUpdating = True
End Sub
Muchas gracias por vuestra atención y ayuda.
Un saludo
Cecilia

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
19/05/2008 - 14:54 | Informe spam
hola, Cecilia !

Tengo una macro con la que al escoger en la celda b1 se ejecuta.
Ahora quiero que... haya que escoger la celda b2 tambien para que se ejecute.
Con esta, solo seleccionando b1 me filtraba los datos que yo queria para cada seccion
ahora lo que quiero es que seleccionando b1+b2 me filtre por seccion (b1) y por responsable (b2)
es decir que no se ejecute la macro si no se han seleccionado las dos celdas...



1) el codigo que expones se ejecuta NO SOLO por "seleccionar" la celda B1...
sino por CADA CAMBIO que sucede EN CUALQUIER CELDA de la hoja
y la parte del codigo (Select Case...) que se ejecuta es segun el contenido de B1
aunque B1 NO haya sido modificada (me explico):

si B1 contiene PAN (en mayusculas) y modificas cualquier otra celda (no necesariamente B1)...
se ejecuta (repetida y constantemente) el -> Case "PAN": Call restablecerhoja (etc. etc. etc.)

2) por que no expones (de forma general) lo que hacen las macros que llamas en cada caso ?
(es probable que se trate de codigos "repetitivos" que sean sujetos de "cirugia") :))
y comenta tambien porque es "necesario" SELECCIONAR algunas filas y desocultarlas -?-
SIN olvidar comentar cuales son las condicionantes (ahora) para la celda B2 -?-
(supongo que se trata del titulo para autofiltros o filtros avanzados, pero... de cual columna ?)

saludos,
hector.

__ el codigo expuesto __
Private Sub Worksheet_Change(ByVal target As Range)
Application.ScreenUpdating = False
Select Case (ActiveSheet.Range("b1").Value)
Case "FRESCOS": Call restablecerhoja
Call ordena1
Rows("4:454").Select
Selection.EntireRow.Hidden = False
Range("C6:e6").Select
Call filtroareas
Range("b1").ClearContents
Range("A4").Select
Case "FRUTA": Call restablecerhoja
Call ordena2
Rows("457:907").Select
Selection.EntireRow.Hidden = False
Range("C459:E459").Select
Call filtroareas
Range("b1").ClearContents
Range("A457").Select
Case "CARNE": Call restablecerhoja
Call ordena3
Rows("910:1360").Select
Selection.EntireRow.Hidden = False
Range("C912:E912").Select
Call filtroareas
Range("b1").ClearContents
Range("A910").Select
Case "CHARCUTERIA": Call restablecerhoja
Call ordena4
Rows("1363:1813").Select
Selection.EntireRow.Hidden = False
Range("C1365:E1365").Select
Call filtroareas
Range("b1").ClearContents
Range("A1363").Select
Case "PAN": Call restablecerhoja
Call ordena5
Rows("1816:2266").Select
Selection.EntireRow.Hidden = False
Range("C1818:E1818").Select
Call filtroareas
Range("b1").ClearContents
Range("A1816").Select
Case "PESCA": Call restablecerhoja
Call ordena6
Rows("2269:2719").Select
Selection.EntireRow.Hidden = False
Range("C2271:E2271").Select
Call filtroareas
Range("b1").ClearContents
Range("A2269").Select
Case "COMIDA PREPARADA": Call restablecerhoja
Call ordena7
Rows("2722:3172").Select
Selection.EntireRow.Hidden = False
Range("C2724:E2724").Select
Call filtroareas
Range("b1").ClearContents
Range("A2722").Select
End Select
Application.ScreenUpdating = True
End Sub
Respuesta Responder a este mensaje
#2 Cecilia
22/05/2008 - 08:02 | Informe spam
On 19 mayo, 14:54, "Héctor Miguel"
wrote:
hola, Cecilia !

> Tengo una macro con la que al escoger en la celda b1 se ejecuta.
> Ahora quiero que... haya que escoger la celda b2 tambien para que se ejecute.
> Con esta, solo seleccionando b1 me filtraba los datos que yo queria para cada seccion
> ahora lo que quiero es que seleccionando b1+b2 me filtre por seccion (b1) y por responsable (b2)
> es decir que no se ejecute la macro si no se han seleccionado las dos celdas...

1) el codigo que expones se ejecuta NO SOLO por "seleccionar" la celda B1...
    sino por CADA CAMBIO que sucede EN CUALQUIER CELDA de la hoja
    y la parte del codigo (Select Case...) que se ejecuta es segun el contenido de B1
    aunque B1 NO haya sido modificada (me explico):

    si B1 contiene PAN (en mayusculas) y modificas cualquier otra celda (no necesariamente B1)...
    se ejecuta (repetida y constantemente) el -> Case "PAN": Call restablecerhoja (etc. etc. etc.)

2) por que no expones (de forma general) lo que hacen las macros que llamas en cada caso ?
    (es probable que se trate de codigos "repetitivos" que sean sujetos de "cirugia")    :))
    y comenta tambien porque es "necesario" SELECCIONAR algunas filas y desocultarlas    -?-
    SIN olvidar comentar cuales son las condicionantes (ahora) para la celda B2    -?-
    (supongo que se trata del titulo para autofiltros o filtros avanzados, pero... de cual columna ?)

saludos,
hector.

__ el codigo expuesto __
Private Sub Worksheet_Change(ByVal target As Range)
  Application.ScreenUpdating = False
        Select Case (ActiveSheet.Range("b1").Value)
Case "FRESCOS": Call restablecerhoja
Call ordena1
Rows("4:454").Select
Selection.EntireRow.Hidden = False
    Range("C6:e6").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A4").Select
Case "FRUTA": Call restablecerhoja
Call ordena2
Rows("457:907").Select
Selection.EntireRow.Hidden = False
    Range("C459:E459").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A457").Select
Case "CARNE": Call restablecerhoja
Call ordena3
Rows("910:1360").Select
Selection.EntireRow.Hidden = False
    Range("C912:E912").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A910").Select
Case "CHARCUTERIA": Call restablecerhoja
Call ordena4
Rows("1363:1813").Select
Selection.EntireRow.Hidden = False
    Range("C1365:E1365").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A1363").Select
Case "PAN": Call restablecerhoja
Call ordena5
Rows("1816:2266").Select
Selection.EntireRow.Hidden = False
    Range("C1818:E1818").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A1816").Select
Case "PESCA": Call restablecerhoja
Call ordena6
Rows("2269:2719").Select
Selection.EntireRow.Hidden = False
    Range("C2271:E2271").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A2269").Select
Case "COMIDA PREPARADA": Call restablecerhoja
Call ordena7
Rows("2722:3172").Select
Selection.EntireRow.Hidden = False
    Range("C2724:E2724").Select
    Call filtroareas
    Range("b1").ClearContents
    Range("A2722").Select
    End Select
    Application.ScreenUpdating = True
End Sub



Hola Hector,
Perdón por la tardanza, no he tenido mucho tiempo..., te cuento

Tienes mucha razón, el código se ejecuta por cada cambio en cualquier
celda :( , como soy novatisima en esto (y todo lo he ido cogiendo de
aqui y de allá) me ha quedado este codigo tan espeso y por eso tuve
que añadir lo de "Range B1.ClearContents" para que borrara el
contenido de la celda y el código no se siguiera ejecutando.

El motivo de que sea necesario el que las filas se oculten, es que
cuando seleccionen la sección solo quieren ver esa sección en concreto
y las demás deben estar ocultas (además protegeré la hoja), por eso la
distinción de rangos, ya que "FRESCOS" esta en rango "4:454", "FRUTA"
en "457:907", etc...

En la celda B2, quiero poder seleccionar el responsable, "Jefe
Sección", "Jefe Area" o "Ambos", para esto, filtro la columna E,
modificando el código "filtroareas" que tengo ahora así:

Sub filtroareas()
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="<>-"
End Sub

Cambiaría a este otro:

Sub filtroareas()
Selection.AutoFilter Field:=1, Criteria1:="<>-"
Selection.AutoFilter Field:=3, Criteria1:=Range("B2").Value
End Sub


Muchas gracias por tu atención
Un saludo
Cecilia
Respuesta Responder a este mensaje
#3 Héctor Miguel
22/05/2008 - 14:34 | Informe spam
hola, Cecilia !

1) si ya estas usando (auto)filtros por codigo, considera que no es necesario...
- ni mantener el listado de datos con algun (cierto) orden preestabecido
- ni que le ayudes a los autofiltros a des/re/ocultar las filas (esta es su chamba)

2) si los datos se inician en la fila 4 (asumo que los titulos estan en la fila 3 ?)
Y... los "criterios" los tendras en en rango B1:B2 ("pegados" a la fila de los titulos)...

a) INSERTA una fila en blanco (en la fila 3 entre criterios y titulos) para separar las dos areas
b) prueba con las siguientes instrucciones que deberas copiar/pegar EN el modulo de codigo de "esa" hoja
(haz un clic-secundario sobre la etiqueta con su nombre y seleciona "ver codigo")

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("b1:b2")) Is Nothing Then Exit Sub
Dim Col As Byte, Criterio
With Target.Cells(1, 1)
Col = IIf(.Address = "$B$1", 1, 3)
Criterio = .Value
End With
If Criterio = "" _
Then Range("a4").AutoFilter Col _
Else Range("a4").AutoFilter Col, Criterio
End Sub

3) si vas a proteger "la hoja" (suponiendo que se llama "hoja1") agrega...
- en el modulo de codigo del libro (ThisWorkbook) las siguientes instrucciones:

Private Sub Workbook_Open()
Worksheets("Hoja1").Protect _
PassWord:="la MIsMa cLavE qUe lE pUsISte", _
UserInterfaceOnly:=True
End Sub

OJO: "sobra" mencionar que primero deberas desproteger las celdas B1 y B2 :D

(practicamente) TODO lo que hagas por codigo... pasara sin problemas
(excepto ciertas cosillas relacionadas con ordenaciones, insertar filas/columnas y objetos incrustados)

si cualquier duda (o informacion adicional).. .comentas ?
saludos,
hector.

__ la consulta original __
El motivo de que sea necesario el que las filas se oculten, es que cuando seleccionen la seccion
solo quieren ver esa seccion en concreto y las demas deben estar ocultas (ademas protegere la hoja)
por eso la distincion de rangos, ya que "FRESCOS" esta en rango "4:454", "FRUTA" en "457:907", etc...

En la celda B2, quiero poder seleccionar el responsable, "Jefe Seccion", "Jefe Area" o "Ambos"
para esto, filtro la columna E, modificando el codigo "filtroareas" que tengo ahora asi:

Sub filtroareas()
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="<>-"
End Sub

Cambiaria a este otro:

Sub filtroareas()
Selection.AutoFilter Field:=1, Criteria1:="<>-"
Selection.AutoFilter Field:=3, Criteria1:=Range("B2").Value
End Sub
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida