error extraño en funcion

29/10/2006 - 13:03 por Ivan | Informe spam
hola a todos

estoy intentando hacer una funcion que devuelva la letra de columna.
Aunque seguramente ya exista, es solo por practicar un poco.

mas o menos la tengo conseguida, pero aparte de darme un error, hace
una cosa a la que no acabo de encontrar causa->: estoy intentando poner
en la fila 1 de cada columna su letra y lo pone en todas excepto en la
columna "IA"(nº 235), que la deja en blanco. Da 'error en el metodo
range del objeto worksheet. sin embargo el contador si sube hasta 256 y
todas las demas columnas se rellenan.

seguro que es un fallo tonto, pero no lo veo. ahi van los codigos

Sub Probar_Ltr()
Dim nC As Single
With Hoja1
.[a1:iv1].Clear
For nC = 1 To 256
.Range(Letra_Columna(nC) & 5).Value = Letra_Columna(nC)
Next
End With
End Sub
Private Function Letra_Columna(ByVal nroCol As Single) As String
Dim nroPri As Single
If nroCol < 27 Then
Letra_Columna = Chr(64 + nroCol)
Exit Function
End If
If nroCol Mod 26 = 0 Then
nroPri = Int(nroCol / 26) - 1
Else
nroPri = Int(nroCol / 26)
End If
Letra_Columna = Chr(64 + nroPri) & Chr(65 + (nroCol Mod 26))
End Function

a ver si veis algo

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Ivan
29/10/2006 - 13:29 | Informe spam
FE de erratas : aunque no afecta al error, cambiar ->

->> .Range(Letra_Columna(nC) & 5).Value = Letra_Columna(nC)

por->> .Range(Letra_Columna(nC) & 1).Value = Letra_Columna(nC)


se me quedo asi tras varias pruebas, pero el error sigue ahí

un saludo
Ivan
Respuesta Responder a este mensaje
#2 KL
29/10/2006 - 14:45 | Informe spam
Hola Ivan,

1) tu funcion tiene algoritmo equivocado - devuelve valor erroneo para la "Z"

2) tu funcion se podria sustituir con otra mucho mas eficiente:

Private Function Letra_Columna2(ByVal ColumnNumber As Integer) As String
Dim txt As String
txt = Columns(ColumnNumber).Address(False, False)
Letra_Columna2 = Left(txt, InStr(txt, ":") - 1)
End Function

3) podrias dar me un ejemplo de situacion en la que sea estrictamente necesario usar la letra de la columna?

Saludos,
KL


"Ivan" wrote in message news:
hola a todos

estoy intentando hacer una funcion que devuelva la letra de columna.
Aunque seguramente ya exista, es solo por practicar un poco.

mas o menos la tengo conseguida, pero aparte de darme un error, hace
una cosa a la que no acabo de encontrar causa->: estoy intentando poner
en la fila 1 de cada columna su letra y lo pone en todas excepto en la
columna "IA"(nº 235), que la deja en blanco. Da 'error en el metodo
range del objeto worksheet. sin embargo el contador si sube hasta 256 y
todas las demas columnas se rellenan.

seguro que es un fallo tonto, pero no lo veo. ahi van los codigos

Sub Probar_Ltr()
Dim nC As Single
With Hoja1
.[a1:iv1].Clear
For nC = 1 To 256
.Range(Letra_Columna(nC) & 5).Value = Letra_Columna(nC)
Next
End With
End Sub
Private Function Letra_Columna(ByVal nroCol As Single) As String
Dim nroPri As Single
If nroCol < 27 Then
Letra_Columna = Chr(64 + nroCol)
Exit Function
End If
If nroCol Mod 26 = 0 Then
nroPri = Int(nroCol / 26) - 1
Else
nroPri = Int(nroCol / 26)
End If
Letra_Columna = Chr(64 + nroPri) & Chr(65 + (nroCol Mod 26))
End Function

a ver si veis algo

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 Vinchenzo vinç
29/10/2006 - 18:15 | Informe spam
"Ivan" <@> escribió en el mensaje news:
hola a todos

estoy intentando hacer una funcion que devuelva la letra de columna.
Aunque seguramente ya exista, es solo por practicar un poco.



Hola,
yo iba a sugerirte lo comentado por KL, es lo más sencillo.

Pero como dices que 'es sólo por practicar', te paso igualmente una implementación de la modificación tu función.
Por cierto, fíjate que sería más coherente usar el tipo de dato 'Long' en lugar del 'Single' (en el bucle y en la firma de la función), no necesitas la precisión simple.
Fíjate también en la función 'Chr', que escrita así te devuelve en realidad un tipo 'Variant' (en concreto 'Variant/String'), en cambio 'Chr$' te devuelve un verdadero 'String'.

'************************
Private Function Letra_Columna(ByVal nroCol As Long) As String
If nroCol < 27 Then _
Letra_Columna = Chr$(64 + nroCol) Else _
Letra_Columna = Chr$(64 + (nroCol \ 26) + CInt(nroCol Mod 26 = 0)) & _
Chr$(64 + IIf(nroCol Mod 26 = 0, 26, nroCol Mod 26))
End Function
'************************


Saludos
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/micr...c.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/defaul...newsreglas
Respuesta Responder a este mensaje
#4 Ivan
30/10/2006 - 02:36 | Informe spam
hola Kl y Vinchenzo, lo primero muchas gracias

aun no he tenido tiempo de estudiar vuestras respuestas, pero os
comento un poco por encima

lo cierto es que como comenta/s Vinchenzo, es solo un intento de
practicar un poco con funciones, una especie de autoejercicio, surgido
a raiz de una respuesta en el foro de VBA a una consulta sobre el tema
(respondida por cierto previamente por el propio Vinchenzo)

1) tu funcion tiene algoritmo equivocado - devuelve valor erroneo para la "Z"





es lo que me parecia, pero no lograba ver la manera de evitarlo. Ahora,
viendo en la funcion de Vinchenzo -> IIf(nroCol Mod 26 = 0, 26, nroCol
Mod 26), me parece evidente, pero claro, a toro pasado...

2) tu funcion se podria sustituir con otra mucho mas eficiente:

Private Function Letra_Columna2(ByVal ColumnNumber As Integer) As
String
Dim txt As String
txt = Columns(ColumnNumber).Address(False, False)
Letra_Columna2 = Left(txt, InStr(txt, ":") - 1)
End Function

gracias, voy a estudiarla

3) podrias dar me un ejemplo de situacion en la que sea estrictamente necesario usar la letra de la columna?





la verdad es que no se me ocurre ninguno

pero tambien es cierto que esta forma la estoy usando bastante, sobre
todo para cargar una lista con 26 campos (de la 'a' a la 'z') en un
formulario mediante esta instruccion ->

Me.Controls(.Range("c" & nTxt).Value) = _
Worksheets(HojaFicha).Range(Chr(64 + nTxt) & Fila).Value

el nombre del control lo captura de las filas 1 a 26 de la columna 'c'
de la hoja 'Matrices'

me imagino que podria ponerse tambien asi ->

Me.Controls(.Range("c" & nTxt).Value) = _
Worksheets(HojaFicha).Range("a" & Fila)(1, txt).Value

¿seria mas eficiente/rapido de esta segunda forma?

Hola, yo iba a sugerirte lo comentado por KL, es lo más sencillo.





mas o menos lo intuia tras ver tu respuesta en el foro de vba, pero
efectivamente es sobre todo por practicar

Por cierto, fíjate que sería más coherente usar el tipo de dato 'Long' en lugar del 'Single' (en el bucle y en la firma de la función), no necesitas la precisión simple.

Fíjate también en la función 'Chr', que escrita así te devuelve en realidad un tipo 'Variant' (en concreto 'Variant/String'), en cambio 'Chr$' te devuelve un verdadero 'String'.





son las tipicas informaciones (al menos para mi) que aun estando
seguramente en la ayuda es posible no conocer/asimilar nunca hasta que
te las dicen o te topas con ellas de alguna forma. Muchas gracias de
nuevo, lo añado a la saca.


'************************
Private Function Letra_Columna(ByVal nroCol As Long) As String
If nroCol < 27 Then _
Letra_Columna = Chr$(64 + nroCol) Else _
Letra_Columna = Chr$(64 + (nroCol \ 26) + CInt(nroCol Mod 26 0)) & _
Chr$(64 + IIf(nroCol Mod 26 = 0, 26, nroCol Mod
26))
End Function
'************************

parece incluir (evidentemente, aparte de mejorar) la instruccion que me
mareaba con la 'z'

voy a estudiarla un poco mas

bueno, lo dicho, muchas gracias de nuevo a ambos, y cuando haya
probado/estudiado las propuestas os comento si me surgen dudas

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#5 Héctor Miguel
30/10/2006 - 04:00 | Informe spam
hola, Ivan !

estoy intentando hacer una funcion que devuelva la letra de columna.
Aunque seguramente ya exista, es solo por practicar un poco...



aqui tienes otras alternativas [para tu coleccion] ;)

1) si lo quisieras por funciones 'nativas' en hojas de calculo, y suponemos que pones el numero de columna en 'A1'
op1: =izquierda(direccion(1,a1,4),largo(direccion(1,a1,4))-1)
op2: =extrae(direccion(1,a1),2,hallar("$",direccion(1,a1),2)-2)

2) 'lo mismo' pero en procedimientos function por vba y pasando como parametro el numero de columna...
[desmarca la opcion correspondiente en codigo vba a las funciones anteriores] :D
Function Letra_Col(Col As Integer) As String
With Cells(1, Col)
' similar a la opcion de la formula 1:
' Letra_Col = Left(.Address(0, 0), Len(.Address(0, 0)) - 1)
' similar a la opcion de la formula 2:
' Letra_Col = Mid(.Address, 2, InStr(2, .Address, "$") - 2)
End With
End Function

3) dado que una funcion de este tipo la puedes usar tanto en hojas de calculo como desde codigos 'en directo'...
si se diera el caso de que la hoja 'activa' [al momento de llamarla] NO es una hoja de calculo... cambia la instruccion 1:
de: -> With Cells(1, Col)
a: -> With Worksheets(1).Cells(1, Col)

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida