Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: drawk1 en 06 de Noviembre 2020, 18:27
-
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.
-
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
-
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.
-
¿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?
-
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?
-
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.):
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
-
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 :)
-
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
-
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! :)
-
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
-
Buenas!
He lanzado este código dentro de un modulo de Excel para ejecutar lo que necesitaba:
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:
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! :)
-
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.
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
-
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...
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!!! :)
-
Buenas, el código que has puesto parece más visual basic que bash. Habría que probar. Supuestamente en un bat algo como
@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
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
-
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! :)
-
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.
-
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:
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:
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! :)
-
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
-
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:
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.