Autor Tema: Visual Basic.NET 2010 Abrir archivo Excel y Eliminar Columnas o filas de rango  (Leído 3290 veces)

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas tardes compis!

Estoy intentado desde Visual Studio 2010 Express abrir Excel y eliminar las columnas E, F y G, y no consigo lanzar el proceso.

He creado un botón el cuál me permite abrir Excel, pero no me permite eliminar la columna ya que me da error en el código cuando trato de implementar la opción de que elimine la columna.

Utilizo el siguiente código para abrir Excel y eliminar la columna:

Dim Proceso As New Process
Proceso.Startinfo.FileName = "ruta.xls"
Proceso.Start()

With objExcel
.Range("C1").Select
.Selection.EntireColumn.Delete
End With

Pero justo en la línea "With objExcel" me da error...

Se que hay algo que no estoy haciendo bien, pero no se que es...

¿Podrían ayudarme con este tema?

Muchas gracias,

Un saludo cordial.
« Última modificación: 07 de Noviembre 2020, 19:19 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Re: Abrir Excel y Eliminar Columnas
« Respuesta #1 en: 06 de Noviembre 2020, 19:52 »
Buenas y bienvenido. Como primera recomendación siempre ponemos leer este hilo: https://aprenderaprogramar.com/foros/index.php?topic=1460.0 y seguir las pautas que ahí se dan. Poner títulos descriptivos, incluir el nombre del lenguaje que se esté utilizando y palabras clave, etc.
No has incluido todo el código. ¿Dónde tienes definido objExcel? Pega el código utilizando las etiquetas code como se indica en el hilo. Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Re: Abrir Excel y Eliminar Columnas
« Respuesta #2 en: 06 de Noviembre 2020, 19:57 »
Buenas!

Disculpa, no había visto ese hilo.. voy  a echarle un ojo ahora!

Estoy utilizando C++, desde Visual Studio 2017.
En referencia al código, ese es todo el código que tengo escrito y definido para abrir el Excel y eliminar las columnas que necesito quitar, no tiene más, puede ser el motivo de que no me funcione?

Está escrito así por las referencias que he cogido via internet ya que no suelo trabajar con excel para realizar este tipo de tareas, pero estoy tratando desde Visual Studio 2017 o 2010, hacer que desde un botón me permita abrir un excel en concreto y me elimine ciertas columnas que tengo ahí, por eso he buscado referencias de como abrir un excel y como eliminar ciertas columnas e introducido ese código...

¿Podrías echarme un cable con esto?

Muchas gracias,

Un saludo cordial.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Re: Abrir Excel y Eliminar Columnas
« Respuesta #3 en: 06 de Noviembre 2020, 20:04 »
¿C++? Yo diría que aparentemente es Visual Basic. Si no lo has hecho lo más básico es ejecutar un programa de prueba. ¿Lo has ejecutado? Aparte de aclarar bien en qué lenguaje estás trabajando... Eso no parece que sea código suficiente para poder ejecutar nada. ¿Con qué lenguajes estás habituado a trabajar?

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Re: Abrir Excel y Eliminar Columnas
« Respuesta #4 en: 06 de Noviembre 2020, 20:29 »
Primero de todo muchas gracias por tu rapidez!

Y si, es Visual Basic y solo estoy acostumbrado a trabajar con ese lenguaje.

He tratado de ejecutar la prueba y solo se me abre Excel pero no ejecuta el comando para eliminar las columnas...

Creo que el error es mío y del código entero, no?

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Re: Abrir Excel y Eliminar Columnas
« Respuesta #5 en: 07 de Noviembre 2020, 19:18 »
Buenas, es fundamental que pegues el código que estés usando con las etiquetas code, de otra manera no podemos tener idea de lo que estás haciendo. ¿Cómo sabes que te abre el excel?

Aquí tienes un ejemplo de acceso a una hoja excel desde Visual Basic: https://aprenderaprogramar.com/foros/index.php?topic=6463.0

El borrado de una columna se puede hacer con algo como xlSheet.Columns(i).delete donde i es el número que identifica a la columna

Este es un ejemplo que he encontrado sobre manejo de diferentes maneras (eliminar filas, eliminar columnas, etc.):

Código: [Seleccionar]
Dim xlWB As Excel.Workbook = CType(Globals.ThisWorkbook.Application.ActiveWorkbook, Excel.Workbook)
Dim xlWSPosition As Excel.Worksheet = CType(CType(xlWB.Sheets("byPosition"), Excel.Worksheet), Excel.Worksheet)
Dim xlWSEmployee As Excel.Worksheet = CType(CType(xlWB.Sheets("byEmployee"), Excel.Worksheet), Excel.Worksheet)     

Dim xlSheets As Object
        Dim xlSheetsArray(0 To 1) As Excel.Worksheet
        Dim k As Long
        Dim i As Long

        xlSheetsArray(0) = xlWSPosition
        xlSheetsArray(1) = xlWSEmployee


        For Each xlSheets In xlSheetsArray

            With xlSheets


                'Eliminar las primeras 7 filas para las hojas indicadas
                .Rows("1:7").Delete(Excel.XlDirection.xlUp)


                k = .UsedRange.Columns.Count

                'Para las hojas indicadas borrar todas las columnas excepto las que se citan

                For i = k To 1 Step -1
                    Select Case LCase(.UsedRange.Cells(1, i).Value)

                        'Keep these columns
                        Case "nombre", "numeroDocuento", "salario", _
                         "centroTrabajo", "Base anual", "Base quinquenal"

                        Case Else

                            'Borrar todas las columnas cuyo nombre no se encuentre arriba
                            .UsedRange.Columns(i).Delete()

                    End Select
                Next i

            End With

        Next xlSheets

    End Sub

Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas!

Muchas gracias por el cable que me estas echando! :)

He intentado lanzar primero el código para que me abra Excel y me aparece como cargando pero no me acaba de abrir el documento... pero revisando lo que me enviaste más algún articulo que he visto por internet y he visto que está bien escrito y todo, pero no me abre el documento cuando hago click sobre el botón creado en Visual Studio 2017! El código es el siguiente, mira:


Imports Excel = Microsoft.Office.Interop.Excel

Public Class VFMic
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim objXLApp As Excel.Application
        Dim objXLWb As Excel.Workbook
        Dim objXLWs As Excel.Worksheet

        objXLApp = New Excel.Application
        objXLApp.Workbooks.Open("C:\Users\HP1\Desktop\PRUEBA ESTADOS\Excel.xlsx")
        objXLWb = objXLApp.Workbooks(1)
        objXLWs = objXLWb.Worksheets(1)

    End Sub
End Class

Sigo sin conseguir que abra el documento... y veo que está todo bien, no?

Ante todo muchísimas muchísimas gracias por la ayuda!

Salu2 :)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Buenas, el código no lo has pegado como se explica en https://aprenderaprogramar.com/foros/index.php?topic=1460.0 Léelo, por favor, ahí está explicado cómo debe pegarse el código en los foros y resto de cuestiones a tener en cuenta Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Ups, si disculpa!

He podido conseguir al final lo que necesitaba, a través de Macros desde el documento de Excel, el problema ahora, es que intento crear un botón en Visual Studio 2017 que me permita lanzar la Macro creada en ese Excel y no encuentro ninguna referencia...

¿Me podrías echar un cable?

He buscado referencias por internet pero solo nombran maneras de como lanzar la Macro desde Excel, pero quiero crear un programa con VStudio 2017 que al darle clic al botón, me ejecute la Macro creada en Excel...

Gracias de ante mano! :)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Buenas, es fundamental que pegues el código con el que estés trabajando, usando las etiquetas code para que pueda ser leído como código. Si no pegas el código es muy difícil tener una idea de qué estamos hablando. Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas!

He lanzado este código dentro de un modulo de Excel para ejecutar lo que necesitaba:

Código: [Seleccionar]

Sub test()

Set thiswb = ThisWorkbook


Sheets.Add
ActiveSheet.Name = "lista"

Sheets("BBDD").Select
Columns("P").Copy
Sheets("lista").Select
Range("A1").PasteSpecial xlPasteAll
Range("A:A").RemoveDuplicates Columns:=1, Header:=xlYes


For i = 2 To 124

    Set newwb = Workbooks.Add
    thiswb.Activate
   
    Sheets("lista").Select
    COMERCIAL = Range("A" & i).Value
   
    Sheets("BBDD").Select
    Rows(1).Select
    Selection.AutoFilter Field:=16, Criteria1:=COMERCIAL

    Range("A1:AI" & Range("A" & Rows.Count).End(xlUp).Row).Copy

    newwb.Activate
    Range("A1").PasteSpecial
    Sheets("Hoja1").Name = "BBDD"

    ActiveWorkbook.SaveAs Filename:="C:\Users\HP25\Desktop\TEST\" & COMERCIAL & ".xlsx"
    ActiveWorkbook.Close

    thiswb.Activate

    Rows(1).AutoFilter

Next

thiswb.Activate
Sheets("lista").Delete

End Sub


Y en Excel, he agregado un botón con formulario para que me ejecute este código.

Mi pregunta es: ¿Podría crear una aplicación con Visual Studio 2017, que al hacer click en el botón "Lanzar" me ejecute lo que tengo en ese modulo o bien ejecute el botón creado en VBA en Excel que hace que se ejecute lo que tengo en el modulo?

En Visual Studio 2017 he creado un botón y sólo tengo lo siguiente en código:

Código: [Seleccionar]

Public Class test
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


    End Sub
End Class


Ahora solo me queda este paso, que es desde Visual Studio, cuando haga click en el botón "Lanzar" me ejecute lo del modulo o bien lo del botón que a su vez ejecutará el modulo... pero no tengo ni idea de como lanzarlo desde Visual Studio...

¿Podrías echarme un cable con esto?

Mil gracias! :)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Buenas, entiendo que sí debería poderse realizar lo mismo que has hecho con VBA desde Excel que desde Visual Basic, aunque habría que hacer pruebas a ver cómo. Tienes que tener en cuenta que Visual Basic no "abre" el fichero en el sentido de que tú lo veas abrirse en el computador (al menos esto no es lo habitual). Visual Basic cuando abre un fichero es para manipulación sin que tú veas el Excel abierto y sin que tú veas los cambios en el fichero. Los cambios los verás después de ejecutado el código cuando vuelvas a abrir el fichero. Por ejemplo supón que un fichero de excel contiene en la primera celda "trigo" y en la segunda "cebada". Ahora tú corres un código en Visual Basic y modificas el fichero para que la segunda celda contenga "centeno". Cuando ejecutas el código, tú no verás abrirse el fichero ni verás nada. Puedes ver un mensaje de confirmación si tú mismo lo incluyes en el código. Y luego de ejecutado, podrás abrir el archivo y ver los cambios de lo que ha hecho Visual Basic.
El código que te indiqué antes y que pego a continuación es un ejemplo de manipulación de un fichero.

Código: [Seleccionar]
Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label1.Text = ""
        Label1.AutoSize = False
    End Sub
   
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim objXLApp As Excel.Application
        Dim intLoopCounter As Integer
        Dim objXLWb As Excel.Workbook
        Dim objXLWs As Excel.Worksheet
        Dim objRange As Excel.Range

        objXLApp = New Excel.Application
        objXLApp.Workbooks.Open("C:\Users\Juan\CursoVB\semana6\ejemploSemana6.xlsx")
        objXLWb = objXLApp.Workbooks(1)
        objXLWs = objXLWb.Worksheets(1)
        MsgBox("Ahora la celda A5 contiene: " & objXLWs.Cells(5, 1).value)
        For intLoopCounter = 1 To CInt(objXLWs.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row)
            objRange = objXLWs.Range("A" & intLoopCounter)
            Label1.Text = Label1.Text & vbCrLf & objRange.Value
            objRange = objXLWs.Range("B" & intLoopCounter)
            Label1.Text = Label1.Text & " -- > " & objRange.Value
        Next intLoopCounter

        'Escribimos en el fichero
        objXLWs.Cells(5, 1) = "Rembrandt"
        MsgBox("Ahora la celda A5 contiene: " & objXLWs.Cells(5, 1).value)
        objXLApp.Quit()
    End Sub

End Class

Lo que te recomendaría es que te crees un Excel para hacer pruebas, por ejemplo mete datos cualquiera en las celdas A1, A2... A10, B1, B2, ... B10 y así hasta H1, H2... H10 y ejecuta este código (tendrás que tener creado un proyecto con un formulario, un label y un button, y cambiar cosas como la ruta del fichero en el código), y comprueba si te funciona.

Si te funciona, empieza a sustituir el código para que en lugar de ejecutar este ejemplo, haga lo que tú quieres.

Si no has trabajado con Visual Basic, aquí tienes un curso básico: https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61

Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas!!

Al final, he creado un archivo *.bat que me permite abrir el Excel y lanzar la macro creada en el programa y ejecutar todo lo escrito, así que genial! Mil mil gracias!

Para terminar de pedirte ayuda, sabrías como podría determinar en este archivo *.bat que documento de Excel abrir, en vez de abrir uno en concreto?

He estado investigando y según algunos foros por la instrucción GetOpenFileName se debería poder, pero no consigo ejecutarlo de tal manera que cuando se abra el archivo*.bat me pregunte que archivo quiero abrir en vez de abrir uno en concreto, de hecho, te pego el código que tengo en el *.bat para que veas la referencia de la macro y del archivo en concreto que abro...

Código: [Seleccionar]

Dim xlApp
Dim xlBook

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Users\HP25\Desktop\BBDD_ORANGE_copia_alex_copia.xlsm", 0, True)
xlApp.Run "test"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing


He probado con dejar solo el "xlApp.Workbooks.Open" sin la ruta especificada, pero no me abre la ventana preguntando que archivo quiero elegir para abrir y lanzar la macro...

Mil gracias de antemano!!! :)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Buenas, el código que has puesto parece más visual basic que bash. Habría que probar. Supuestamente en un bat algo como

Código: [Seleccionar]
@echo off
set /p UserInputPath=Indique la ruta al fichero:
Set xlBook = xlApp.Workbooks.Open(%UserInputPath%, 0, True)

Pero esto te pediría que teclearas la ruta al fichero, no elegirlo a través de una ventana.


Desde Visual Basic sí se puede pedir la elección de fichero con algo como

Código: [Seleccionar]
Dim fd As OpenFileDialog = New OpenFileDialog()
Dim strFileName As String

fd.Title = "Open File Dialog"
fd.InitialDirectory = "C:\"
fd.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
fd.FilterIndex = 2
fd.RestoreDirectory = True

If fd.ShowDialog() = DialogResult.OK Then
   strFileName = fd.FileName
End If

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenos días!!

Genial! El código que me pasaste con VBasic me funciona casi a la perfección!
El problema es que cuando me sale el cuadro de dialogo donde tengo que seleccionar el archivo, cuando le hago doble click o bien le doy a Abrir, no me abre el documento... le he añadido el complemento de OpenFileDialog y sigue sin funcionar, no me abre el documento Excel...

Alguna idea de que puede estar mal o que puedo estar haciendo mal?

Muchas gracias! :)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Creo que no me he explicado bien, en el sentido de que parece que estás esperando que desde Visual Basic te abra el documento Excel para verlo tú en la pantalla. Visual Basic y el resto de  lenguajes de programación normalmente no se utilizan para esto. El uso más habitual de Visual Basic es la apertura del fichero para su manipulación a nivel de datos. Tú eliges el fichero que quieres manipular desde Visual Basic y lo manipulas mediante código. De este modo el fichero queda manipulado y la siguiente vez que lo abras verás los cambios que desde Visual Basic se hayan hecho. Lo que no se suele hacer es que Visual Basic te abra el fichero para verlo tú en la pantalla como si lo estuvieras abriendo como usuario. Por tanto, lo normal es seleccionar el fichero para que se ejecuten determinadas instrucciones, pero el fichero no se te abrirá para verlo en pantalla. Puedes ver ejemplos de manipulación básica de ficheros con Visual Basic en el curso https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61
Salu2.

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas!

Vale, ahora lo entiendo mejor... Muchas gracias!

Entonces debería poder aplicar en el código que me pregunte qué archivo Excel quiero abrir y que me ejecute la Macro que tenga en el Excel "X", no?

He estado investigando y no encuentro la manera de decir en Visual Studio 2017 que seguidamente de hacer esto:

Código: [Seleccionar]
Dim fd As OpenFileDialog = New OpenFileDialog()
Dim strFileName As String

fd.Title = "Open File Dialog"
fd.InitialDirectory = "C:\"
fd.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
fd.FilterIndex = 2
fd.RestoreDirectory = True

If fd.ShowDialog() = DialogResult.OK Then
   strFileName = fd.FileName
End If

me ejecute el siguiente código (este código lo tengo un archivo *.bat que hace que me ejecute la macro "test") pero está escrito en VBasic, cuándo lo pongo en Visual Studio seguidamente del código anterior no me ejecuta bien la macro:

Código: [Seleccionar]
Dim xlApp
Dim xlBook

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Users\HP25\Desktop\BBDD_copia_alex_copia.xlsm", 0, True)
[b]xlApp.Run "test"
xlBook.Close
xlApp.Quit[/b]

Set xlBook = Nothing
Set xlApp = Nothing

Sabrías como decirle que al ejecutar el primer código y me abra el Excel, que me ejecute la macro "test" y se cerrase el archivo sin tener el *.bat por el medio?
Entiendo que de lanzar así código en Visual Studio, debería poder decirle que cuando decida que Excel abrir, me ejecute "X" macro dentro del Excel y cierre, no?
El problema que no se como decirle en código que al hacer lo que te he mostrado en el primero código, una vez elija que Excel haya abierto me ejecute la macro "test" o no encuentro el recurso para ello!
¿Sabrías como decirle en código que haga algo así?

Muchas gracias! :)

Muchas gracias! :)
« Última modificación: 24 de Noviembre 2020, 23:33 por drawk1 »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2640
    • Ver Perfil
Buenas, tendrías varias opciones:

- Hacerlo todo desde Visual Basic, sin necesidad de que se abra Excel en una ventana y sin necesidad de un archivo bash y sin necesidad de macro. La función de la macro la haría el propio Visual Basic.

- Usar Visual Basic para invocar la ejecución de la macro invocando el método Run: ver ejemplo en https://aprenderaprogramar.com/foros/index.php?topic=7834.0

Salu2

drawk1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Muy buenas!

Al final la app lanza todo como quería, así que mil gracias!
Lo que estaba tratando de pulir, es que al código que adjunto a continuación, en vez de seleccionar una ruta en concreto donde quiero que al ejecutar el botón click 1, no tenga que tener en una ruta en concreto y el Excel que quiero modificar con la Macro programada, sino que me pregunte que Excel quiero abrir ejecutando dicha Macro, el código es el siguiente:

Código: [Seleccionar]
Private Sub Command2_Click()
Dim ret As Boolean
         
    ret = Ejecutar("c:\ESTADOS\BBDD VF-ONO MICROPYMES.xlsm", "Eliminar")
     
    If ret Then
       MsgBox "Estados Terminados", vbInformation 'OK
    End If
End Sub

 
Function Ejecutar(Libro As String, _
                  Macro As String) As Boolean
 
 
On Error GoTo Error_function
 
Dim Excel As Object
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = False
    With Excel
        .Application.workbooks.open Libro
        .Run (Macro)
    End With
 
        Set Excel = Nothing
    Ejecutar = True
 
Exit Function
 
Error_function:

If Not Excel Is Nothing Then Set Excel = Nothing

If Err Then
   MsgBox Err.Description, vbCritical
End If
End Function

¿Sabríais decirme como cambiar la parte del código donde en vez de tener que escribir una ruta en concreto donde esté el Excel, que pueda elegir que Excel quiero elegir para que se ejecute la Macro Eliminar?

Está en lenguaje VB!

Muchas gracias,

Un saludo cordial.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".