Mensajes recientes

Páginas: [1] 2 3 ... 10
1
Varias / Establecer fecha de creación de fichero
« Último mensaje por xavi en Mayo 10, 2024, 10:32:46 am »
Palabras clave: fichero, fecha, creación
Autor: Copilot

Me surge la necesidad de crear un fichero con una determinada fecha de creación ya que un proceso externo sobre el que no tengo control, mañana buscará un fichero con fecha de creación de mañana pero el fichero lo creo hoy

Le pido a Copilot un código y me propone esto (por probar)


Código: [Seleccionar]
' Supongamos que deseas cambiar la fecha de creación del archivo "TESTFILE" a "12/12/2017 10:00".
' Primero, copia el archivo a una nueva ubicación con la fecha deseada.
FileCopy "TESTFILE", "NUEVO_TESTFILE"
' Luego, establece la fecha de modificación del nuevo archivo.
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile("NUEVO_TESTFILE")
f.DateCreated = #12/12/2017 10:00#
' Finalmente, puedes eliminar el archivo original si es necesario.
Kill "TESTFILE"
2
Correo / Mail con firma
« Último mensaje por xavi en Diciembre 21, 2023, 01:47:29 pm »

Palabras clave: correo, firma
Autor: acilu55
Extraído de: MV-Access


REDACCION PROVISIONAL


Objetivo
Se preguntó como enviar mail con firma. En principio era con CDO (que desconocía que se podía hacer) y acilu55 propuso, mediante Outlook, la capacidad de utilizar una plantilla de mail con la firma:

Código: [Seleccionar]
Set OUTAPP = CreateObject("Outlook.Application")
Set OUTMAIL = OUTAPP.CreateItemFromTemplate(Application.CurrentProject.Path & "\oficio.oft")
 ' oficio.oft es una plantila de mail con la firma
With OUTMAIL
.To = mail
.cc = ""
.bcc = ""
.BodyFormat = olFormatHTML
           
.Subject = "asunto del envio"
adjunto1 = Application.CurrentProject.Path & "\factura.pdf"

.Attachments.Add (adjunto1)
3
Varias / Variables de entorno
« Último mensaje por xavi en Octubre 25, 2023, 11:35:21 pm »
Palabras clave: entorno, environ, variables
Autor: Sergio Alejandro Campos
Extraído de: EXCELeINFO



La necesidad surge al necesitar saber si existe una variable de entorno que devuelva el nombre del usuario "bonito" (que no existe) y no saber las posibles variables que se pueden consultar.

Sergio nos brinda este código (requiere un libro con una "Hoja1" y habilitado para macros


Código: [Seleccionar]
Sub MostrarVariables()
    'Declaramos variables
    '
    Dim i As Integer
    '
    i = 1
    '
    'Mientras el valor de Environ NO sea vacío, se obtiene el valor.
    While Environ(i) <> Empty
        '
        ActiveWorkbook.Sheets("Hoja1").Range("A8").Offset(i, 0).Value = Environ(i)
        '
        i = i + 1
        '
    Wend
    '
End Sub
4
Formularios / Re:Abrir copias de formulario
« Último mensaje por xavi en Julio 04, 2023, 01:55:01 pm »
Actualización tomando la info de Allen Browne Hay un ejemplo en esa URL

Para evitar problemas, utiliza una colección pública y un código en un módulo independiente.
El ejemplo de Allen toma un formulario llamado frmClient

Código: [Seleccionar]
Public clnClient As New Collection    'Instances of frmClient.
Function OpenAClient()
    'Purpose:    Open an independent instance of form frmClient.
    Dim frm As Form

    'Open a new instance, show it, and set a caption.
    Set frm = New Form_frmClient
    frm.Visible = True
    frm.Caption = frm.Hwnd & ", opened " & Now()

    'Append it to our collection.
    clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)

    Set frm = Nothing
End Function

Function CloseAllClients()
    'Purpose: Close all instances in the clnClient collection.
    'Note: Leaves the copy opened directly from database window/nav pane.
    Dim lngKt As Long
    Dim lngI As Long

    lngKt = clnClient.Count
    For lngI = 1 To lngKt
        clnClient.Remove 1
    Next
End Function

La segunda función CloseAllClients() muestra cómo cerrar estas instancias eliminándolas de nuestra colección. Pero si el usuario cierra una instancia con la interfaz normal, debemos eliminar esa instancia de nuestra colección. Eso se hace en el evento Cerrar del formulario frmClient de esta manera:

Código: [Seleccionar]
Private Sub Form_Close()
    'Purpose: Remove this instance from clnClient collection.
    Dim obj As Object        'Object in clnClient

    Dim blnRemove As Boolean  'Flag to remove it.

    'Check if this instance is in the collection.
    For Each obj In clnClient
        If obj.Hwnd = Me.Hwnd Then
            blnRemove = True
            Exit For
        End If
    Next

    'Deassign the object and remove from collection.
    Set obj = Nothing
    If blnRemove Then
        clnClient.Remove CStr(Me.Hwnd)
    End If
End Sub
5
Varias / Ejecutar cualquier acción de comando
« Último mensaje por xavi en Mayo 30, 2023, 06:54:29 pm »
Palabras clave: ejecutar, elemento, menú, commandbars, executemso
Autor: De aquí y de allá., pero la clave la dá René Nyffenegger
URL:Microsoft Learn
URL:René Nyffenegger
URL:github (también accesible desde URL anterior)


Objetivo
En ocasiones hay que ejecutar acciones de menú que no están accesibles mediante otros comandos de VBA. Para ello podemos invocar el método Application.CommandBars.ExecuteMso(idMSO)
El problema está en localizar los idMSO ya que la página de Microsoft es muy parca.
En la página de René se enlaza un repositorio de GitHub dónde se puede acceder a varias carpetas para distintas versiones de Office y, dentro de cada una, a una serie de ficheros Excel con todas las colecciones de idMSO

6
Fechas / Cálculo de dia laborable flexivo
« Último mensaje por xavi en Mayo 27, 2023, 05:55:40 pm »
Palabras clave: fecha, laborable, dia.lab.intl
Autor: xavi

Necesidad
Obtener que día será una fecha dada una fecha inicial, un número de laborales, un tipo de semana laboral y la utilización de una tabla de festivos.

Es una emulación (con ligeros cambios) de la función DIA.LAB.INTL de Excel

Código: [Seleccionar]
Function DiaLabIntl(dtmFechaInicial As Date, intDiasProceso As Integer, Optional strTipoSemanaLaboral As String = "0000011", Optional blnAplicaFestivos As Boolean = True) As Date
    ' Función análoga a la de Excel utilizando el tipo de semana laboral como cadena y un boolean para aplicar laborables y festivos
    ' En caso de aplicar festivos será necesario indicar el nombre de la tabla y el campo de la tabla que contiene la fecha
   
    ' La cadena de strTipoSemanaLaboral se establece con 7 ceros y unos. El cero indica laborable y el uno festivo.
    ' Así, "0000011" indica el fin de semana de sábado-domingo. Esa técnica nos permite gestionar (casi) cualquier combinación
   
   
    Const cTablaFestivos As String = "tblDatFestivos"
    Const cCampoFecha As String = "FechaFestiva"
   
    Dim dtmLaFecha  As Date
    Dim intdias As Integer
   
    ' Establecemos la fecha inicial
    dtmLaFecha = dtmFechaInicial
   
    ' Bucle sin condiciones
    Do
        ' Evaluamos si el día de la semana se ha estipulado como festivo.
        If Mid(strTipoSemanaLaboral, Weekday(dtmLaFecha, vbMonday), 1) = "1" Then
            ' Es un NO-laborable: no hacemos nada
        Else
            ' En este punto "parece" un laborable pero miramos si es festivo (si procede)
            If blnAplicaFestivos And DCount("*", cTablaFestivos, cCampoFecha & "= " & CLng(dtmLaFecha)) > 0 Then
                ' es un festivo: nada
            Else
                ' Ni es fin de semana, ni es festivo (sea porque no aplica, sea porque no lo es)
                intdias = intdias + 1
            End If
        End If
       
        ' Comprobamos si hemos alcanzado el limite de días
        If intdias >= intDiasProceso Then
            DiaLabIntl = dtmLaFecha
            Exit Function
        End If
        ' Aumentamos un día
        dtmLaFecha = DateAdd("d", 1, dtmLaFecha)
        ' Comprobación de seguridad
        If dtmLaFecha > DateAdd("d", intDiasProceso + 1000, dtmFechaInicial) Then
            MsgBox "Creo que nos hemos pasado de largo", vbExclamation
            DiaLabIntl = "01/01/1900"
            Exit Function
        End If
    Loop

End Function

7
Excel / Copiar un rango en el cuerpo de un correo electrónico
« Último mensaje por xavi en Mayo 15, 2023, 04:25:53 pm »
Palabras clave: Excel, rango, copia, outlook, correo
Autor: Ron De Bruin
Extraído de: Ron De Bruin

La necesidad surge de pegar el contenido de un rango de un fichero Excel abierto como parte del cuerpo de un correo electrónico.

Después de muchas vueltas y pruebas este código de Ron De Bruin soluciona el problema

Requiere una copia previa del rango o pasarle la dirección para que lo haga la función.


Código: [Seleccionar]
Function rngHTML(Rng As Object) ' Range
    Dim fso         As Object
    Dim ts          As Object
    Dim TempWB      As Object    ' Workbook
    Dim TempFile    As String
   
    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
   
    '' copy the range and create a new workbook to paste the data into
    'Rng.Copy
   
   
    Set TempWB = xlsApp.Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        .Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    '' publish the sheet to a htm file
    With TempWB.PublishObjects.Add( _
             SourceType:=xlSourceRange, _
             fileName:=TempFile, _
             Sheet:=TempWB.Sheets(1).Name, _
            Source:=TempWB.Sheets(1).UsedRange.Address, _
            HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    '' read all data from the htm file into rngHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    rngHTML = ts.readall
    ts.Close
    rngHTML = Replace(rngHTML, "align=center x:publishsource=", "align=left x:publishsource=")

    TempWB.Close savechanges:=False
    '' delete the htm file we used in this function
    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
End Function
8
API / Abrir paleta de colores
« Último mensaje por xavi en Mayo 12, 2023, 09:58:01 am »
Palabras clave: color, paleta, API, CHOOSECOLOR
Autor: ni me acuerdo
Extraído de: No sabria decir

Objetivo:
Abrir la paleta de colores para realizar una selección

En un módulo independiente:
Código: [Seleccionar]
Option Compare Database
Option Explicit

' Declaraciones (para aDialogColor)
#If Win64 Then
    Private Declare PtrSafe Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As COLORSTRUC) As Long
#Else
    Private Declare Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As COLORSTRUC) As Long
#End If

' Estructura (para aDialogColor)
Private Type COLORSTRUC
  lStructSize       As Long
  hWnd              As Long
  hInstance         As Long
  rgbResult         As Long
  lpCustColors      As String
  Flags             As Long
  lCustData         As Long
  lpfnHook          As Long
  lpTemplateName    As String
End Type

' Estructura de devolución de valor
Public Type udtSysDialogColor
    IsSelected      As Boolean
    PreSelected     As Variant
    SelectedColor   As Long
End Type
Public uSysDialogColor  As udtSysDialogColor

' Constantes (para aDialogColor)
Private Const CC_SOLIDCOLOR = &H80
Private Const CC_RGBINIT = &H1

Public Function aDialogColor()
   
    Dim x As Long, CS As COLORSTRUC, CustColor(16) As Long
   
    CS.lStructSize = Len(CS)
   
    CS.hWnd = Application.hWndAccessApp
   
    CS.Flags = CC_SOLIDCOLOR Or CC_RGBINIT
    CS.lpCustColors = String$(16 * 4, 0)
   
    ' Were we passed a value in PreselectedColor
    If Not IsMissing(uSysDialogColor.PreSelected) Then
        CS.rgbResult = uSysDialogColor.PreSelected
    End If
   
    x = CHOOSECOLOR(CS)
    If x = 0 Then
        ' ERROR - return preselected Color
        uSysDialogColor.IsSelected = False
        Exit Function
    Else
        ' Normal processing
        uSysDialogColor.SelectedColor = CS.rgbResult
        uSysDialogColor.IsSelected = True
    End If
 
End Function
9
API / Obtener resolución de pantalla
« Último mensaje por xavi en Mayo 09, 2023, 12:05:37 am »
Palabras clave: configuración, resolución, TWIPS, API, GetSystemMetrics
Autor: Jacob Hilderbrand
Extraído de: VBA Express

Objetivo:
Determinar la resolución de la pantalla y proponer cambio.

En un módulo independiente:
Código: [Seleccionar]
Option Explicit
 
Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long
Const SM_CXSCREEN = 0
Const SM_CYSCREEN = 1
 
Sub VerifyScreenResolution(Optional Dummy As Integer)
     
    Dim x  As Long
    Dim y  As Long
    Dim MyMessage As String
    Dim MyResponse As VbMsgBoxResult
     
    x = GetSystemMetrics(SM_CXSCREEN)
    y = GetSystemMetrics(SM_CYSCREEN)
    If x = 1024 And y = 768 Then
    Else
        MyMessage = "Your current screen resolution is " & x & " X " & y & vbCrLf & "This program " & _
        "was designed to run with a screen resolution of 1024 X 768 and may not function properly " & _
        "with your current settings." & vbCrLf & "Would you like to change your screen resolution?"
        MyResponse = MsgBox(MyMessage, vbExclamation + vbYesNo, "Screen Resolution")
    End If
    If MyResponse = vbYes Then
        Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3")
    End If
End Sub


10
Excel / Obtener nombre de hoja mediante fórmula
« Último mensaje por xavi en Mayo 02, 2023, 11:37:33 pm »
Palabras clave: Excel, hoja, nombre, formula
Autor: Argenis
Extraído de: Grupo de Whatsapp PowerBI Barcelona


Jordi Bosch, en el grupo de WhatsApp de PowerBI Barcelona lanza esta pregunta:

¿Por casualidad, alguno sabe cómo aplicar una fórmula en Excel para obtener el nombre de la pestaña en la misma pestaña sin referencias circulares ni VBA? Gracias 

Respuesta de Argenis

=EXTRAE(CELDA("nombrearchivo");ENCONTRAR("]";CELDA("nombrearchivo"))+1;31)

No hace falta decir nada más.
Páginas: [1] 2 3 ... 10