Mensajes recientes

Páginas: [1] 2 3 ... 10
1
Excel / Abrir recordset sobre un Excel
« Último mensaje por xavi en Julio 01, 2022, 11:24:25 pm »
Pendiente depurar (mil perdones)

strSQL = "SELECT * FROM [Excel 8.0;Database=" & strLibro & "].[" & Trim(strHoja) & "$" & strRango & "]"
2
Formularios / Selección automatica unico valor combobox/listbox
« Último mensaje por xavi en Abril 25, 2022, 05:53:35 pm »
Palabras clave: listbox, combobox
Autor: Xavi
Extraído de: Cuando lo busco no lo encuentro. Ahora que lo he encontrado, lo cuelgo aquí

Pregunta
Si un ListBox/ComboBox solo tiene un elemento, que aparezca seleccionado.

Respuesta
Debemos contar los registros del control y, si es igual a 1, utilizar la ItemData para seleccionalo.


Código: [Seleccionar]
    If Me!cboEjemplo.ListCount = 1 Then
        Me!cboEjemplo= Me!cboEjemplo.ItemData(0)
    End If
3
Varias / Vaciar estructura Type
« Último mensaje por xavi en Abril 13, 2022, 10:39:44 am »
Palabras clave: Type, estructura, vaciar
Autor: GSerg
Hilo en Stack Overflow

Objetivo
¿Como vaciar de una tacada el contenido de una estructura Type? Actualmente tengo una función que borra cada uno de los elementos de una estructura Type. ¿Se puede hacer más facil?

Responde GSerg en Stack Overflow

Puede beneficiarse del hecho de que las funciones de VB tienen una variable implícita que contiene el resultado y que contiene el valor de tipo predeterminado de forma predeterminada.

Código: [Seleccionar]
Public Function GetUDT_ToBlank() as CualquierUDT
End Function

Cuando se necesita vaciar una variable basada en una UDT, basta con asignar a esa variable la función

MiVariableUDT = GetUDT_ToBlank


Alternativa (cortesía de Mihura)
Definir una segunda variable sobre el mismo tipo (estará inicializada a blanco) y asignarla a la que queremos vaciar.

Partimos de una estructura udtDatos

Public Type udtDatos
  UnDato As String
  OtroDato As Integer
End Type

En un procedimiento utilizamos una variable basada en esa estructura:

Dim uDatosWork As udtDatos

' Asignamos valores
uDatosWork.UnDato = "algo"
uDatosWork.OtroDato = 13

Cuando necesitamos vaciar uDatosWork...
Dim uDatosEmpty As udtDatos
uDatosWork = uDatosEmpty

Simple...
4
Varias / Respuesta de InputBox
« Último mensaje por xavi en Abril 05, 2022, 11:14:42 am »
Palabras clave: inputbox, strptr
Autor: Happy

Objetivo
Obtener la respuesta cuando el usuario pulsa Cancelar o "X" en un InputBox

Habitualmente controlamos la respuesta "" asumiendo que el usuario ha cancelado la inserción de datos. Eso es habitualmente así porque, en general, si lanzamos un InputBox es porque esperamos que nos responda algo.

Pero la respuesta "" también se puede dar si el usuario pulsa el botón Aceptar sin texto en el cuadro.

Happy nos muestra cómo funciona con esta simple rutina utilizando el método oculto de VBA llamado StrPtr.

Código: [Seleccionar]
Sub ControlarRespuestaInputBox()
Dim Respuesta As Variant

    Respuesta = InputBox("Escribe (o no) algo en el InputBox")
   
    ' Se utiliza el método VBA oculto StrPtr para obtener el puntero de una variable tipo String
    ' si devuelve 0 es que el puntero es un Null, así que no ha habido respuesta positiva
    If StrPtr(Respuesta) = 0 Then
        MsgBox "Se ha pulsado Cancelar o se ha cerrado el mensaje con la 'X'", vbInformation
    ElseIf Len(Respuesta) = 0 Then
        MsgBox "No se ha escrito nada, pero se ha pulsado Aceptar", vbInformation
    Else
        MsgBox "En el InputBox se ha escrito: " & Respuesta, vbInformation
    End If
   
End Sub

NOTA: según se lee por la red, se trata de un método oculto e indocumentado lo que implica que puede desaparecer sin previo aviso.
5
Varias / Unidades y tipo
« Último mensaje por xavi en Febrero 27, 2022, 10:16:35 am »
Palabras clave: unidades, mapeo, tipo
Autor: ¿?

Objetivo
Listar las unidades de nuestro ordenador ya sean físicas, extraíbles o de red para obtener su tipo.


Código: [Seleccionar]
Function TestUnidades()
    Dim objDrv      As Object
    Dim strMsg      As String
 
    For Each objDrv In CreateObject("Scripting.FileSystemObject").Drives
        Select Case objDrv.DriveType
            Case 0: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": Unknown"
            Case 1: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": Removable Drive"
            Case 2: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": Hard Disk Drive"
            Case 3: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": Network Drive"
            Case 4: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": CDROM Drive"
            Case 5: strMsg = strMsg & vbNewLine & objDrv.DriveLetter & ": RAM Disk Drive"
        End Select
    Next
    Debug.Print strMsg
    Set objDrv = Nothing
End Function
6
Varias / Convertir texto enriquecido en texto plano
« Último mensaje por xavi en Enero 31, 2022, 08:21:58 pm »
Palabras clave: texto, enriquecido, plano, convertir
Autor: Respuesta del maestro Chea

Objetivo
Xavi pregunta si existe alguna forma de convertir texto enriquecido en texto plano dado que en la misma tabla se está almacenando texto que deberá ser utilizado de distinta forma.

La opción de utilizar Replace para reemplazar las etiquetas es una posibilidad, pero pueden existir diferentes tipos de etiquetas.

Respuesta de Chea
La función PlainText() quita al texto enriquecido todas las etiquetas html.

No hace falta decir nada más

Bueno si, la función contrara, como apunta Happy, es HTMLEncode (lo que aprende uno)
7
Módulos / Lanzar una función local desde un complemento
« Último mensaje por xavi en Enero 14, 2022, 11:19:00 am »
Palabras clave: función, complemento, eval, CodeProject
Autor: Rafael Andrada (McPegasus) sobre idea de Chea
Extraído de: AUGE

Situación:
Disponemos de un complemento que tiene un procedimiento. Ese procedimiento debe llamar a otra función dentro del mismo complemento. En ese caso el Eval no funciona. ¿Alternativa?

Dice Chea...
Desde un complemento no puedes ejecutar una función de la aplicación principal, ni con eval, ni directamente. Tienes que usar CurrentProject.Application.Run que, como también es una función, quizás puedas llamarla con Eval.


Y Rafa responde...
Pues solucionado, graaaaaacias. En lugar de Eval, Run y CodeProject en lugar de CurrentProject.

Antes: strValue = Nz(Eval(strFunciónValue))

Ahora: strValue = CodeProject.Application.Run(strFunción, strValue)

8
Varias / Obtener lista de controles seleccionados
« Último mensaje por xavi en Octubre 19, 2021, 12:06:16 pm »
Palabras clave: diseño, controles, selección, lista
Autor: Visto a ADezii en BYTES.COM

Objetivo:
Mihura pregunta si es posible obtener la lista de controles seleccionados en un formulario en vista diseño. ¿El motivo? la vagancia de escribir los nombres de los controles.

Respuesta
Una búsqueda en Google nos posiciona a Chema y un servidor en la misma página. Ahí descubrimos la propiedad InSelection y un código para determinar si está seleccionado.

Código: [Seleccionar]
? IsControlSelected (Forms!Customers, "CompanyName")
 
Function IsControlSelected(frm As Form, strControlName As String) As Boolean
 Dim intI As Integer, ctl As Control
 If frm.CurrentView <> 0 Then
   ' Form is not in Design view.
   Exit Function
 Else
   For intI = 0 To frm.Count - 1
     Set ctl = frm(intI)
     If ctl.InSelection = True Then
       ' Is desired control selected?
       If UCase(ctl.Name) = UCase(strControlName) Then
         IsControlSelected = True
         Exit Function
       End If
     Else
       IsControlSelected = False
     End If
   Next intI
 End If
End Function

Al final la cosa es más simplificable, tal como nos enseña Mihura.

Código: [Seleccionar]
Function ControlesSeleccionados(frm As Form) As String
    Dim strTmp As String
    Dim ctl As Control
   
    For Each ctl In frm.Controls
        If ctl.InSelection Then
            strTmp = strTmp & ", " & Chr(34) & ctl.Name & Chr(34)
        End If
    Next ctl
    ControlesSeleccionados = Trim(Mid(strTmp, 2))
End Function
9
Varias / Copiar al portapapeles
« Último mensaje por xavi en Septiembre 24, 2021, 10:19:31 am »
Palabras clave: copiar, portapapeles, clipboard
Autor: Mihura

Objetivo:
McPegasus pregunta en un grupo si existen alternativas al SendKeys ( ;D ) para copiar un texto dado en el portapapeles. Apunta 2 soluciones: una mediante API y otra mediante MSForms.DataObject.
Parece ser que la API está fallando últimamente y que la MSForms obliga a tener la referencia (cosa no siempre posible/deseable)

Respuesta
Mihura, casi al límite del tiempo que había marcado, nos obsequia con esta pequeña maravilla de 5 líneas:

Código: [Seleccionar]
Public Function RT_CopyToClip(ByVal Expresion As String)
    Const DATAOBJECT_BINDING As String = "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
    With CreateObject(DATAOBJECT_BINDING)
        .SetText Expresion
        .PutInClipboard
    End With
End Function
10
Consultas / Saber los registros afectados por una consulta de acción
« Último mensaje por xavi en Septiembre 20, 2021, 06:19:57 pm »
Palabras clave: consulta, SQL, acción, registros
Extraído de: Ayuda de Access

Situación
Lanzamos una consulta de acción que impactará sobre una cantidad de registros. A priori la única forma de saberlo sería abrir un recordset con los mismos criterios y contar los registros impactados. (bueno, eso no siempre sería cierto pero no entraremos en detalles).
Lo que deseamos es, una vez lanzada la consulta, saber cuantos registros se han visto afectados.

Ejemplo: deseamos actualizar todos los registros que contengan el valor "A" en un campo llamado "Zona". Actualizaremos el campo Comercial de esos registros al valor "Xavi".

Respuesta
Utilizaremos la propiedad RecordsAffected del objeto Database de DAO que devuelve la cantidad de registros que se modificaron mediante la ultima llamada del método Execute de un objeto DAO.Database

Para ello es necesario que declaremos un objeto DAO.Database y lo utilizemos para lanzar el Execute (no nos vale DoCmd.RunSQL)


Código: [Seleccionar]
    Dim dbs As DAO.Database
    Set dbs = CurrentDb
   
    dbs.Execute "UPDATE Clientes SET Comercial = 'Xavi' WHERE Zona = 'A'", dbFailOnError
    MsgBox "Actualización de datos realizada. Registros afectados: " & dbs.RecordsAffected, vbInformation
    dbs.Close
    Set dbs = Nothing
Páginas: [1] 2 3 ... 10