Mensajes recientes

Páginas: [1] 2 3 ... 10
1
Varias / Especificación importación de Texto/CSV dónde títulos no es primera línea
« Último mensaje por xavi en Marzo 15, 2021, 10:42:45 am »
Palabras clave: recordset, fichero, archivo, texto, plano, CSV
Autor: raipon

Objetivo:
A raíz de la necesidad de importar datos de un fichero CSV dónde la primera fila está llena de porquería, la segunda contiene los nombres de campos y solo a partir de la tercera aparecen datos, raipon nos enseñó como manejar esa casuística:

La clave es el el campo StartRow de la especificación de importación. No es un campo que aparezca en el asistente de importación/vinculación por lo que será un poco complicado crear la especificación.

El truco es:
1. Hacer una copia del fichero
2. Editarlo para dejar la primera fila como la de los títulos
3. Hacer una importación con asistente guardando la especificación
4. Modificar la especificación en la tabla MSysIMEXSpecs (tabla de sistema; podría estar oculta)
5. Eliminar la copia de test y probar con ficheros reales


2
Módulos / Re:Averiguar si existe un procedimiento
« Último mensaje por xavi en Febrero 22, 2021, 12:24:01 pm »
Como siempre, sólo hay que bucear un poco para encontrar una respuesta que mejore ampliamente el rendimiento. Y, como no, la respuesta es de Happy. Utilizando el objeto indocumentado WizHook.

Código: [Seleccionar]
Function whExisteProcedimiento(strProcedure As String) As Boolean
    WizHook.Key = 51488399
    whExisteProcedimiento = WizHook.GlobalProcExists(strProcedure)
End Function
3
Formularios / Desplegar selector de fecha
« Último mensaje por xavi en Enero 23, 2021, 10:05:11 pm »
Palabras clave: fecha, desplegar, datapicker, selector
Autor: Missinglinq
Extraído de: Access Forums

Pregunta
¿Cómo puedo desplegar automáticamente el selector de fecha al entrar en un cuadro de texto?

Respuesta
En el evento al recibir enfoque (GotFocus) desplegamos el selector. En el evento Al cambiar, mandamos el foco a otro control

Código: [Seleccionar]
Private Sub DateField_GotFocus()
  DoCmd.RunCommand acCmdShowDatePicker
End Sub

Private Sub DateField_Change()
  Me.AnotherControl.SetFocus
End Sub

Private Sub DateField_AfterUpdate()
  'AfterUpdate code goes here
End Sub

Si el cuadro de texto fuera el primer control del formulario podríamos simular el proceso con el evento Timer

Código: [Seleccionar]
Private Sub Form_Load()
  Me.TimerInterval = 1
End Sub

Private Sub Form_Timer()
  Me.TimerInterval = 0
  Me.DateField.SetFocus
  DoCmd.RunCommand acCmdShowDatePicker
End Sub
4
API / Nombre corto, nombre largo
« Último mensaje por xavi en Enero 18, 2021, 07:37:20 pm »
Palabras clave: carpeta, directorio, fichero, archivo, nombre, corto, largo API
Autor: Happy
Extraído de: Access y VBA

Objetivo:
Rescato estos procedimientos de Happy para obtener el nombre corto de fichero a partir del nombre largo y viceversa.


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

Private Declare Function GetLongPathName Lib "kernel32" _
                Alias "GetLongPathNameA" _
                (ByVal lpszShortPath As String, _
                ByVal lpszLongPath As String, _
                ByVal cchBuffer As Long) As Long

Private Declare Function GetShortPathName Lib "kernel32" _
                Alias "GetShortPathNameA" _
                (ByVal lpszLongPath As String, _
                ByVal lpszShortPath As String, _
                ByVal lBuffer As Long) As Long

Function GetLongName(ShortPath As String) As String
Dim LenLongName As Long
Dim buffer As String * 1000

    LenLongName = GetLongPathName(ShortPath, _
                          buffer, Len(buffer))
    If LenLongName Then
        GetLongName = Left$(buffer, LenLongName)
    End If

End Function

Function GetShortName(LongPath As String) As String
Dim LenShortName As Long
Dim buffer As String * 1000

    LenShortName = GetShortPathName(LongPath, _
                          buffer, Len(LongPath))
    If LenShortName Then
        GetShortName = Left$(buffer, LenShortName)
    End If

End Function

5
Varias / Obtener lenguaje de Office
« Último mensaje por xavi en Enero 08, 2021, 12:56:12 pm »
Palabras clave: lenguaje, idioma
Autor: xavi
Extraído de: Web de Microsoft

Por necesidades del parámetro Format de la función PasteSpecial de Excel, me he visto forzado a buscar si existía una forma de averiguar el idioma de Excel. Y me he topado con esto:

Código: [Seleccionar]
Application.LanguageSettings.LanguageID(msoLanguageIDUI)


El valor que devuelve es un numérico.

URL's dónde obtener valores y códigos
MsoLanguageID (enumeración) (Office)
Identificadores de idioma y valores de identificador de OptionState en Office 2016

6
Excel / Última fila con datos de un fichero Excel
« Último mensaje por xavi en Octubre 22, 2020, 06:51:09 pm »
Palabras clave: Excel, automatización, registros
Autor: Jesus Mansilla (Mihura)

En ocasiones necesitamos leer un fichero Excel mediante automatización y, para poder mostrar "algo" que nos de idea del progreso, es necesario averiguar la cantidad de registros afectados,

Una opción es insertar una fórmula en una celda "lejana" que nos haga un COUNTA (CONTARA) de los registros de una columna que sepamos debe estar toda rellena.

xls.ActiveSheet.Cells(1, 255).FormulaR1C1 = "=COUNTA(C1)

Leer el resultado (restarle 1 si existe una fila de titulos) y eliminar el contenido de la celda. Hay que acordarse de que, al cerrar el Excel, no se guarden los cambios.

Jesus presenta una alternativa:

UltimaFila = xls.ActiveSheet.Cells(xls.ActiveSheet.Rows.Count, 1).End(xlUp).Row

Traducido: posicionarse en la ultima fila de la hoja (ActiveSheet.Rows.Count) en su primera columna (1) y "tirar p'arriba" con .End(xlUp)  (equivalente a Ctrl + flecha arriba). Ello posiciona en la ultima celda escrita de la columna. Y de allí tomamos la fila (.Row)

Lo mismo para las columnas
UltimaColumna = xls.ActiveSheet.Cells(1, xls.ActiveSheet.Columns.Count).End(xlToLeft).Column

Ingenioso.
7
Excel / Deshabilitar eventos de Excel
« Último mensaje por xavi en Octubre 15, 2020, 04:27:47 pm »
Palabras clave: Excel, Autoexec, eventos
Autor: Xavi
Extraído de: Experiencia propia

En ocasiones es necesario abrir por automatización un fichero Excel pero este, al hacerlo, lanza los eventos de apertura que pueden interferir en la automatización (si se abre un UserForm, por ejemplo).

Después de probar con DoEvents desde Access para que el código siga ejecutándose (sin éxito) descubro que puedo utilizar EnableEvents para la instancia de Excel (justo después de crearla) para establecerla a False y que en la apertura del libro no se lance nada.


Código: [Seleccionar]
Set xlsApp = CreateObject("Excel.Application")
xlsApp.EnableEvents = False
xlsApp.Workbooks.Open "ElFichero"
8
Formularios / Ítems seleccionados de un ListBox
« Último mensaje por xavi en Octubre 10, 2020, 10:50:29 am »
Palabras clave: listbox, recorrer, multiselección
Autor: Xavi
Extraído de: Harto de buscarlo cuando lo necesito, lo cuelgo aquí

Pregunta
¿Cómo puedo recorrer los ítems seleccionados de un cuadro de lista de selección múltiple?

Respuesta
Habitualmente tratamos con los ListBox en modo de selección simple pero, cuando se trata de un ListBox de multiselección, el modo de obtener la lista de valores seleccionados es ligeramente distinto.

Lo que haremos será imaginar un ListBox de 2 columnas dónde la primera está oculta (es el índice) y la segunda es la que muestra la descripción.
Deseamos obtener la lista de índices que se han seleccionado (da lo mismo que sea selección extendida o no) para almacenarlos en una cadena de texto que utilizaremos, por ejemplo, en una cláusula IN de una SQL.


Código: [Seleccionar]
    Dim varitem
    Dim strTmp As String
    Dim strIN    As String
    For Each varitem In Me!cboEjemplo.ItemsSelected
        strTmp = strTmp & ", " & Me!cboEjemplo.Column(0, varitem)
    Next
    strIN = "IN (" & Mid(strTmp, 3) & ")"
9
Consejos, técnicas, artículos / Re:Asignación de funciones a eventos
« Último mensaje por matasl en Agosto 28, 2020, 05:29:41 pm »
Buenos días.

Muchas gracias por los artículos que publicas, para los que estamos en pañales en access, nos son de mucha utilidad.

He llegado hasta acá buscando y leyendo información respecto a la consulta que hice y que muy amablemente atendiste en:

http://www.mvp-access.com/foro/topic85459_post514181.html#514181

Cada momento estoy un paso mas adelante en lograr ese procedimiento para asignar una función a un boton y utilizar una variable pública para almacenar el valor en el momento de pedir el informe (no es nada fácil, pues en una escala de 1 a 10 yo estoy en 2 y eso de strUnaVariable = Me!UnCampo me cuesta mucho interpretarlo).

Bendiciones


10
WSH / Emular SendKeys
« Último mensaje por xavi en Julio 28, 2020, 08:48:47 pm »
Palabras clave: sendkeys, bloqnum
Autor: A mi me lo pasó Mihura

Objetivo:
Emular el funcionamiento de SendKeys de Access pero sin el problema reconocido de activar/desactivar la tecla de bloqueo numérico.

Código: [Seleccionar]
Function fSendKeys(strKey as String)
  Dim ws As Object
  Set ws = CreateObject("WScript.shell")
  ws.SendKeys strKey
  Set ws = Nothing
End Function

Páginas: [1] 2 3 ... 10