none
Manejo de Excel RRS feed

  • Pregunta

  • Buen día, Ojala puedan ayudarme con un problema que tengo, tengo el siguiente código para abrir un archivo en una hoja especifica y la hoja cambia según el botón que se presione
     Sub AbrirHoja(archivo As String, num As Integer)
            Dim aplica As New Excel.Application
            Dim libro As Excel.Workbook = aplica.Workbooks.Open(archivo)
            Dim hoja As Excel.Worksheet = CType(libro.Worksheets.Item(num), Excel.Worksheet)
    
            hoja.Select()
            aplica.Visible = True
            aplica.OnWindow = True
        End Sub
     ' BOTÓN ENERO'
       
     Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)     
            ruta1 = My.Computer.FileSystem.CurrentDirectory + "\AdmonGen1.xlsm"
            RUT1 = ruta1
            AbrirHoja(RUT1, 1)
        End Sub
        ' BOTÓN FEBRERO'
        
    Private Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
            ruta1 = My.Computer.FileSystem.CurrentDirectory + "\AdmonGen1.xlsm"
            RUT1 = ruta1
            AbrirHoja(RUT1, 2)
        End Sub
     
    El código original abarca hasta diciembre pero se haría muy largo, ahora la cuestión es que mi archivo es muy grande, por lo que tarda en abrir hasta 10 segundos o más, lo que quiero sería de alguna manera iniciar la aplicación y abrir el archivo antes y dejar excel minimizado y al hacer click en el botón "enero" o "febrero me seleccione la hoja correspondiente y me aparezca maximizado excel, para que no tenga que abrir el archivo de nuevo cada vez que cambia de mes, Espero haberme explicado correctamente y me pudieran ayudar, de antemano gracias.
    sábado, 17 de enero de 2015 18:18

Respuestas

  • Imports excel
    
    Public Class Form1
        Dim WithEvents aplica As Excel.Application
        Dim libro As Excel.Workbook
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            aplica = New Excel.Application
            libro = aplica.Workbooks.Open("archivo.xls")
            aplica.Visible = True
            aplica.WindowState = XlWindowState.xlMinimized
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            AbrirHoja(1)
            aplica.WindowState = XlWindowState.xlNormal
            'aplica.OnWindow = True
        End Sub
    
        Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
            RemoveHandler aplica.WorkbookBeforeClose, AddressOf NoCerrar
            libro.Close()
            aplica.Quit()
        End Sub
    
        Sub AbrirHoja(num As Integer)
            Dim hoja As Excel.Worksheet = CType(libro.Worksheets.Item(num), Excel.Worksheet)
            hoja.Select()
            'aplica.OnWindow = True
        End Sub
    
        Sub NoCerrar(wb As Workbook, ByRef cancel As Boolean) Handles aplica.WorkbookBeforeClose
            cancel = True
        End Sub
    
    End Class
    


    No me queda claro el propósito del OnWindow, por eso no sé dónde ubicarlo.

    sábado, 17 de enero de 2015 19:26

Todas las respuestas

  • Hola,

    Al iniciar la aplicación podrías abrir el archivo dejándolo en un estado visible = false y luego mostrarlo. Esto no es recomendable porque ¿qué pasa si nunca haces uso del archivo en mención? además que esa misma demora que experimentas al momento de abrir el archivo se lo cargarás al momento de iniciar la aplicación. Bajo este escenario puedes hacer dos cosas, la primera es que abras por única vez el archivo y luego interactues con el para cambiar de hoja, lo cuál me parecería ilógico, ya que si el archivo ya se encuentra abierto, ¿para qué quisiera el usuario cambiar de hojas desde la aplicación y no de manera directa desde MS Excel?.

    Lo segundo, notando que cada botón abre una hoja distinta del mismo archivo, ¿Por qué no crear un archivo distinto por hoja?. Ello hará que la carga no sea tan pesada como mencionas.


    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales P.
    Arequipa - Perú


    sábado, 17 de enero de 2015 18:38
  • hola

    en el objeto Excel.Application puedes indicar si quieres que se muestre o no la aplicacion

    C# show hide Excel window

    es mas tienes eventos que podrias utilizar

    Application events

    lo que no estoy seguro es si hay alguno que indique cuando termina de abrir el excel, digo para ponerlo en visible

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 17 de enero de 2015 18:56
  • Y me podrías dar un ejemplo sobre el código que pondrías en mi botón1 para que me seleccione la Hoja1? la causa de la pregunta es que desconozco el código para que seleccione esa hoja y pues imagino que después de eso podría poner esto:

    aplica.Visible = True
            aplica.OnWindow = True

     para que mi libro sea visible.

    Por cierto, Saludos Leandro! Las respuestas que has dado a otras preguntas de más personas me han ayudado a ir aprendiendo desde lo mas básico cuando empecé, eres un gran colaborador! :D

    sábado, 17 de enero de 2015 19:03
  • Hola

    No se hace el cambio desde excel porque en el inicio de excel tengo un código que me limpia toda la interfaz, dejándome sin la posibilidad de hacer cambios de hoja desde excel ya que también oculta la barra de hojas la idea de esto es limpiar de información innecesaria la aplicación de excel y que el acceso sea desde mi aplicación de visual ya que no quiero que el usuario de mi aplicación pueda vagar libremente por las hojas si no que solo pueda accesar a las que yo le permito desde mi aplicación de visual ya que hay hojas con información que el usuario no debe ver, esa es la razon de porque quiero el cambio de hoja desde mi aplicación, ahora, si pensé en el evento de inicio de mi aplicación abriera el libro pero desconozco el código que debo colocar en mi botón "enero" por ejemplo, te molestaría un ejemplo de como interactuaría el botón "enero" para que me seleccione la hoja1?

    Ahora, no hago un archivo distinto por hoja porque mis hojas interactuan entre ellas llevando y trayendo datos, si las hago libros distintos me demora mas la carga y apertura de datos.

    sábado, 17 de enero de 2015 19:03
  • hola

    pero el problema no era que el excel tardaba en cargar? no entendi que tiene que ver el boton enero con el problema de carga

    usando

    How to: Programmatically Select Worksheets

    podrias indicar que nombre de sheet debe activarse

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 17 de enero de 2015 19:07
  • Imports excel
    
    Public Class Form1
        Dim WithEvents aplica As Excel.Application
        Dim libro As Excel.Workbook
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            aplica = New Excel.Application
            libro = aplica.Workbooks.Open("archivo.xls")
            aplica.Visible = True
            aplica.WindowState = XlWindowState.xlMinimized
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            AbrirHoja(1)
            aplica.WindowState = XlWindowState.xlNormal
            'aplica.OnWindow = True
        End Sub
    
        Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
            RemoveHandler aplica.WorkbookBeforeClose, AddressOf NoCerrar
            libro.Close()
            aplica.Quit()
        End Sub
    
        Sub AbrirHoja(num As Integer)
            Dim hoja As Excel.Worksheet = CType(libro.Worksheets.Item(num), Excel.Worksheet)
            hoja.Select()
            'aplica.OnWindow = True
        End Sub
    
        Sub NoCerrar(wb As Workbook, ByRef cancel As Boolean) Handles aplica.WorkbookBeforeClose
            cancel = True
        End Sub
    
    End Class
    


    No me queda claro el propósito del OnWindow, por eso no sé dónde ubicarlo.

    sábado, 17 de enero de 2015 19:26
  • Correcto, el problema es que tarda en abrir, la solución que vi fue que inicie el archivo al iniciar la aplicación y declare visible en false,  pero el botón "enero" es en si la solución de como interactuaria con el libro (ya abierto) y lo haga visible y seleccione además la hoja1, trate de solucionarlo con lo que me diste y lo que tengo es lo siguiente:

      Dim ruta1 As String
        Dim RUT1 As String
        Dim actual As Integer
        Dim aplica As New Excel.Application
        Dim libro As Excel.Workbook = aplica.Workbooks.Open(archivo)
        Dim archivo As String

    Public Sub New()

    InitializeComponent() ruta1 = My.Computer.FileSystem.CurrentDirectory + "\AdmonGen1.xlsm" RUT1 = ruta1 AbrirHoja(RUT1, 1) End Sub

     Sub AbrirHoja(archivo As String, num As Integer)

            Dim hoja As Excel.Worksheet = CType(libro.Worksheets.Item(num), Excel.Worksheet)
            hoja.Select()
            aplica.Visible = False
            aplica.OnWindow = False
        End Sub

     ' BOTÓN ENERO'
        Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)     
            ruta1 = My.Computer.FileSystem.CurrentDirectory + "\AdmonGen1.xlsm"
            RUT1 = ruta1
            archivo = RUT1
            CType(libro.Worksheets(1), Excel.Worksheet).Select()
            aplica.Visible = True
            aplica.OnWindow = True
        End Sub

    Pero algo debo estar haciendo mal porque no hace lo que planee que haría.


    sábado, 17 de enero de 2015 19:29
  • Gracias Walter, tu respuesta me ayudó a terminar de resolverlo, también gracias a todos los que se tomarón la molestia de responder, por si después alguien necesita el código, esta es la manera en que quedó:

    Dim WithEvents aplica As Excel.Application
    Dim libro As Excel.Workbook
    
        Public Sub New()
            InitializeComponent()
            aplica = New Excel.Application
            Dim ruta1 As String
            ruta1 = My.Computer.FileSystem.CurrentDirectory + "\AdmonGen1.xlsm"
            libro = aplica.Workbooks.Open(ruta1)
            aplica.Visible = True
            aplica.WindowState = XlWindowState.xlMinimized
        End Sub
        
    Sub AbrirHoja(num As Integer)
            Dim hoja As Excel.Worksheet = CType(libro.Worksheets.Item(num), Excel.Worksheet)
            hoja.Select()
            aplica.OnWindow = False
        End Sub
        
    Sub NoCerrar(wb As Workbook, ByRef cancel As Boolean) Handles aplica.WorkbookBeforeClose
            cancel = True
        End Sub
        
        Private Sub Window_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) 'SALIR DE VENTANA'
            RemoveHandler aplica.WorkbookBeforeClose, AddressOf NoCerrar
            libro.Close()
            aplica.Quit()
        End Sub
        
    ' BOTÓN ENERO'
        Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
            AbrirHoja(1)
            aplica.WindowState = XlWindowState.xlNormal
            aplica.OnWindow = True
        End Sub

    De nuevo, gracias a todos.


    sábado, 17 de enero de 2015 19:44