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

#6 Ivan
30/10/2006 - 13:50 | Informe spam
hola Hector, muchas gracias de nuevo

aqui tienes otras alternativas [para tu coleccion] ;)





añado tus propuestas a la saca, junto a las de KL y Vinchenzo (por
cierto, aunque supongo que esta a la vista, en un lapsus, me he
respondido a mi mismo, en vez de a ellos/vosotros).

1) si lo quisieras por funciones 'nativas' en hojas de calculo







tambien resulta interesante, ...lo dicho, a la saca

2 'lo mismo' pero en procedimientos function por vba y pasando ..





tengo unos dias un poco liado, pero en cuanto tenga huecos ire
comparando/estudiando las propuestas y, si hay dudas os comento

gracias de nuevo y un saludo y hasta pronto
Ivan



Héctor Miguel ha escrito:

hola, Ivan !

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

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
#7 KL
30/10/2006 - 15:49 | Informe spam
Hola chicos,

"Héctor Miguel" wrote
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)



Yo incluso haria algo asi:

=sustituir(direccion(1;a1;4);1;"")

Saludos,
KL
Respuesta Responder a este mensaje
#8 KL
30/10/2006 - 15:59 | Informe spam
Al parecer las formulas las escribo entre SPAM y SPAM que yo(???) he estado sembrando en todos los foros en castellano durante los
ultimos dias;-))))

Saludos,
KL


"KL" wrote in message news:OLOvjKD$
Hola chicos,

"Héctor Miguel" wrote
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)



Yo incluso haria algo asi:

=sustituir(direccion(1;a1;4);1;"")

Saludos,
KL


Respuesta Responder a este mensaje
#9 Ivan
30/10/2006 - 21:12 | Informe spam
KL ha escrito:

Al parecer las formulas las escribo entre SPAM y SPAM que yo(???) he..



a eso se le llama capacidad !!!

bromas aparte, gracias de nuevo, KL

> Yo incluso haria algo asi: > > > > =sustituir(direccion(1;a1;4);1;"")



la añado, junto con el resto, a mi proxima 'materia de estudio'. De
hecho, creo que tras esta consulta, no voy a tener 'mas remedio' que
sucumbir a la tentacion de meterle mano a las formulas/funciones de
hoja, con las que me manejo aun peor que con los codigos.

si me 'enfarrago' demasiado me imagino que nos volveremos a ver por
aqui

un saludo
Ivan
Respuesta Responder a este mensaje
#10 Ivan
01/11/2006 - 00:53 | Informe spam
hola chicos

aqui estoy de nuevo, aunque esta vez sobre todo para comentar el
resultado de mis pruebas a ver que os parece (de momento solo le he
metido mano a los codigos)

tras correr un monton de pruebas con los cuatro codigos ( el de KL, el
de Vinchenzo y los dos de HM) he llegado a la conclusion de que el mas
rapido, y con bastante diferencia, es el de Vinchenzo

lo que mas me llama la atencion es que los tres (Vinchenzo incluido)
pareciais pensar que seria el menos eficiente, lo que me hace pensar
que por 'eficiencia' no os referis solo a la velocidad, sino a algo mas
que no acabo de ver, y que, por el nivel de mis tres interlocutores (y
aunque me repita, no se trata de una alabanza, solo de una mera
descripcion) no dudo que debe existir.

tambien hay otra cosa peculiar. Las pruebas la he hecho cargando la
'direccion' de las celda de toda la fila (completa en unos casos y solo
la de columna en otros), en una fila, en 100, en 500, y en 1000

este es el procedimiento que carga las 'direcciones', una hoja para
cada codigo que luego lleno con un bucle del proc. que expongo al final

Sub Probar_Ltr_4()
Dim nc As Integer ', Fila As Long
Experto = "K_L"
With Hoja4
.[a1:iv500].Clear
For Fila = 1 To 500
For nc = 1 To 256
' .Range(Letra_Columna_1(nc) & Fila).Value = Letra_Columna_1(nc)
'& Fila
.Range("a" & Fila)(1, nc) = Letra_Columna_1(nc) '& Fila
Next
Next
End With
End Sub

la curiosidad es que he probado a 'cargar' las direcciones de las dos
maneras que veis (una como comentario), y al unico que no le afecta
practicamente nada, vuelve a ser el de Vinchenzo, mientras que en los
otros cambia 'bastante'

para que os hagais una idea los tiempos para 500 filas en cada caso
son (en el orden puesto en el codigo)->

VINCH: 1.->12,02 sg 2.-> 12,02 sg
KL: 1.->16,31 sg 2.-> 14,27 sg
HM_2: 1.-> 19,20 sg 2.-> 15,75 sg
HM_1: 1.-> 19,33 sg 2.-> 15,80 sg

bueno, esto me hace pensar que en general, es posible que sea mas
'eficiente'/¿rapido? el uso de la 2ª forma, aunque supongo que lo que
ralentiza en este caso es el uso doble de los codigos, al no ser estos
'muy' rapidos

bueno, aunque esto no sea una consulta propiamente dicha, cualquier
comentario/aclaracion sera bien recibido

este es el procedimiento que he usado para las pruebas->

Sub Prueba_Ltr_todas()
Dim nc As Integer, Autor As Byte, tiempo
Application.ScreenUpdating = False
For Autor = 1 To 4
tiempo = Timer * 1000
Select Case Autor
Case 1: Probar_Ltr_1
Case 2: Probar_Ltr_2
Case 3: Probar_Ltr_3
Case 4: Probar_Ltr_4
End Select
With Hoja5
With .[a1].End(xlDown).Offset(1, 0)
.Value = Autor
.Offset(0, 1) = Experto
.Offset(0, 2) = Timer * 1000 - tiempo
.Offset(0, 5) = (Timer * 1000 - tiempo) / 1000
If Worksheets("Hoja" & Autor).[a1] = "" Then _
.Offset(0, 3) = "Vacio" Else .Offset(0, 3) = "Borrando"
.Offset(0, 4) = Fila - 1
.Offset(0, 6) = ActiveSheet.Name
.Offset(0, 7) = "Metodo_4"
End With
End With
Next
End Sub

y si habeis podido aguantar hasta aqui, un saludo y hasta pronto
Ivan

PD. no podia faltar la duda -> es para Vinchenzo (o al menos sobre su
codigo), no acabo de entender el funcionamiento de esta parte de tu
funcion -> CInt(nroCol Mod 26 = 0) -> supongo que tendra algo que ver
con el 'valor booleano' aunque igualmente puedo estar diciendo una
burrada. Si puedes aclararmelo te lo agradecere nuevamente, aunque le
voy a dedicar un poquito mas de esfuerzo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida