Hola, el ejemplo que te pusieron antes creo que no resuelve el problema ya que no cuenta las semanas completas del mes. p.e. 01/08/2009 devuelve 1 cuando debería devolver la última semana del mes anterior ya que ése día es sábado.
Y aunque así fuera, si pones 30/08/2009 devuelve la semana 6 (¿?).
Prueba con esta función:
Código Visual Basic:
Ver originalFunction NumeroSemanaMes(ByVal dFecha As Date) As Integer
Dim iSemanaActual As Integer, iSemanaAnterior As Integer, iRes As Integer
' calculamos el número de semana del año de la fecha actual
iSemanaActual = DatePart("ww", dFecha, vbMonday, vbFirstFourDays)
' calculamos el último día del mes anterior y su número de semana
dFecha = DateSerial(Year(dFecha), Month(dFecha), 0)
iSemanaAnterior = DatePart("ww", dFecha, vbMonday, vbFirstFourDays)
' por diferencia, sacamos la semana actual del mes en curso
iRes = iSemanaActual - iSemanaAnterior
' si es cero es que la semana es la última del mes anterior, repetimos el ciclo
If iRes = 0 Then
' la variable dFecha ahora es el último día del mes anterior
iSemanaActual = DatePart("ww", dFecha, vbMonday, vbFirstFourDays)
dFecha = DateSerial(Year(dFecha), Month(dFecha), 0)
iSemanaAnterior = DatePart("ww", dFecha, vbMonday, vbFirstFourDays)
iRes = iSemanaActual - iSemanaAnterior
End If
NumeroSemanaMes = iRes
End Function
Para llamarla, p.e. desde un CommandButton:
Código Visual Basic:
Ver originalPrivate Sub Command1_Click()
MsgBox NumeroSemanaMes("01/08/2009")
'Si es la fecha actual: MsgBox NumeroSemanaMes(Date)
End Sub
Saludos