Buenas noches, Soy de venezuela y estoy tratando de aprender un poco más de Excel, para paliar un poco la crítica situación económica que tenemos en el pais.
Co la ayuda de otro amigo he avanzado bastante en este proyecto pero todavia tengo 2 problemas que resolver...
Esta hoja al ejecutar el Userform, la macro busca en la columna C, EL NOMBRE programado en el formulario y se ubica en el RANGO DEL MES INDICADO, y RELLENA las celdas en las columnas correspondientes a D1, D2,D3,D4,D5, Y D6, del mes en cuestión, EL PROBLEMA ES QUE ME SOBREESCRIBE LAS CELDA SI YA ESTAN LLENAS , NECESITO ME INDIQUE ERROR Y SE DETENGA SI LAS CELDAS YA ESTÁN LLENAS.
OTRO PROBLEMA ES QUE SOLO ME FUNCIONA PARA EL PRIMER MES, (Septiembre) necesito me funcione para los demás meses.
Soy un novato en programación con excel y he estado recibiendo ayuda de amigos y aprendiendo un poco con este proyecto, pero es muy avanzado para mi nivel, asi que agradezco enormente la ayuda que puedan brindarme.
Adjunto | Tamaño |
---|---|
ayuda_con_excel.png | 66.42 KB |
ejemplo_form_introducir_datos_mensuales.xlsm | 635.37 KB |
¡Ánimo Venezuela!
Duda 1: no sobrescribir valores
Para detectar si una celda está vacía o no, para no sobrescribir su valor, puedes emplear la función IsEmpty
Así que puedes comprobar si alguna celda está llena antes de escribir en ellas por ejemplo con algo así (Adjunto ejemplo también):
bl_continuar = True
With ActiveCell
For i = 1 To 6
bl_continuar = bl_continuar And IsEmpty(.Offset(0, i))
Next
End With
If bl_continuar Then
ActiveCell.Offset(0, 1).Value = Me.D_1.Text
ActiveCell.Offset(0, 2).Value = Me.D_2.Text
ActiveCell.Offset(0, 3).Value = Me.D_3.Text
ActiveCell.Offset(0, 4).Value = Me.D_4.Text
ActiveCell.Offset(0, 5).Value = Me.D_5.Text
ActiveCell.Offset(0, 6).Value = Me.D_6.Text
MsgBox "Los datos se guardarón correctamente", vbInformation
Else
MsgBox "Hay valores previos en la hoja" & vbCrLf & _
"No se anotan para no sobrescribirlos", vbOKOnly + vbExclamation
End If
Duda2: el mes
Pues esto depende de cómo se la hoja ¿las columnas siempre están en el mismo sitio? quiero decir, que si septiembre siempre está en la celda E2 y diciembre siempre está en la celda AC2
Si las posiciones son fijas, haz una función que te devuelva la columna de cada mes. por ejemplo
Si en el futuro cambian los meses de posición, sólo tendrás que retocar esta función que devuelve como resultado la columna de cada mes
Private Function columnadelmes(miMes As String) As String
' devuelve la posición de cada mes en la hoja
Select Case miMes
Case "Septiembre"
columnadelmes = "E"
Case "Octubre"
columnadelmes = "M"
Case "Noviembre"
columnadelmes = "U"
Case "Diciembre"
columnadelmes = "AC"
Case "Enero"
columnadelmes = "AK"
Case "Febrero"
columnadelmes = "AS"
Case "Marzo"
columnadelmes = "BA"
Case "Abril"
columnadelmes = "BI"
Case "Mayo"
columnadelmes = "BQ"
Case "Junio"
columnadelmes = "BY"
Case "Julio"
columnadelmes = "CG"
Case "Agosto"
columnadelmes = "CO"
End Select
End Function
Para obtener la posición de la celda donde apuntar, modifícalo para utilizar esta función
Range(columnadelmes(Me.cboMes) & m_row).Select
Te sobraría el select case del mes en tu procedimiento principal
Adjunto ejemplo
------
Ya sé Excel, pero necesito más.
Gracias por dedicar su tiempo a ayudar... Muy agradecido, todo funciona a la perfección segun lo ue necesito.