2011-07-04 18 views
5

Soy un poco nuevo en la programación en VBA. Leí algunas cosas en Internet pero no pude encontrar lo que necesitaba o no pude hacerlo funcionar. mi problema:macro para Ocultar filas en excel 2010

en la hoja de trabajo 'hoja 1' en la celda B6 se da un valor de cuántos años se explotará un proyecto.

en las hojas de trabajo 'hoja 2' y 'hoja 3' hice una hoja de cálculo por 50 años (año 1 al año 50, fila 7 a la fila 56).

en la celda b6 en 'hoja 1' quiero ingresar un valor entre 1 y 50. cuando el valor es 49 quiero ocultar la fila 56 en 'hoja2' y 'hoja 3'. cuando el valor es 48 quiero ocultar las filas 55:56 en 'hoja2' y 'hoja 3', y así sucesivamente. esto es lo que tengo hasta ahora, pero no puedo conseguir que funcione automaticamente cuando cambio el valor en la celda B6:

Sub test1() 
    If Range("sheet1!B6") = 50 Then 
    Rows("52:55").EntireRow.Hidden = False 
    Else 
    If Range("sheet1!B6") = 49 Then 
    Rows("55").EntireRow.Hidden = True 
    Else 
    If Range("sheet1!B6") = 48 Then 
    Rows("54:55").EntireRow.Hidden = True 

    End If: End If: End If: 

    End Sub 

espero que alguien me puede ayudar con mi problema.

Gracias

Respuesta

4

Casi lo tienes. Está ocultando las filas dentro de la hoja activa. lo cual está bien Pero una mejor manera sería agregar dónde está.

Rows("52:55").EntireRow.Hidden = False 

convierte

activesheet.Rows("52:55").EntireRow.Hidden = False 

que he tenido ocurren cosas extrañas sin ella. En cuanto a hacerlo automático. Necesita usar el evento worksheet_change dentro de la macro de la hoja en el editor de VBA (no en los módulos, haga doble clic en la hoja1 a la izquierda del editor). Dentro de esa hoja, use el menú desplegable justo encima del editor en sí (debe haber 2 listboxes). El cuadro de lista a la izquierda tendrá los eventos que estás buscando. Después de eso solo arroje la macro. Debería verse como el siguiente código,

Private Sub Worksheet_Change(ByVal Target As Range) 
test1 
end Sub 

Eso es todo. Cada vez que cambie algo, ejecutará la macro prueba1.

+1

Nota: por cosas extrañas, por ejemplo, si ActiveSheet ya no se refiere a la hoja usted piensa que lo hace, debido a un cambio en el cuaderno de trabajo o contexto hoja de trabajo, entonces será ocultando algunas otras filas hojas (52 : 55) que hará que parezca que no funcionó. –

5

¡Bien, estás en el camino correcto, Benno!

Hay algunos consejos sobre la programación de VBA que pueden serle útiles.

1- Utilice siempre referencias explícitas a la hoja con la que desea interactuar. De lo contrario, Excel puede 'asumir' que su código se aplica a la hoja activa y eventualmente verá que atornilla su hoja de cálculo.

2- Como lo mencionó anteriormente, póngase en contacto con los métodos nativos que Excel ofrece. Puede usarlos en la mayoría de sus trucos.

3- Declara explícitamente tus variables ... mostrarán la lista de métodos que cada objeto ofrece en VBA. Puede ahorrarle tiempo extrayendo en Internet.

Ahora, vamos a tener un proyecto de código ...

Recuerde este código debe estar dentro del objeto hoja de Excel, como se explica por lionz. Solo se aplica a la Hoja 2, depende de usted adaptarla tanto a la Hoja 2 como a la Hoja 3 de la manera que prefiera.

Espero que ayude!

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim oSheet As Excel.Worksheet 

    'We only want to do something if the changed cell is B6, right? 
    If Target.Address = "$B$6" Then 

     'Checks if it's a number... 
     If IsNumeric(Target.Value) Then 

      'Let's avoid values out of your bonds, correct? 
      If Target.Value > 0 And Target.Value < 51 Then 

       'Let's assign the worksheet we'll show/hide rows to one variable and then 
       ' use only the reference to the variable itself instead of the sheet name. 
       ' It's safer. 

       'You can alternatively replace 'sheet 2' by 2 (without quotes) which will represent 
       ' the sheet index within the workbook 
       Set oSheet = ActiveWorkbook.Sheets("Sheet 2") 

       'We'll unhide before hide, to ensure we hide the correct ones 
       oSheet.Range("A7:A56").EntireRow.Hidden = False 

       oSheet.Range("A" & Target.Value + 7 & ":A56").EntireRow.Hidden = True 

      End If 

     End If 

    End If 

End Sub 
Cuestiones relacionadas