
Estoy intentando mostrar algunos datos de mi servidor SQL en Excel. Como tengo una consulta que llega a 3 tablas y usa un parámetro, tendré que usar VBA.
No estoy seguro de cómo hacer que VBA se "ejecute automáticamente". Hacer una consulta normal en Excel le brinda opciones como ejecutar cuando la hoja está abierta o actualizarse automáticamente. Como estoy agregando un parámetro, me gustaría que my Sub
se ejecute cuando cambie el valor de la celda en la que se encuentra el parámetro.
¿Algunas ideas?
Respuesta1
Haga clic derecho en la pestaña de la hoja y elija Ver código. Ponga código como este en el módulo de la hoja.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then 'only run if the correct cell is changed
MySub 'this is the name of your vba procedure
End If
End Sub
Este sub se ejecutará cada vez que se cambie una celda en esa hoja. Si la celda que se cambió es A1 (cambiar para adaptarlo a sus datos), entonces se ejecutará un procedimiento en un módulo estándar llamado MySub (cambiar para adaptarlo).
Sin embargo, no estoy seguro de por qué tienes que usar VBA. Parece que podría escribir SQL para extraer de tantas tablas como desee e incluir un parámetro.
Respuesta2
Poner:
application.volatile
en tu código.
Respuesta3
Para mayor claridad, voy a decir que el parámetro está en la CELDA A1 y el resultado del código VBA aparece en la CELDA A2.
En VBAmódulo
Function Test1(strText as string) as string
Test1 = strText & "15"
End Function
En la Celda A2 coloque la ecuación "=Prueba1(A1)
En la Celda A1 coloque el parámetro que desea cambiar
Verificaría que funciona y luego colocaría el otro código VBA para que se ejecute cada vez que cambie A1.
Respuesta4
La respuesta de dkusleika parece mejor; Las cosas se vuelven un poco más complicadas si quieres hacer lo mismo con un rango. El siguiente código aparecerá cada vez que se modifique una celda dentro del área especificada.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim woArea As Range, isect As Range
Set woArea = Sheet1.Range("A1:A500")
Set isect = Application.Intersect(Target, woArea)
If isect Is Nothing Then
' Nothing happens
Else
' Stuff you want to happen goes here
End If
End Sub