|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Ivanart
Páginas: [1]
1
« en: Viernes 21 de Septiembre de 2007, 22:32 »
Hola Ivan,
Pues hasta donde he podido averiguar, con la expresion que comentaba:
Range("a2:a7").Value = matriz
Se asignan los valores del rango seleccionado a una matriz bidimensional que corresponde a las filas y las columnas de cada elemento y me parece que si declaras la matriz AS VARIANT no necesitas usar REDIM o REDIM PRESERVE antes de utilizarla.
Tengo un par de manuales en que desarrolla un poco el tema, si quieres que te lo envie, me dices y hacemos un apaño. hola Mikell lo 1º muchas gracias, y te comento un poco algunas de las conclusiones/especulaciones a las que voy llegando con mis pruebas: la verdad es que esta forma: Range("a2:a7").Value = matriz
aunque la suelo utilizar con la funcion Array ( te la expongo por si no conoces el uso, por que realmente es muy util en ocasiones, pej: para poner los titulos de columna en una nueva hoja,...) Range("a1:g1") = Array("Titulo_1", "Titulo_2", "Titulo_3", "Titulo_4", _ "Titulo_5", "Titulo_6", "Titulo_7")
el tema es que realmente me da la impresion de que siempre asigna la 1ª dimension a la fila y la 2ª a la columna, aunque intenes asignarsela al reves pej si pruebas este mismo ej. con el rango ("a1:a7"), te rellena las celdas, paro todas con el 1er elemento de la matriz (Titulo_1 en este caso)) Range("a1:a7") = Array("Titulo_1", "Titulo_2", "Titulo_3", "Titulo_4", _ "Titulo_5", "Titulo_6", "Titulo_7")
sin embargo con las bidimensionales si te rellena filas y columnas, pero igualmente, si pej. tienes esta matriz de 2 dimensiones => dim Matriz(2,4) esto te devolveria un resultado correcto (para un rango con 2 filas y 4 columnas=> Range("a1:d2")=Matriz
pero si lo intentas a la inversa, es decir con 4 filas y 2 columnas, aunque el nº de elmentos sea = al de celdas, solo te rellenara las celdas de las 2 primeras filas, pej. asi Range("a1:b4")=Matriz
en fin, como ves, creo que a la hora de introducir datos en una hoja, excel no sabria que hacer con la 3ª dimension (otra cosa quizas sea con las tablas dinamicas, cubos, y ...) ya te digo que es mas una apreciacion que conocimiento, y en cuanto a esto=> Tengo un par de manuales en que desarrolla un poco el tema, si quieres que te lo envie, me dices y hacemos un apaño. si tratan sobre el tema de las matrices estare encantado si me los puedes enviar esteEsMiEmilio=> lombocQuitaArrobaEstotelelinePuntoEs yo tambien creo que engo por ahi algun que otro manual de vba, y en su defecto, supongo que tendre los vinculos a su origen un saludo ivan
2
« en: Jueves 20 de Septiembre de 2007, 23:03 »
hola de nuevo, Mikel no me hagas mucho caso, pues la verdad es que las matrices no son mi fuerte, pero tu consulta me ha picado el gusanillo a mi, desde mi ignorancia me da la impresion de que lo que buscas , sin bucles no es posible, sobre todo porque al menos yo no conozco una forma de hacer referencia a una sola de las dimensiones sin 'involucrar' al menos un elemento de las otras la verdad es que si existe tal forma (¿una especie de indice?) estaria encantado si me la comentas/ais, pues ya te digo que no controlo apenas sobre matrices aparte, y solo por un poco de logica, el excel llamemosle visual, me da la impresion de que funciona en dos dimensiones (filas,columnas) que son las que puede llegar a equipar a los datos de una matriz, supongo que con la 3ª, como tal dimension, no sabe que hacer a lo que parece que si se puede llegar es a cargar matrices bidimensionales en un rango equivalente de celdas (aunque no es tu duda y quizas ya lo sepas [yo acabo de descubrirlo probando para tu consulta , pues hasta ahora solo habia aplicado la forma que comentas con unidimensionales y sobre todo mediante la funcion array]) este es el codigo para esa prueba: Sub TestArray_2() Dim n As Integer, f As Integer, MiMatriz(1 To 10, 1 To 10) As Integer Columns.Clear For n = 1 To 10 For f = 1 To 10 MiMatriz(n, f) = n * f Next Next Range("a1:j10").Value = MiMatriz End Sub
aun asi me da la impresion que cargar una sola de las 2 dimensiones sin bucles tampoco debe ser posible bueno, no se si te servira de algo, pues es sobre todo una opinion/percepcion, que lo mismo es totalmente erronea. si por lo que fuera descubres algo al respecto, yo por mi parte estaria encantado si lo pusieras por aqui mismo un saludo Ivan
3
« en: Lunes 17 de Septiembre de 2007, 22:01 »
hola tambien por aqui, Mikel (aunque realmente da igual, puedes llamarme Ivan a secas, lo de ivanart es imperativo de nobre cogido en el foro) lo 1º, y espero que no te moleste, creo que suele ser mas conveniente continuar la consulta en el mismo hilo que abrir uno nuevo sobre el mismo tema. Aparte de ser mas facil seguir el desarrollo de la consulta, si alguien desea buscar una duda similar en un futuro, siempre sera mas facil si encuentra hilos en los que se [intente al menos] llegue a una solucion que tener que saltar de uno a otro porque esten inconclusos. bueno, esto aparte, y unificando un poco tus mensajes lo que parece que quieres es seleccionar un rango variable lo 1º reiterarte lo que te comentaba en otro hilo: no suele ser necesario ni, en muchas ocasiones conveniente, seleccionar rangos para realizar acciones con o sobre ellos. para que te hagas una idea todas estas acciones se pueden realizar sin seleccionar ninguna celda, hoja ni nada: - copiar rangos, celdas y/o hojas - arrastrar el contenido de celdas (autorrellenar) - filtrar rangos - dar/cambiar formatos -ordenar rangos -insertar filas, columnas y/o hojas. Eliminarlas, ocultarlas/mostrarlas -crear tablas dinamicas -insertar formulas, cambiar contenidos, modificarlas/los, borrarlas/los -poner formatos condicionales -realizar operaciones con el contenido -etc, etc, etc ........... la verdad es que creo que ahora mismo no se me ocurre nada para lo que sea necesario activar/seleccionar hojas, rangos, etc, si no es para aprovechar determinados eventos de hoja, o similar volviendo a tu consulta [seleccionar rangos], aparte de lo obvio (range("a1:a25").select),en el ej. que expones te valdria simplemente => Cells(fila,columna).Select
esta otra forma que comentas=> Range(Cells(fila, columna), Cells(fila, columna)).Select
tendria sentido (y aunque sea larga eso no quiere decir que fuese lenta) si te refieres a un rango de mas de una celda, en el que por supuesto deberias, o bien conocer alguna de las filas/columnas del rango o bien pasarle variable s diferentes a cada una que asi lo sea Pej. si tenemos estas variables: fila, columna1 y columna2, a las que les asignamos los siguientes valores: fila = 1 columna1 = 5 columna2 = 8 la siguiente expresion: Range(Cells(fila, columna1), Cells(fila, columna2)).Select
nos seleccinonaria el rango (de la hoja activa =>OJO) "E1:H1" si cambiamos los valores a: fila = 5 columna1 = 2 columna2 = 3 la seleccion pasaria a ser : "B5:C5" tambien podria ser que conozcas alguno de los valores y lo pases literalmente => Range(Cells(1, columna1), Cells(fila, columna2)).Select
para los valores del ultimo ej. la seleccion pasaria a ser "B1:C5" bueno, no se si te aclara algo, pero como te comento en la otra respuesta, si aportas algun dato mas(rangos concretos, que es lo que quieres hacer, codigo utilizado, y lo que se te ocurra pueda ayudar) la ayuda podra ser mas concreta un saludo Ivan
4
« en: Lunes 17 de Septiembre de 2007, 17:42 »
hola Mikel, no acabo de entender lo que quieres hacer [quizas convendria que expusieras el codigo (o al menos parte) que estes usando y que es lo que realmente quieres hacer. de todas formas te comento algunas cosas por si te ayudan: 1º) que quieres hacer exactamente con esto: Range("fila,columna").Select Range(fila,columna).Select Range(Cells (fila,columna)).Select de donde se deberian tomar los valores de fila y columna?? aparte de este dato, .->en el 1er uso que Haces (Range("fila,columna").Select) en realidad le estarias pasando un nombre de rango (al ir entre comillas, y aunque no estoy seguro, posiblemente no admitido por el uso de una coma en el) el uso de fila,columna tendria sentido tal y como lo planteas en el 2º y 3er uso, es decir como variables, pero para que excel no te genere un error , previamente deberas haberle asignado un valor a esas variables [ que ademas este dentro de los limites admitidos por excel <pej. minimo 1 y, hasta el 2003, 256 para columnas y 65536 para filas>] si quieres haz esta [muy sencilla] prueba: en un libro nuevo, abre el editor de vba (Alt+F11), ve al menu insertar => Modulo (a secas) => en la ventana que se te abre copia/pega el codigo que te pongo a continuacion => vuelve a excel (Alt+F11 o cerrando el editor, pej.) => desde el cuadro de dilogo 'Macros' (Alt+F8 o menu herramientas -> macros -> ver macros) selecciona el nombre de la macro(PruebasFilaColumna) y ejecuta, observa el resultado y contrastalo con el codigo. Con las dudas comentas. Sub PruebasFilaColumna() Dim Fila As Long, Columna As Byte With Worksheets("Hoja1") .Activate .Range("a:l").Clear For Fila = 1 To 10 For Columna = 1 To 10 .Cells(Fila, Columna) = .Cells(Fila, Columna).Address(0, 0) Next Next .Range("a" & Fila).Interior.Color = vbRed .Cells(1, Columna).Interior.Color = vbYellow .Cells(Fila, Columna).Interior.Color = vbGreen .Range(.Cells(Fila + 2, 1), .Cells(Fila + 2, Columna)).Interior.Color = vbBlue With .Cells(Fila - 1, Columna - 1) With .Font .Color = vbRed .Bold = True .Size = 14 End With .Select End With End With With ActiveCell MsgBox "La celda seleccionada actualmente es " & .Address(0, 0) & "," & vbCr & _ "su nº de fila es " & .Row & " y el de la columna es el " & .Column & "." End With End Sub
nota: las variables fila y columna se podrian llamar [casi] de cualquier otra forma (pej: f y c, o Coche y Casa, por poner un ej. tonto) si te animas a exponer lo que realmente estas haciend o quieres hacer, asi como el codigo que +/- estas usando, sera mas facil darte una respuesta concreta un saludo Ivan NOTA:el 'activar' la hoja no es porque sea necesario para la mayor parte de la macro, tan solo para seleccionar la celda es necesario activar la correspondiente hoja previamente (por si acaso no fuese ya la activa), tambien para que puedas visualizar el resultado, si por lo que fuera cuando llamaras a la macro estubieras en otra hoja
5
« en: Viernes 14 de Septiembre de 2007, 03:26 »
hola Mikel,
no se por que te dara el error (quizas cuando intentas seleccionar la celda con nombre no sea su hoja la activa, o ¿donde tienes el codigo?)
si quieres prueba esto, que a mi me funciona sin problemas (pegalo en un modulo 'normal' (en el editor de vba => menu insertar => elige 'Modulo' a secas => en el modulo que se te abre pega el codigo que te pongo => cierra el editor o vuelve a excel con Alt+F11 => llama a la macro desde el cuadro macros (atajo: Alt+F8) y fijate en su funcinamiento. No parece dar problemas
' pega desde aqui ************** Sub nombre() ActiveCell.Name = "nombre" Range("nombre").Offset(1).Select MsgBox Range("nombre").Address Range("nombre").Select End Sub ' hasta aqui ********************
espero te ayude
un saludo Ivan
6
« en: Viernes 14 de Septiembre de 2007, 03:11 »
hola Mikel, un par de posibilidades: a) por un lado puedes incluir, al principio de la macro esta instruccion=> Application.ScreenUpdating = False para detener la actualizacion de pantalla. Esto seguramente evitara el bile 'visual', pero... para evitar el 'baile real' (aunque no lo veas gracias a application.screenupdating el baile sigue ahi), decirte que en el ¿¿99%?? de los casos no es necesario andar seleccionando ni activando celdas,rangos, hojas, libros ni objetos en general para trabajar con ellos. basta hacer referencia a ellos. pej. para poner en negrita la fuente de la celda A1 de la hoja1, la tendencia seleccionando y/o activando seria algo asi: with worksheets("Hoja1") .Activate .Range("a1").Select .Selection.Font.Bold = True end with pero [en mi opinion] esto otro hace lo mismo de una manera mucho mas rapida (aqui no se notaria apenas, pero si fueran muchas celdas....), clara y eficaz: worksheets("Hoja1").Range("a1").Font.Bold = True como te digo es aplicable en casi todas las situaciones y al no seleccionar/activar nada, adems corres menos riesgos de recalculos innecesarios, pej. espero te ayude, y si quieres comentas un saludo Ivan
7
« en: Jueves 6 de Septiembre de 2007, 21:14 »
Buenas Tardes a todos...
Estoy trabajando con Excel y el editor de Visual basic...
Tengo un combobox con 2 columnas...en la primera columna tengo una descripcion y en la segunda columna tengo el codigo. Quisiera en una celda guardar la primera columna (Descripcion) y en otra celda guardar la segunda columna (Codigo)
He colocado esto pero no me funciona...
Cells(rowcount, 13).Value = Me.cbCiuExp.Column(0) Cells(rowcount, 13).Value = Me.cbCiuExp.Column(0)
... y esto tambien ....
Cells(rowcount, 14).Value = cbCiuExp.List(cbCiuExp.ListIndex, 0)
Espero que me puedan colaborar... hola, se me ocurren al menos 2 dos posibilidades: op1) asignarle una de las columnas [del combo] a la propiedad TextColumn del combo y la otra la prop. BoundColumn y cargar en una de las celdas la prop. text[del combo] y en la otra la prop. value[del combo] pej: en el initialize del form podrias poner algo asi (nota: al estar el codigo en elpropio modulo del form, puedes ahorrarte el me): cbCiuExp.TextColumn = 1 cbCiuExp.BoundColumn = 2
y en donde quiera que estes probando tus codigos algo asi: Cells(rowcount, 13).Value = cbCiuExp.Text Cells(rowcount, 14).Value = cbCiuExp.Value
op2) usando la propiedad list del combo: pej: with cbCiuExp Cells(rowcount, 13).Value = .List(.listindex,0) Cells(rowcount, 14).Value = .List(.listindex,1) end with
hay otras opciones pero de momento...... espero te ayude un saaludo Ivan PD: supongo que rowcount es una variable????
8
« en: Jueves 6 de Septiembre de 2007, 20:57 »
hola, aunque creo que hay otras cuantas cosas revisables en los codigos, cuando pasas los valores a los rangos, prueba a cambiar las expresiones tipo Range("D11").FormulaR1C1 = CDate(TextBox3.Text)
por Range("D11").FormulaR1C1 = clng(CDate(TextBox3.Text) )
o mejor Range("D11") = clng(CDate(TextBox3.Text) )
como te digo, hay otros cuantos factores que podrian estar generando el error (pej. textbox/celdas vacios/as) por otro lado, pej.en el borrado de los textbox, podrias ahorrarte lineas de codigo con algo mas o menos asi: Private Sub CommandButton1_Click() Dim n As Byte ' altai For n = 1 To 16 Controls("TextBox" & n) = "" Next TextBox1.SetFocus End Sub
y para la carga en la hoja me da la impresion de que estas repitiendo acciones innecesarias (sobre todo con los textbox que son el resultado de operar con otros o/y con rangos, salvo que estos a su vez puedan ser editables independientemente.) . En realidad se podria hacer en el mismo bucle que te pongo para borrar los textbox, pero habria que mirarlo un poco mas despacio y seguramente haria falta algun dato mas. de todas formas, siquieres prueba la modificacion de los cdate por clng(cdate a ver si es suficiente (a 1ª vista creo que no, pero ....) e`pero te ayude un saludo Ivan
Páginas: [1]
|
|
|