
Si en alguna ocasión necesitamos modificar el número de líneas que aparece al desplegar la lista de un combobox podremos hacerlo con el API de Windows :
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal
x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,
ByVal bRepaint As Long) As Long
Public Sub SizeCombo(frm As Form, cbo As ComboBox)
' Modificar el tamaño del área desplegable de un combobox
Dim cbo_left As Integer
Dim cbo_top As Integer
Dim cbo_width As Integer
Dim cbo_height As Integer
Dim old_scale_mode As Integer
' cambiamos el ScaleMode del formulario a pixels
old_scale_mode = frm.ScaleMode
frm.ScaleMode = vbPixels
' guardamos los valores actuales del combobox
cbo_left = cbo.Left
cbo_top = cbo.Top
cbo_width = cbo.Width
' cambiamos el alto del combo (en este caso para que ocupe hasta el
final del
' formulario menos 5 pixels) y restauramos el sistema de coordenadas
del formulario
cbo_height = frm.ScaleHeight - cbo.Top - 5
frm.ScaleMode = old_scale_mode
' Modificamos el tamaño de la ventana desplegable del combo
MoveWindow cbo.hwnd, cbo_left, cbo_top, cbo_width, cbo_height, 1
End Sub
Para ejecutarlo simplemente llamamos a la función SizeCombo pasándole el
formulario y el combo

La rutina del ejemplo anterior funciona perfectamente si el combo está en un formulario pero no si estaba dentro de un frame (o de un picture) con lo que las coordenadas del mismo son relativas al frame y no al formulario, no cambian de twips a pixels al cambiar el estilo de coordenadas del formulario, etc.
He modificado la función para que tenga en cuenta esta situación :
Public Sub SizeCombo(frm As Form, cbo As ComboBox)
' Modificar el tamaño del área desplegable de un combobox
Dim cbo_left As Integer
Dim cbo_top As Integer
Dim cbo_width As Integer
Dim cbo_height As Integer
Dim old_scale_mode As Integer
' cambiamos el ScaleMode del formulario a pixels
old_scale_mode = frm.ScaleMode
frm.ScaleMode = vbPixels
'si el combo está dentro de un contenedor (picture, frame) tenemos en cuenta las coordenadas del mismo
'y además las coordenadas del combo estarán en twips y no en pixels
If Not (TypeOf cbo.Container Is Form) Then
cbo_left = (cbo.Left / Screen.TwipsPerPixelX)
cbo_top = (cbo.Top / Screen.TwipsPerPixelY)
cbo_width = (cbo.Width / Screen.TwipsPerPixelX)
' cambiamos el alto del combo (en este caso para que ocupe hasta el final del frm menos 5 pixels)
cbo_height = frm.ScaleHeight - cbo.Container.Top - cbo_top - 5
Else
' guardamos los valores actuales del combobox
cbo_left = cbo.Left
cbo_top = cbo.Top
cbo_width = cbo.Width
' cambiamos el alto del combo (en este caso para que ocupe hasta el final del frm menos 5 pixels)
cbo_height = frm.ScaleHeight - cbo_top - 5
End If
' restauramos el sistema de coordenadas del formulario
frm.ScaleMode = old_scale_mode
' Modificamos el tamaño de la ventana desplegable del combo
MoveWindow cbo.hwnd, cbo_left, cbo_top, cbo_width, cbo_height, 1
End Sub

