Que se ejecute macro con hojas ocultas sin select.

Busque en el foro y veo algo similar a lo que busco pero no define mi problema.

Resulta que trabajo con una macro la cual me genera correo vía outlook, lo que no logro evitar es que las hojas ocultas queden realmente ocultas, al activar la macro, la hoja queda siempre visible aunque esta estaba oculta.

Pongo los códigos para habilitar la hoja a medida que ejecuta la macro, pero algo estoy haciendo mal ya que no me logra hacer el trabajo, también en el asunto del correo no me toma los datos al cual indico que llame desde la hoja (al parecer porque esta oculta.

Paso código.. La hoja " pvalesqu" La idea es que siempre este oculta solo se habilite para correr la macro.Creen que esta mal usar select?

Sub Mail_Selection_VALESQUIMILI()
    Dim rng As Range
    Dim Arng As Range
    Dim OutApp As Object
    Dim OutMail As Object
    Dim strbody As String
    Dim trBody As String
    Dim user1 As String
    Dim hora As Double
    Dim saludo As String
Sheets("PVALESQU").Visible = False
    Set rng = Nothing
    Sheets("PVALESQU").Visible = True
    Sheets("PVALESQU").Select
    Set rng = Sheets("PVALESQU").Range("B2:E7")
Sheets("pvalespa").Visible = False
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    Set OutkAttach = OutApp.CreateItem(Attachments)
     hora = (Now - Int(Now)) * 24
    Select Case hora
        Case 6 To 12
            saludo = "<FONT face=Verdana color=#002060 size=2>El usuario @" & "<B>" & Environ("USERNAME") & "</B></FONT>" & " <FONT face=Verdana color=#002060 size=2>ha generado una nueva planilla de control Vales Admin!</FONT>
" & _
            "<FONT face=Verdana color=#002060 size=2> >>> Detalles del Envio.</FONT>"
        Case 12 To 20
            saludo = "<FONT face=Verdana color=#002060 size=2>El usuario @" & "<B>" & Environ("USERNAME") & "</B></FONT>" & " <FONT face=Verdana color=#002060 size=2>ha generado una nueva planilla de control Vales Admin!</FONT>
" & _
            "<FONT face=Verdana color=#002060 size=2> >>> Detalles del Envio.</FONT>"
        Case Else
            saludo = "<FONT face=Verdana color=#002060 size=2>El usuario @" & "<B>" & Environ("USERNAME") & "</B></FONT>" & " <FONT face=Verdana color=#002060 size=2>ha generado una nueva planilla de control Vales Admin!</FONT>
" & _
            "<FONT face=Verdana color=#002060 size=2> >>> Detalles del Envio.</FONT>"
        End Select
          Sheets("PVALESQU").Visible = True
    With OutMail
        .To = ""
        .CC = ""
        .BCC = ""
         Sheets("PVALESQU").Visible = True
        .Subject = "Info/ Facturas Proveedores Comunes " & " " & ("Envio N°") & " " & Range("C5") & " " & ("Fecha") & " " & Format(Now, "d-m-yy")
        .HTMLBody = saludo & RangetoHTML(rng) & strbody
          Sheets("PVALESQU").Visible = False
        .Display  'or use .Send
    End With
  Sheets("PVALESQU").Visible = False
    Set OutMail = Nothing
    Set OutApp = Nothing
    Sheets("PVALESQU").Visible = True
    Sheets("PVALESQU").Select
    Range("b10:g31").Select
    Selection.ClearContents
       ActiveWorkbook.Save
    Sheets("PVALESQU").Visible = False
End Sub

        

1 respuesta

Respuesta

[Hola

No es necesario usar Select, es más, eso vuelve más lentos los procesos. No es necesario que las hojas estén seleccionadas o visibles para trabajar en ellas, basta mencionarlas. Lee esto:

https://abrahamexcel.blogspot.com/2017/12/el-uso-y-abuso-de-select-y-selection-en.html

perfecto Abraham acabo de leerlo.

el drama es que si quito el "select" me arroja error donde me indica que falta algo y se agrego nuevamente el . select corre la macro.

lo mismo al no hacerlas visibles a la hoja, la macro no avanza dar error porque la hoja esta oculta.

ahora estoy sin la compu, pero prometo mostrar mas adelante para ver dónde esta el dilema

No es posible si quito el .select me copia en la primer hoja que encuentre activa.

Para este caso al dar cargar me copio los datos en hoja1 la cual por defecto esta activa.

agregue SET para llamar a la hojas y no usar el select.

Sheets("CHARATA").Visible = True
    Set rng = Sheets("CHARATA").Range("B18")
    While ActiveCell <> Empty
        ActiveCell.Offset(1, 0).Select
    Wend
    Dim FILA As String
    FILA = ActiveCell.Address
    If FILA = "$B$47" Then
    MsgBox ("No podes agregar mas lineas, enviar planilla!"), vbExclamation, "ERROR!"
    Exit Sub
    Else
    End If
    ActiveCell = FECHA
    ActiveCell.Offset(0, 1) = FAC1 & "/" & FAC2
    ActiveCell.Offset(0, 2) = "$" & PRECIO
    ActiveCell.Offset(0, 3) = CLIENTE1 & "/" & CODIGO

Sugiero volver a leer el artículo enviado ya que no se trata de solo dejar de seleccionar, sino de reemplazar lo eliminado por lo conveniente/pertinente/adecuado. Por cierto, cuando colocas ActiveCell es casi como usar Select, o sea: No se recomienda usarlo y hace lentos los procesos. Del mismo modo no se recomienda los bucles tipo While que usen ActiveCell en busca de celdas vacías.

Yo sugeriría que vayas paso a paso primero solucionando la primera macro enviada ya que, al menos aparentemente, la que has enviado ahora es otra.

¿Puedo por favor enviarte el archivo (solo de un menu) para ver cómo lo acomodarías? Ya que yo no se que más hacer..

Coloca el archivo en algún "Drive" (Google Drive, OneDrive, DropBox, etc.) y comparte por aquí el enlace. Si consideras que algunos datos son privados, solo bórralos.

Estimado, disculpa la demora, te paso el archivo y esperare tu respuesta.

solo deje un modelo de todo el archivo, un menú donde se cargan datos de facturación y el que usa para armar el correo.

https://drive.google.com/file/d/1TxDVKWu-pnNjD4bYLV3WMjeGx6k_E4UK/view?usp=sharing 

desde ya muchas gracias!!

Un ejemplo de cómo modificar tus macros. Mira también los comentarios agregados:

Private Sub CommandButton7_Click()
Dim ufila As Long
Dim wshnetwork As Object
Application.ScreenUpdating = False
Application.EnableEvents = False
If CLIENTE2 = "" Then MsgBox ("Para avanzar, ingrese CODIGO."): CODIGO1.SetFocus: Exit Sub
If FECHA1 = "" Then MsgBox ("* La fecha, es obligatorio"): FECHA1.SetFocus: Exit Sub
RPTA = MsgBox("¿SEGURO QUE DESEA ENVIAR ESTA PLANILLA?", vbYesNo + vbQuestion, "Ultimo paso, enviamos?")
If RPTA = vbNo Then Exit Sub
    Sheets("pampa").Range("C13") = FECHA1
    Sheets("pampa").Range("C11") = nuevaplanilla
    Sheets("pampa").Range("E13") = CLIENTE2
    CODIGO1.Text = ""
    CLIENTE2.Text = ""
    FECHA.Text = ""
Set wshnetwork = CreateObject("wscript.network") 'esta línea no hace nada en esta rutina
Sheets("pampa").Range("J22:L22").Copy
ufila = Worksheets("DB_ENVIOS").Range("A" & Rows.Count).End(xlUp).Row + 1
Sheets("DB_ENVIOS").Range("A" & ufila).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Mail_SEA_FLETEPAMPA 'esta macro también debes modificarla
ActiveWorkbook.Save
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Estimado, tu ayuda me esta sirviendo y de mucho en este paso con el vba.

en el siguiente código, no logro pararme sobre la celda en la que va a comenzar a copiar la cual es (" b18 ") si no es .select o activate no logro seleccionarla ya que las hojas estan ocultas., me darías una ultima mano? con esto tengo el userform completo.

PD/ otra cosa, al quitar ActiveWorkbook.Save el guardado en la hoja es rapidisimo, pero si uso ActiveWorkbook.Save es muy lento, alguna sugerencia? yo necesito que se autoguarde cada linea que cargo, son 29 linea en total.

te agradezco por tu tiempo, es muy amable de tu parte.

Private Sub REGISTRAR_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
    If CODIGO = "" Then MsgBox ("Para avanzar, ingrese un Cuit."), vbExclamation, "ERROR!": CODIGO.SetFocus: Exit Sub
    If FECHA = "" Then MsgBox ("* La fecha, es obligatorio"), vbExclamation, "ERROR!": FECHA.SetFocus: Exit Sub
    If FAC1 = "" Then MsgBox ("* El punto de venta, es oblogatorio"), vbExclamation, "ERROR!": FAC1.SetFocus: Exit Sub
    If FAC2 = "" Then MsgBox ("Numero de Comprobante, es obligatorio"), vbExclamation, "ERROR!": FAC2.SetFocus: Exit Sub
    If PRECIO = "" Then MsgBox ("Falta Precio Total de la Factura"), vbExclamation, "ERROR!": PRECIO.SetFocus: Exit Sub
    Sheets("CAROYA").Activate
    Range("B18").Select
    While ActiveCell <> Empty
        ActiveCell.Offset(1, 0).Select
    Wend
    Dim FILA As String
    FILA = ActiveCell.Address
    If FILA = "$B$47" Then
    MsgBox ("No podes agregar mas lineas, enviar planilla!"), vbExclamation, "ERROR!"
    Exit Sub
    Else
    End If
    ActiveCell = FECHA
    ActiveCell.Offset(0, 1) = FAC1 & "/" & FAC2
    ActiveCell.Offset(0, 2) = "$" & PRECIO
    ActiveCell.Offset(0, 3) = CLIENTE1 & "/" & CODIGO
ActiveWorkbook.Save
  CODIGO.Text = ""
  CLIENTE1.Text = ""
  FECHA.Text = ""
  FAC1.Text = ""
  FAC2.Text = ""
  PRECIO.Text = ""
  MsgBox ("Factura ingresada OK!"): CODIGO.SetFocus: Exit Sub
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Con este código logro llamar a la hoja y funciona...

faltaría ordenar los demás nomas

Set TransRowRng = ThisWorkbook.Worksheets("CAROYA").Cells(18, 2)

Primero que nada, felices fiestas, segundo, modificar todo eso conlleva un tiempo que yo no tengo, recuerda que los que ayudamos por aquí lo hacemos ad honorem y en nuestros (pocos) tiempos libres. Eso sí, el proceso que usar para buscar la última fila con datos es bastante lento y te obliga a usar ActiceCell, lo que hace más lento aún tu proceso.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas