¿Cómo puedo tomar la posición de un dato de excel a través de una macro?

Tengo un combobox que me carga ciertos datos de una hoja de excel, necesito tomar la posición de una celda a la que esta accediendo el combobox, mover esa posición dos columnas atrás y asignar el dato que se encuentra en esa posición a un lable ... Por ejemplo, si el combobox muestra el valor de la celda D5, quiero que el lable tenga el valor de B5...como puedo hacerlo??

Gracias

Respuesta
1

Prueba este código. Espero haber sido claro con las explicaciones.

Private Sub UserForm_Initialize()
Dim aux As String
Dim txt As String
Dim nomHoja As String
Dim nCol As Integer
Dim nLin As Long
Dim i As Integer
' Leemos el origen del control
aux = Me.ComboBox1.ControlSource
' Si tiene puestos caracteres $ los quitamos
aux = Replace(aux, "$", "")
' La variable aux tendrá una referencia a una celda del tipo
' <pagina>!<letra de la columna><número de fila>
' Si tiene el nombre de la página... lo separamos
If InStr(aux, "!") > 0 Then
nomHoja = Left$(aux, InStr(aux, "!") - 1)
aux = Right$(aux, Len(aux) - InStr(aux, "!"))
Else
nomHoja = ""
End If
' Si la fórmula empieza por "=" o por "+" lo quitamos
If Left$(aux, 1) = "=" Then aux = Right$(aux, Len(aux) - 1)
If Left$(aux, 1) = "+" Then aux = Right$(aux, Len(aux) - 1)
' Ahora nos quedará en aux sólo el nombre de la celda con el formato
' <letra de la columna><número de fila>
' Como la fila es un valor numérico, lo iremos quitando de la derecha
' de aux al tiempo que lo guardamos en nLin
nLin = 0: i = 0
Do While Right$(aux, 1) >= "0" And Right$(aux, 1) <= "9"
' En la derecha tenemos un número, lo sumamos
nLin = Val(Right$(aux, 1)) * (10 ^ i) + nLin
' Y lo quitamos de aux
aux = Left$(aux, Len(aux) - 1)
' Incrementamos "i" para que el siguiente número sea 10 veces mayor
i = i + 1
Loop
' Sólo nos queda reconocer el número de la columna que está representado
' en aux con letras. Esto es, si aux="A" la columna sería 1, si aux="I"
' la columna será la 9 y si tuviera "AB" sería la columna 28
' Para facilitar el cálculo pasaremos aux a mayúsculas
' NOTA: la letra "A" es el carácter ASCII 65, la B es el 66 y así
' sucesivamente. Por eso buscaremos el valor ASCII de la letra y le
' restaremos 64 para saber el número de columna.
' Si la columna está representada por 2 letras, primero calcularemos el
' número de la primera y, cuando vayamos a por la segunda multiplicaremos
' el valor que teníamos por 26 (hay 26 letras de columna entre la A y Z)
aux = UCase$(aux)
nCol = 0
Do While aux <> ""
nCol = nCol * 26 + Asc(Left$(aux, 1)) - 64
aux = Right$(aux, Len(aux) - 1)
Loop
' Ya sabemos la página, la fila y la columna. El resto es fácil
If nCol > 2 Then
If nomHoja <> "" Then
' Buscamos el valor de la hoja, fila y 2 columnas menos
txt = Sheets(nomHoja).Cells(nLin, nCol - 2)
Else
' Buscamos lo mismo en la hoja actual
txt = ActiveSheet.Cells(nLin, nCol - 2)
End If
Else
' No podemos hacerlo pues la columna -2 daría 0 o negativo
txt = "ERROR: no puedo acceder a 2 columnas menos"
End If
Me.Label1.Caption = txt
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas