Saltar al contenido

Problema al abrir un archivo excel mediante VBA


Azulito76

Recommended Posts

publicado

Buenos días,

No diré que soy nuevo en VBA pero hay un problema que me supera y me ha llevado a pedir ayuda por aquí para ver si alguien le ha sucedido algo por el estilo y ha logrado solucionarlo.

Yo trabajo sobre el excel 2003.

Esta es la situación, tengo un archivo que necesita de otro excel para tomar los datos de este ( he incluido en adjuntos el archivo excel citrix.xls ), el archivo citrix.xls fue creado mediante un programa del cual, tengo sospechas que lo crea en una versión del excel inferior al 2003.

El problema es el siguiente, cuando por medio de una macro llega la parte en la cual la macro abre el archivo citrix.xls para copiar la hoja y pegarla en el archivo excel donde se encuentra la macro y continué procesando los datos lo hace bien, copia y pega sin problemas, la razón del problema es que la columna de citrix.xls donde se encuentra la fecha, al pegarla en el excel de la macro le cambia el formato, por ejemplo la fecha de la primera columna de citrix es:

12/11/2012

y al copiarlo y pegarlo en la otra hoja lo pasa así,

11/12/2012

como se puede comprobar no es la misma fecha ni el mismo valor númerico, pero solo ocurre con el primer dia, el siguiente dia si lo pone bien, como,

13/11/2012 pero en formato texto pues entiendo que el mes 13 no existe y lo interpreta como texto llano.

Todo esto ocurre cuando se ejecuta la siguiente macro, pondré solo el fragmento donde llama a citrix


.....
Workbooks.Open Filename:=c:\citrix.xls 'Ubicacion ficticia donde se encuentra el archivo de datos
Workbooks("citrix.xls").Activate
Cells.Select
Selection.Copy
Workbooks(nombrelibro).Sheets("Datos").Visible = True
Workbooks(nombrelibro).Sheets("Datos").Activate
Cells.Select
ActiveSheet.Paste
Workbooks("citrix.xls").Close savechanges:=False 'evito guardar al cerrar para que no me muestre la imagen que he agregado a este mensaje mas abajo
Call ejec 'llama la siguiente macro
....
[/CODE]

Después de mucho investigar hiendo linea a linea llegue a la conclución, que si el archivo citrix.xls se abre de forma MANUAL neutralizando la linea

[CODE]'Workbooks.Open Filename:=c:\citrix.xls[/CODE]

y se ejecuta la macro

el copiado y pegado lo hace correctamente incluso el formato de fecha corresponde con el debe ser y todo lo hace perfectamente bien como lo quiero.

Pero si dejo que sea la linea neutralizada [b]Workbooks.Open Filename:=c:\citrix.xls[/b] la que abra el archivo, lo copia y pega mal.

[u]

[i]¿ Habría alguna manera de abrir dicho archivo mediante VBA que no sea de la manera citada para que los datos los trate como debería?[/i][/u]

Por si vale de algo adjunto imagen,

[ATTACH]34951.vB[/ATTACH]

Este mensaje aparece si el archivo adjunto es nuevamente guardado, osea si se intenta modificar y guardar, supongo que es por donde erradica todo el problema.

Si la solución es que el programa que crea el archivo citrix.xls lo guarde en otro formato, la respuesta es que no es posible pues he de trabajar con lo que crea, si no hay solución tendre que hacerlo de forma manual, abriendo el archivo de forma manual para que los datos sean cogidos correctamente.

Gracias y perdonar por las molestias.

citrix.xls

post-106921-145877006438_thumb.jpg

publicado

Hola

Ojalá te sirva aun algún tipo de ayuda, me paso por aquí tratando de ayudar, porque siempre consulto, pero pocas veces posteo lo que voy descubriendo, no soy un experto, pero he ido aprendiendo varios truquitos en el camino.

Mira yo para abrir otros archivos uso este código:

ruta = "C:\Mis Documentos\Archivos\"

nombre = "Libro1"

ext = ".xls"

Dim wBook As Workbook

On Error Resume Next

Set wBook = Workbooks(nombre)

If wBook Is Nothing Then

Workbooks.Open ruta & nombre & ext

Else

Windows(nombre).Activate

End If

donde a las variables "nombre", "ruta" y "ext" también se pueden referenciar a celdas, lo hago así por si cambia el formato de un archivo o en la planilla alguien cambia la ubicación de esas celdas o alguien le cambia el nombre al arcvhivo, por ejemplo uso algo como: nombre = Cells(2,5).value

Para abrirlo como solo lectura y que no me pregunte cosas, le pongo luego de "Workbooks.Open ruta & nombre & ext" las instrucciones para que lo abra sin actualizar vinculos, como de solo lectura: "Workbooks.Open ruta & nombre & ext, 0, 1" (sin las comillas), incluso a los archivos que tengo protegidos con contraseñas, puedo hacer q la misma macro la escriba por mi jeje...

Y bueno para pegar y que no cambie los formatos, en vez de Activesheet.Paste, utilizo esta línea, con lo que pega solo valores y mantiene el formato de la planilla de destino:

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Application.CutCopyMode = False

Ojalá te sirva, a mi me han ayudado de mucho esas líneas...

Saludos desde Chile...

Invitado Cacho R
publicado

Hola! Oliver. Podrías intentar con lo siguiente:

Const ubicación$ = "C:\"

With ThisWorkbook.Sheets("Datos")
.Visible = True
Application.Goto .[a1]

Workbooks.OpenText Filename:=ubicación & "citrix.xls", Origin:=xlWindows, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=True, Semicolon:=False, Comma:=False, Space:=False, Other:=False, _
FieldInfo:=Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), _
Array(6, 1), Array(7, 1))

ActiveSheet.[a1].CurrentRegion.Copy .[a1]
ActiveWorkbook.Close False
End With[/PHP]

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.