jueves, agosto 28, 2014

Abrir carpeta desde VBA

Función que abre una carpeta desde VBA. Llamando al shell de windows, lanzo la apertura de la carpeta.

Sub openFolder(folderName As String)
    retVal = Shell("explorer.exe " & folderName, vbNormalFocus)
End Sub


Comprobar si existe un archivo en VBA

Función para comprobar si existe o no un archivo. Como parámetro de entrada tengo la ruta del archivo y la función devuelve si existe o no.

Function fileExists(filename) As Boolean
   Dim fso, msg
   Set fso = CreateObject("Scripting.FileSystemObject")
   If (fso.fileExists(filename)) Then
      fileExists = True
      Exit Function
   Else
      fileExists = False
      Exit Function
   End If
End Function

viernes, agosto 22, 2014

Convertir fecha de formato mm/dd/yyyy a dd/mm/yyyy

Me pasaron un excel con fechas en formato inglés en modo texto. Así es cómo las he transformado en fecha en español. Soy consciente de que esta no es la forma mas elegante de hacer esto, pero tenía prisa...

Sub flipDate()
   i = 2
   While (Range("M" & i) <> "")
    
     If Len(Range("M" & i)) = 9 Then
        mm = Left(Range("M" & i), 1)
        dd = Mid(Range("M" & i), 3, 2)
        yyyy = Right(Range("M" & i), 5)
        
     Else
        mm = Left(Range("M" & i), 2)
        dd = Mid(Range("M" & i), 4, 2)
        yyyy = Right(Range("M" & i), 4)
        
     End If
    
     Range("M" & i).Value = ""
     Range("M" & i) = Format(Date, "dd/mm/yyyy")
     Range("M" & i).Value = dd & "/" & mm & "/" & yyyy
     
     
     'Range("M" & i).Activate
     
     DoEvents
     i = i + 1
     'Debug.Print i
     
     'Application.ScreenUpdating = False
   Wend
     Application.ScreenUpdating = True
     MsgBox ("Done!")
End Sub

jueves, mayo 30, 2013

Romper password de Workbook protegido con contraseña en Excel

Agregar un módulo con el siguiente código a el workbook que queramos ejecutar y nos mostrará la password.

'Muestra el password del Workbook a desproteger y lo desprotege
Sub passwordBreaker()

Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
   For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
      For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
         For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
         ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "El password es " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next

End Sub

lunes, enero 21, 2013

Animaciones en VBA


Como crear una animación en Excel,Access, etc:
Se puede usar application.wait para realizar la espera, pero esto nos limita a un mínimo de un segundo entre imagenes por lo que la animación no será creible.
application.Wait (Now + TimeValue("0:00:01"))

Mejor, se puede usar la clase Timer ya que cuenta el tiempo en milisegundos y se puede crear un efecto mas fluido.
Aquí mi código que redimensiona un formulario con un efecto deslizamiento.

Option Explicit

Private Sub showAdminOptions()
   Dim x As Single
   Dim i As Integer
   If (Me.Height = 267) Then ' Is hidden
      For i = 1 To 9
         Me.Height = Me.Height + i
         x = Timer
         While Timer - x < 0.05
            DoEvents
         Wend
      Next i
   End If
End Sub

Private Sub hideAdminOptions()
   Dim x As Single
   Dim i As Integer
   If (Me.Height = 312) Then ' Is shown
      For i = 1 To 9
         Me.Height = Me.Height - i
         x = Timer
         While Timer - x < 0.05
            DoEvents
         Wend
      Next i
   End If
End Sub


viernes, enero 18, 2013

Usar logs en VBA


Si queremos crear un log en archivo de texto al estilo log4j podemos hacerlo con el siguiente procedimiento. El archivo se creará en el mismo directorio donde se encuentre nuestro archivo y tendrá el mismo nombre. Podemos abrirlo con tail si tenemos cygwin instalado. Si no tenemos o no queremos instalar cygwin se puede usar alguna de las muchas aplicaciones gratuitas que existen para hacer esto, como por ejemplo mTail.
Option Explicit

Sub log(LogMessage As String)

   Dim LogFileName As String
   Dim FileNum As Integer
   LogFileName = ThisWorkbook.Path & "\" & ThisWorkbook.Name & ".log"
   FileNum = FreeFile ' next file number
   Open LogFileName For Append As #FileNum ' creates the file if it doesn't exist
   Print #FileNum, Now & " - " & LogMessage ' write information at the end of the text file
   Close #FileNum ' close the file
   DoEvents
End Sub

Funciona en Office 97/2000/2003/2007/2010

miércoles, junio 27, 2012

Oracle, Operadores UNION, UNION ALL, INTERSECT y MINUS. Cosas a tener en cuenta.

Operadores UNION, UNION ALL, INTERSECT y MINUS. Cosas a tener en cuenta.

UNION: Une las dos consultas. Elimina duplicados y ordena los registros resultantes por la primera columna.
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME in ('Steven','Neena')
UNION
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME='Neena'


UNION ALL: Une las dos consultas. No elimina duplicados ni ordena los registros resultantes. Se pueden odenar los resultados usando ORDER BY al final de la consulta.

SELECT * FROM EMPLOYEES
WHERE FIRST_NAME in ('Steven','Neena')
UNION ALL
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME='Neena'


INTERSECT: Devuelve las filas comunes de las dos consultas.
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME in ('Steven','Neena')
INTERSECT
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME='Neena'

Instalar Flash Player mediante apt-get en ubuntu


Con ejecutar la siguiente línea desde el terminal lo tendremos instalado y funcionando.

sudo apt-get install browser-plugin-gnash freepats gnash gnash-common gstreamer0.10-ffmpeg gstreamer0.10-fluendo-mp3 gstreamer0.10-plugins-bad libass4 libboost-date-time1.46.1 libboost-program-options1.46.1 libboost-thread1.46.1 libcdaudio1 libcelt0-0 libdc1394-22 libdirac-encoder0 libdirectfb-1.2-9 libenca0 libfftw3-3 libflite1 libgme0 libkate1 libmimic0 libmms0 libmodplug1 libmpcdec6 libmusicbrainz4c2a libofa0 liboil0.3 libslv2-9 libsoundtouch0 libts-0.0-0 libwildmidi1 libzbar0 tsconf

martes, julio 10, 2007

Invocar un servicio web desde Visual Basic .NET

Para explicarlo voy a crear una aplicación desde cero.

Creamos un nuevo proyecto llamado WebServicesTestApp

WSApp

Anteriormente ya he creado un servicio web, llamado HelloWS y lo he desplegado en un servidor de aplicaciones. Este servicio web tiene un parametro name que recoge un nombre y un método sayHello, que devuelve Hola name !

Creamos un formulario para llamar al servicio web.

WSFormpng

Agregamos una referencia web para llamar a nuestro servicio web

WSWebReferenceAdd

WSWebReferenceAdd2

Ponemos la URL del servicio web, en este caso es: http://10.10.68.205/UniWebServices/HelloWSSoapHttpPort

WSWebReferenceAdd3

Pulsamos sobre Service Description.

WSWebReferenceAdd4

Se enciende el botón agregar referencia y podemos darle un nombre a la referencia.

Después instanciaremos objetos referencia web con este nombre.

WSWebReferenceAdd5

 

Ponemos código en el formulario

 

 

Podemos modificar el archivo app.config para modificar la llamada a nuestro servicio web. En mi caso no tengo mas remedio que hacerlo puesto que el DNS no funciona correctamente. Cambio el nombre de la máquina por la IP y listo.

WSWebReferenceAdd7

Compruebo el comportamiento de la aplicación en caso de que se produzca algún error.

 

WSWebReferenceAdd8

lunes, julio 09, 2007

Instalar el Oracle WebCenter Suite 10g (10.1.3.2.0)

Prerrequisitos: Es necesario instalar una base de datos Oracle (Oracle Database 10g Release 2 (10.2.0.1.0))

Tenemos los 3 zips:

  1. 10201_database_win32.zip - Base de datos
  2. webcenter_windows_x86_101320_disk1.zip - Webcenter
  3. webcenter_addsrvcs_windows_101320_disk1.zip - Servicios adicionales (discussions,wiki)

 

Configuración de base de datos

ATENCION:

  1. La versión Oracle Database 10g Release 1 (10.1.0.2) Windows No es compatible.
  2. La base de datos tiene que estar configurada con el juego de carácteres AL32UTF8. (Afortunadamente se puede crear otra base de datos con este juego de carácteres mediante el uso del Asitente de configuración de Bases de datos)
  3. Hay que ejecutar el script cdb_alter_system.sql para cambiar unos parámetros del sistema, si no nos saldrá este bonito error: 
Execute-cdb_alter_system.sql

Ejecutamos el script:

Execute-cdb_alter_system.sql-inSqlPlus

Reiniciamos la base de datos.

Se supone que hay un parámetro llamado  "db_create_file_dest" en el que se puede definir la ruta donde están alojados nuevos archivos de la base de datos para que el programa cree por nosotros los TABLESPACE que necesita. Yo directamente creo los tablespaces según el programa de instalación me los va indicando.

Hay que crear los siguientes tablespaces. Deben tener por lo menos una capacidad de 170 Megas (Dá igual que sean autoextensibles, si el programa de instalación detecta que su tamaño es menor no nos dejará pasar al paso seiguiente)

CONTENT_IFS_MAIN
CONTENT_IFS_LOB_N
CONTENT_IFS_LOB_M
CONTENT_IFS_LOB_I
CONTENT_IFS_CTX_X
CONTENT_IFS_CTX_K
CONTENT_IFS_CTX_I

WORKFLOW_IFS_MAIN -> El sistema posteriormente nos informa de que falta este tablespace, así que mejor crearlo ahora. Por este motivo puede fallar la instalación.

Se pueden crear así:

CREATE TABLESPACE CONTENT_IFS_MAIN DATAFILE
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTENT_IFS_MAIN.DBF' SIZE 490M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
FLASHBACK ON;

 

WebcenterTablespaces

 

Instalación de webcenter

Ejecutamos el instalador, metemos la configuración de la base de datos y el password del usuario oc4jadmin.

Nos pide que especifiquemos una clave para el esquema del repositorio. Esta será la clave del usuario contentadmin.

Después nos pedirá especificar un repositorio de usuarios. (Es una pena que esto no se pueda cambiar...) Yo elegiré archivos.

WebCenterUserRepositorySelect

A mi la primera vez se me colgó y no instaló bien.

Desinstalando,reiniciando y renombrando el directorio antiguo a _OLD, todo funcionó correctamente. (Atención a la creación de los tablespaces)

Por suerte desde hace un tiempo Oracle ha mejorado sus programas de instalación y la desinstalación suele funcionar correctamente, aunque no borra los archivos de instalación del producto. Lo cual me parece bien ya que a veces interesa tener una copia de seguridad del servidor antiguo.

Eso es todo.