Saltar al contenido

Simplificar macro para no crear el archivo copia.xlsm


Recommended Posts

publicado

Hola amig@s.

Esta macro

Sub GuardaSinMacros()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set l1 = ThisWorkbook
Ruta = "D:\Datos Mecanicos\"
nombre = Range("G4") & "_" & Range("C13") & "-" & Range("H13").Value & ".xlsx"
'Cria archivo llamado Copia.xlsm en la misma ruta para que sirva de base a la creacion del .xlsx en variable nombre
l1.SaveCopyAs Ruta & "copia.xlsm"
Set l2 = Workbooks.Open(Ruta & "copia.xlsm")
l2.SaveAs Ruta & nombre, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 'cria archivo requerido
l2.Close
Kill Ruta & "copia.xlsm" 'elimina el archivo Copia.xlsm en la ruta
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Sheets(1).Range("I3").Value = Sheets(1).Range("I3").Value + 1 'Agrega + 1 al conteo de factura
End Sub[/CODE]

Lo que hace es crear un archivo Copia.xlsm que sirve de base para la creacion del requerido en variable nombre pero este de la variable nombre tiene que ser con extension .xlsx y no xlsm.

El origen contiene macros y contendrá y esta macro que les dejo elimina cualquier codigo del archivo de la variable nombre porque eso pretendo, que sea sin macro alguna.

Se que alguien me dirá; si te funciona así, ¿porque modificarla? pues quiero simplificarla para que no tenga que criar una base (Copia.xlsm) para fabricar el archivo que requiero, eso nada mas.

Ademas de esto, quiero que me agreguen alguna linea para eliminar el boton ActiveX con caption Excel_PDF del de la variable nombre, que tengo en la hoja del origen desde el que ejecuto la macro

Gracias

presupuesto_AyudaExcel.zip

publicado

Buenas [uSER=53155]@JoaoM[/uSER] utiliza lo siguiente

Sub GuardaSinMacros()
Dim ruta As String
Dim nombre As String
Dim wb As Object
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ruta = "D:\Datos Mecanicos\"
nombre = Hoja1.Range("G4") & "_" & Hoja1.Range("C13") & "-" & Hoja1.Range("H13").Value & ".xlsx"
ThisWorkbook.Worksheets.Copy
Set wb = Workbooks(Workbooks.Count)
With wb
.Sheets(1).Shapes("Excel_PDF").Delete
.SaveAs Filename:=ruta & nombre, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
.Close True
End With
Set wb = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
ThisWorkbook.Sheets(1).Range("I3").Value = ThisWorkbook.Sheets(1).Range("I3").Value + 1 'Agrega + 1 al conteo de factura
End Sub[/CODE]

[/indent]

Un saludo

publicado

Ok logroastur, gracias por tu tan importante ayuda para mí.

Quisiera que me comentaras la macro, ¿porque?

Veo en una línea, PDF y creia que TAMBIEN me crearía de una el archivo PDF

        .Sheets(1).Shapes("Excel_PDF").Delete[/CODE]

Cuanto a la creación del PDF con un solo click en el botón de la hoja, (no sé si lo bajaste para darte cuenta que tengo la macro para la creación del PDF, Macro que la llamo de esta misma, en eso no tengo problema porque después de la Sub GuardaSinMacros() le coloco

PDF y listo.

Quiero que sepas (por si algo piensas) que la creación del PDF ya antes me salía el archivo (PDF) limpio, es decir, sin botón ni macros (es obvio) y eso es CORRECTO, no tengo problemas con eso.

Tanto escribir para solo pedir que me la comentes, por favor y, si no es perjudicial para ti, jejejejjejeej.

Soy mui pero mui malo en explicaciones o exposiciones, me alargo para expresar pocas cosas

Gracias una vez más

Edito:

Nuevamente, aquí mismo te lo pido y me disculpas por no haberlo pensado antes.

En tu macro, podías agregar algo para que TAMBIEN SOLO copie los valores? y no las formulas y sin los comentarios en las celdas que los tienen.

Todo presupuesto es para envío al "cliente" y a estos no les interesa ni macros, botones o formulas, y a la vez se alivia (peso) el libro

Gracias y si se puede bien venida sea, sino, PUUUUUUUEEEEEEEEEEEESSSSSSSS, a llorar al valle (como se dice por acá) jajajjajajaja

publicado

No estoy seguro que este bien, te pido me corrijas si algo falta o esta mal colocado

Sub GuardaSinMacros()
PDF
Dim ruta As String
Dim nombre As String
Dim wb As Object
Application.ScreenUpdating = False 'DesactivA la actualización de pantallas para acelerar el código de la macro
Application.DisplayAlerts = False 'Desactiva las solicitudes y mensajes de alerta
ruta = "D:\Datos Mecanicos\" 'Donde guarda el libro
'Nombre a dar al libro
nombre = Hoja1.Range("G4") & "_" & Hoja1.Range("C13") & "-" & Hoja1.Range("H13").Value & ".xlsx"
ThisWorkbook.Worksheets.Copy 'Copia la hoja
Set wb = Workbooks(Workbooks.Count)
With wb
.Sheets(1).Shapes("Excel_PDF").Delete 'Elimina de la copia, cualquier Shapes (boton)
'Guarda el archivo en ruta y nombre
.SaveAs Filename:=ruta & nombre, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
.Close True
End With
Set wb = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'Agregar + 1 al conteo de factura ORIGEN
ThisWorkbook.Sheets(1).Range("I3").Value = ThisWorkbook.Sheets(1).Range("I3").Value + 1
End Sub[/CODE]

Me faltaria la Set wb = Workbooks(Workbooks.Count) y tambien Set wb = Nothing que no recuerdo para, si algo se baraja en mi mente que es para desactivar ¿que? ¿el libro copiado?

publicado

Buenas [uSER=53155]@JoaoM[/uSER] utiliza lo siguiente

Sub GuardaSinMacros()
Dim ruta As String
Dim nombre As String
Dim wb As Object
Dim i As Long
Dim d As String
ruta = "D:\Datos Mecanicos\"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
With ThisWorkbook.Sheets(1)
nombre = .Range("G4") & "_" & _
.Range("C13") & "-" & _
.Range("H13").Value
.Copy
End With
Set wb = Workbooks(Workbooks.Count)
With wb
With .Sheets(1)
For i = .Shapes.Count To 1 Step -1
d = .Shapes(i).TopLeftCell.Address(False, False)
Select Case d
Case "J2": .Shapes(i).Delete
Case "J3": .Shapes(i).Delete
Case "L3": .Shapes(i).Delete
End Select
Next
With .Range("A2:J60")
.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ruta & nombre & ".pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
.Copy
.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End With
With .Cells
.Locked = True
.FormulaHidden = False
End With
.Protect Password:=1234, _
DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True
.EnableSelection = xlNoRestrictions
End With
.SaveAs Filename:=ruta & nombre & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, _
CreateBackup:=False
.Close True
End With
Set wb = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
With ThisWorkbook
With .Sheets(1).Range("I3")
.Value = .Value + 1
End With
End With
End Sub[/CODE]

[/indent]

Un saludo

publicado

Hola logruastor. Gracias una ves mas y no me cansaré de darte las gracias por que es lo que puedo y debo hacer.

Hay una linea que se coloca para que la copia al abrirla no abra con el rango seleccionado Application.CutCopyMode = False

¿donde la coloco, en que punto de la macro para que la copia o quede con el rango seleccionado?

Gracias. No paras de surprender, al menos a estos inaptos y inexpertos en el tema COMO YO en que tu estas mas que cosido, jejejejejjeje, HAAAAAAAAAAAAA pero hablame de meánica en maquinaria pesada con mis 67? seguro te dejo a mil millas de distancia, ¿es? o tambien te metes con eso? jajajajjaja

Los comentarios siguen apareciendo en la copia, esos que en la esquina superior derecha de la celda aparece con un punto rojo

publicado

Hola logroastur

Si protejo la hoja me manda error y me apunta al Select Case.

Desbloqueo las celdas J2, J3 y L3 protejo la hoja y sigue lo mism.

Mi protecccion es para que nadie sea en la copia, sea en el origen, pueda cambiar el valor de las columnas I16 a 37 y J del 16 a J40, asi mismo las celdas que contienen datos fijos y permanentes.

Con la hoja protegida y solo poder seleccionar las celdas donde tien que escribir,

Quise proteger la hoja en la plantilla, de hecho lo hice pero, al ejecutar la macro me manda error y se refiere a la j2, j3 y L3 de Select CASE.

Le desactive este Select completo pero luego me manda error en otra línea y ya no sé qué hacer.

publicado

Hola logro

En resumen lo que quiero es:

Que copie la hoja (rango) (crie) en PDF (ya lo hace)

Que copie la hoja (rango) (crie) en xlsx (ya lo hace)

Que elimine TODA macro DE LA COPIA .xlsx (ya lo hace)

Que no transporte las formulas del origen a la copia (ya lo hace)

Que elimine todos los botones DE LA COPIA .xlsx solamente (ya lo hace).

Que proteja (TODO) su contenido, formas, datos, ETC en la copia .xlsx solamente, con passw o de alguna forma pero que la proteja de forma a que NADIE pueda modificar dato alguno en la copia. Ahora solo protege las formas que existen, quiero proteger TODO

Al abrir la copia, se ve TODO el rango seleccionado, QUE NO SEA ASÍ

En el libro origen, SI PROTEJO LA HOJA dejando solo LAS CELDAS A USAR desbloqueadas, me manda errores y quiero que protegida me deje ejecutar la macro, aunque tenga la J2, J3 y L3 desbloqueadas y desprotegidas, como se reflejan en la macro

presupuesto_FORO.zip

publicado

Le meti Range("A2").Select entre estas 2 lineas

 Application.CutCopyMode = False
End With[/CODE]

y solucione lo de que el rango en la copia, quedaba selecionado

Al menos lo de querer la copia TOTALMENTE PROTEGIDA, no lo logro.

Por favor una mano inocente que mueva los dedos, la necesito

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.