Concatenar con formato.

05/02/2006 - 05:19 por klomkbock | Informe spam
Hola a todos.
Encantado de estar de nuevo por aqui.

Esta consulta es sobre una macro de Hector Miguel que he retocado para
adaptarla a mis necesidades. Aunque funciona bien para lo que la quiero,
me gustaria ser capaz de hacerla un poco mas versatil. La macro en
cuestion da diferentes colores a determinados caracteres de una misma
celda en funcion del valor que se introduce en otras. Me explico: se trata
de una hoja de inventario inpreso para dar de baja manualmente articulos.
Los campos serian: A=Referencia; B=Color; C=Talla; D=Articulo; E=Stok
(aqui irian las celdas con los formatos conbinados); F=Precio costo;
G=PVP; H=Cantidad de articulos en tienda; I=Cantidad en almacen;
J=Cantidad recibida. Las cantidades introducidas en H, I y J son las que
aparecen repetidas en forma de "I" en la columna E y con el formato que
determinemos para cada una de las cantidades. Ademas llevan un caracter de
separacion cada x caracteres para hacer mas facil contarlas visualmente.
Para este caso el codigo parece funcionar correctamente pero me gustaria
conseguir (lo estoy intentando) que por ej.

1-en vez de repetir en base a tres campos se pudiera elegir entre uno y
cinco o mas campos.

2-Ademas he tenido que usar la funcion REPLACE porque con STRING solo no
he conseguido que me repita " I " (la "I" con un espacio a cada lado),
pues toma el primer caracter (un espacio) y lo repite solamente a el ( sin
embargo la funcion REPETIR de la hoja de calculo si te repite todo el
conjunto). Pienso que si se elimina REPLACE quedaria un codigo mas
sencillo.

3-Tambien que al pedir de que campo se van a extraer las cantidades, este
se pudiera introducir con formato "A2:Ax" y me lo aplicara a la propiedad
offset.

4-Aparte creo que el tratamiento de errores (aunque parece funcionar) no
esta bien puesto.

A continuacion pongo la macro (espero que con el permiso de HM -gracias de
nuevo-) que supongo sera muy mejorable. Cualquier consejo o correccion
sera bien recibida.

Un saludo y gracias de antemano.
Ivan

Sub RepetirConFormato11()

' Macro retocada por Ivan(27-01-06)
' sobre una macro original de Hector Miguel
Application.ScreenUpdating = False
Dim Celda As Range
Dim f As Integer, g As Integer
Dim h As String
Dim i As Integer, j As Integer, k As Integer
Dim li As String, lj As String, lk As String
Dim ih As String, jh As String, kh As String

On Error Resume Next

g = Val(InputBox("Introduce cada cuantos articulos quieres poner un
separador.", "AGRUPAR UNIDADES", 5))
h = Replace(String(g, "I"), "I", " I ")
f = Val(InputBox("¿A cuantas columnas esta el primer campo de
articulos?", "CAMPOS ARTICULOS"))
For Each Celda In Range(InputBox("Introduce el rango para el STOK", _
"RANGO STOK", "E2:"))

i = Celda.Offset(, f).Value
j = Celda.Offset(, f + 1).Value
k = Celda.Offset(, f + 2).Value

li = Replace(String(i, "I"), "I", " I ")
lj = Replace(String(j, "I"), "I", " I ")
lk = Replace(String(k, "I"), "I", " I ")

ih = Replace(li, h, h & ".")
jh = Replace(li & lj, h, h & ".")
kh = Replace(li & lj & lk, h, h & ".")

With Celda

.Value = kh

'Da formato independiente a cada grupo de " I " correspondiente a
cada campo.

With .Characters(1, Len(ih)).Font

.ColorIndex = 3 'Stok tienda = Color rojo
.Bold = True
.Name = "Arial"
.Size = 16

End With
With .Characters(Len(ih) + 1, Len(jh) - Len(ih)).Font

.ColorIndex = 44 'Stok almacen = Color oro
.Bold = True
.Name = "Arial"
.Size = 16

End With
With .Characters(Len(jh) + 1, Len(kh) - Len(jh)).Font

.ColorIndex = 44 'Stok recibido = Color oro
.Bold = True
.Name = "Arial"
.Size = 16

End With
End With
Next Celda
On Error GoTo 0
Application.ScreenUpdating = True
End Sub

Preguntas similare

Leer las respuestas

#6 klomkbock
09/02/2006 - 02:51 | Informe spam
hola, Hector Miguel

muchas gracias de nuevo. El codigo es alucinante, al menos para mi nivel,
es casi un curso de VBA en si mismo y me va a venir muy bien estudiarlo.

Lo he probado muy por encima y funciona bien cuando todas -o al menos
determinadas- las celdas del rango G1:Ln tienen un valor superior a 0,
pero -quizas lo he copiado mal- cuando existen determinados campos
-todavia no se muy bien cuales- con valor 0 los colores se trastocan. Y
cuando hay una serie completa = 0 -ej.G5,H5,I5,J5,K5,L5- parece crearse lo
que debe ser un bucle infinito, creo que en el bucle Do Loop. De todas
formas no me ha dado casi tiempo a probarlo.

Tambien puede ser que no he dicho en ningun momento que las celdas de
G1:Ln pueden estar vacias o ser =0 (parte de ellas), pero seria bastante
importante que pudiera ser asi.

En cualquier caso parece estar totalmente encaminado y me voy ha poner ha
estudiarlo a fondo.

Muchas gracias y hasta pronto.
Ivan

Héctor Miguel wrote:

hola, Ivan !

estos son los 'supuestos' que me he 'inventado' :)) [modifica donde sea


necesario]...

1) el rango donde se 'grafican' los stocks 'solicitados' es en la columna


'E' [E2:En] -> que pudiera estar 'vacio' -?-
2) los 'encabezados' para los SEIS stocks 'disponibles' serian en la fila 1


de las columnas 'G:L' [es decir]...
[G1]-> vendidos -azul-, [H1]-> tienda -rojo-, [I1]-> almacen -oro-,


[J1]-> recibidos -oro-, [K1]-> tara -gris-, [L1]-> pedido -lila-
3) como 'estimo' que el rango 'E2:En' pudiera estar vacio... supongo que la


columna 'G' si tiene la ultima fila CON DATOS -?-
4) los rangos anteriores -> y sus numeros de columnas -> SON IMPORTANTES


'consideraciones' en el codigo
-> estoy suponendo una 'distancia' [o el 'Offset'] de 5,6,7 y 8 columnas


de diferencia 'versus' la columna 5 -> E2:En <= OJO
5) 'la pregunta' la he cambiado por un 'inputBox' del objeto Application que


'solicita' que el usuario -> seleccione un rango ;)
espero que sea suficientemente 'entendible' [sobre todo: el proposito de


la instruccion 'ScrollArea'] <= OJO

espero tus comentarios por lo que pudiera 'dolerle' al codigo [o a mis


suposiciones] :DD
saludos,
hector.
Respuesta Responder a este mensaje
#7 klomkbock
09/02/2006 - 03:43 | Informe spam
Hola otra vez, Hector Miguel

Disculpa mi pesadez, pero se me han pasado un par de consultas que me
gustaria hacerte:

1 ¿cual es el motivo de usar "Byte" como tipo?
2 se me ha ido de la cabeza, lo siento, pero a cambio: como podria hacer
que las celdas del rango "E2:En" se fueran autoajustando e incluyendo
saltos de linea si las " I " superan el ancho de celda. AUNQUE supongo que
sera cuestion de empoyarse las propiedades de Range o similar.

En cualquier caso, lo dicho, con lo que ya me has proporcionado tengo
campo de estudio para rato.

Un saludo y hasta pronto.
Ivan

Ivan wrote:

hola, Hector Miguel

muchas gracias de nuevo. El codigo es alucinante, al menos para mi nivel,
es casi un curso de VBA en si mismo y me va a venir muy bien estudiarlo.

Lo he probado muy por encima y funciona bien cuando todas -o al menos
determinadas- las celdas del rango G1:Ln tienen un valor superior a 0,
pero -quizas lo he copiado mal- cuando existen determinados campos
-todavia no se muy bien cuales- con valor 0 los colores se trastocan. Y
cuando hay una serie completa = 0 -ej.G5,H5,I5,J5,K5,L5- parece crearse lo
que debe ser un bucle infinito, creo que en el bucle Do Loop. De todas
formas no me ha dado casi tiempo a probarlo.

Tambien puede ser que no he dicho en ningun momento que las celdas de
G1:Ln pueden estar vacias o ser =0 (parte de ellas), pero seria bastante
importante que pudiera ser asi.

En cualquier caso parece estar totalmente encaminado y me voy ha poner ha
estudiarlo a fondo.

Muchas gracias y hasta pronto.
Ivan


Respuesta Responder a este mensaje
#8 Héctor Miguel
09/02/2006 - 07:47 | Informe spam
hola, Ivan !

... se me han pasado un par de consultas...
1 cual es el motivo de usar "Byte" como tipo?
2 se me ha ido de la cabeza, lo siento, pero a cambio:
como podria hacer que las celdas del rango "E2:En" se fueran autoajustando e incluyendo saltos de linea si las " I "
superan el ancho de celda. AUNQUE supongo que sera cuestion de empoyarse las propiedades de Range o similar...



a) en relacion con 'el detalle' [que no se me habia 'ocurrido'] de 'stocks' en ceros -> en toda una linea...
[efectivamente] el codigo 'entra' en un bucle-sin-fin :-( [te paso la adaptacion al final del presente] ;)
b) por lo tocante a los colores [segun mis pruebas]... no se 'confunde' el codigo al aplicar los colores :))
[quizas si comentas algun detalle mas especifico] -?-
c) usar un tipo de datos 'byte' en algunas variables es -solo- para 'ahorrar' recursos de codigo [como la memoria ocupada segun 'tipos'] ;)
[cuando se puede y no se requiere 'almacenar/contar/...' valores superiores a 255] ;)
d) [segun yo] la columna 'E' donde se ponen las " l " SI se 'auto-ajusta' [al final de la macro] -?-
lo que no contempla el codigo es insertar 'saltos de linea' :-(
-> si comentas que largo de caracteres necesitas dejar al final del pase de los stocks :D
y si tiene alguna 'importancia' donde caiga un posible salto de linea ??? [en las " l "... en el punto... ???]

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
al codigo solo le he 'condicionado' el do...loop a que cada celda 'tenga' algo que colorear :DD ==
Sub Formato_Stock()
Dim Stocks As Range, Fijo As String: Fijo = "$G$1:$L$1"
ActiveSheet.ScrollArea = Fijo: On Error Resume Next
Set Stocks = Application.InputBox( _
Prompt:="Selecciona las columnas para registrar sus 'Stocks'", _
Title:="Stocks a ""inventariar""", _
Default:=Fijo, Type:=8): ActiveSheet.ScrollArea = ""
If Stocks Is Nothing Then MsgBox "Operacion cancelada !!!": Exit Sub
Dim Grupo As Byte, Texto As String
Grupo = Val(InputBox("Indica cada cuantos articulos necesitas un separador.", "Agrupar Unidades", 5))
If Grupo > 0 Then Texto = Application.Rept(" I ", Grupo)
Application.ScreenUpdating = False
Dim Color, Stock As String, Stock_Col As Byte, Celda As Range, Stock_Ver As String, _
Pos As Byte, Inicio As Byte, Fin As Byte, Cuenta As Byte
Color = Array(5, 3, 44, 44, 15, 7)
Stock = Range(Range("e2"), Range("g65536").End(xlUp).Offset(, -2)).Address
With Range(Stock).Font: .Bold = True: .Name = "Arial": .Size = 16: End With
For Each Celda In Range(Stock): Stock_Ver = ""
For Stock_Col = Stocks.Column - 5 To Stocks.Columns.Count + Stocks.Column - 6
Stock_Ver = Stock_Ver & Application.Rept(" I ", Celda.Offset(, Stock_Col))
Next: Celda = Application.Substitute(Stock_Ver, Texto, Texto & ".")
For Stock_Col = Stocks.Column - 7 To Stocks.Columns.Count + Stocks.Column - 8
Inicio = 1: Pos = 1
If Len(Celda) Then
Do
If Celda.Offset(, Stock_Col + 2) = 0 Then Stock_Col = Stock_Col + 1
If Mid(Celda, Pos, 1) = "I" Then Cuenta = Cuenta + 1
If Cuenta = Celda.Offset(, Stock_Col + 2) Then
Fin = Pos - Inicio + 1
Celda.Characters(Inicio, Fin).Font.ColorIndex = Color(Stock_Col)
Inicio = Inicio + Fin + 1: Cuenta = 0: Stock_Col = Stock_Col + 1
End If
Pos = Pos + 1
Loop Until Pos = Len(Celda)
End If
Next
Next
Set Stocks = Nothing: Range(Stock).EntireColumn.AutoFit
End Sub
Respuesta Responder a este mensaje
#9 klomkbock
10/02/2006 - 05:08 | Informe spam
Hola, Hector Miguel

De nuevo gracias por tu atención.
La corrección funciona perfectamente, pero a mi me sigue trastocando los
colores en algunas ocasiones. Creo que ocurre cuando hay más de un cero
seguido en G:L – excepto cuando son todos, que ya se ha resuelto con la
corrección-. He probado muchas combinaciones y funciona bien excepto
cuando en la misma fila hay dos ceros seguidos. He pensado que quizás esto
divida el rango en mas de un área (¿estoy diciendo una burrada?) y he
intentado hacer un bucle por las –supuestas- áreas, pero ni siquiera he
conseguido descifrar el código totalmente con lo cual no he conseguido
nada. Al final del msj. te mando algunos ejemplos totalmente aleatorios
para que veas lo que me ocurre.

Por otro lado, y si estoy abusando no tengas ningún problema en decírmelo,
lo que me interesaría no es que el ancho de celda se ajuste al contenido –
de momento he puesto la ultima instrucción como comentario- sino que para
un ancho de celda preestablecido -puede ser variable según plantilla- ya
en la hoja cuando no quepan mas “ I “ se produzca un salto de línea y se
ajuste el alto. No me importa como quede el separador –si el separador = 5
en la línea sup. pueden quedar 3(p.ej.) después de un separador y la
siguiente empezar por 2 y a continuación el separador--, aunque para
complicarlo un poco mas seria ideal si la primera “ I “ empezara con el
mismo margen derecho.

En cuanto a la duda que se me quedo el otro día en el tintero, era
preguntarte si el declarar las variables a lo largo del código en vez de
al principio es por un motivo especial. ¿Agiliza el código o simplemente
lo hace mas claro?¿O es que hay que hacerlo así?

Bueno, creo que ya si que me he pasado. Lo dicho: si estoy abusando, yo
soy el primero en darme cuenta, así que no tengas ningún problema en
decírmelo.

En cualquier caso muchas gracias.

Un saludo y hasta pronto
Ivan

Comportamiento en varios ej
Si las iniciales de los colores están en minúsculas es que esta bien, si
una mayús. y otra minús. el color no esta en su sitio (se ha saltado
alguno), si las dos mayús.. no debería ni estar. La verdad es que tiene un
comportamiento curioso.

fila ven tie alm rec tar ped stock

ej. bien:

1 1 1 1 1 1 1 az-rj-or-or-gr-li
2 1 1 1 1 1 1 az-rj-or-or-gr-li
3 1 1 1 1 1 1 az-rj-or-or-gr-li
4 1 1 1 1 1 1 az-rj-or-or-gr-li

1 1 1 1 1 1 1 az-rj-or-or-gr-li
2 1 1 1 1 1 1 az-rj-or-or-gr-li
3 1 0 1 0 1 0 az-or-gr
4 1 1 1 1 1 1 az-rj-or-or-gr-li

1 2 1 2 1 2 1 az*2-rj-or*2-or-gr*2-li
2 3 1 1 1 1 1 az*3-rj-or-or-gr-li
3 1 0 1 0 1 3 az-or-gr-li*3
4 1 2 1 1 1 2 az-rj*2-or-or-gr-li*2

1 2 1 2 1 2 1 az*2-rj-or*2-or-gr*2-li
2 3 1 1 1 1 1 az*3-rj-or-or-gr-li
3 1 0 1 0 1 3 az-or-gr-li*3
4 0 2 1 1 1 2 rj*2-or-or-gr-li*2

1 0 1 2 1 2 1 rj-or*2-or-gr*2-li
2 0 1 1 1 1 1 rj-or-or-gr-li
3 0 1 1 0 1 3 rj-or-gr-li*3
4 0 1 1 1 1 2 rj-or-or-gr-li*2

ej. mal:

1 2 1 2 1 2 1 az*2-rj-or*2-or-gr*2-li
2 3 1 1 1 1 1 az*3-rj-or-or-gr-li
3 1 0 1 0 1 3 az-or-gr-li*3
4 0 0 1 1 1 2 RJ-or-Gr-Li*2

1 0 0 1 1 1 1 RJ-or-gr-li
2 1 0 0 0 0 0 az
3 0 0 1 1 1 1 RJ-RJ-RJ-RJ
4 0 0 1 0 1 1 RJ-RJ-RJ

1 1 0 1 1 1 1 az-or-or-gr-li
2 1 0 0 0 0 0 az
3 1 0 1 1 1 1 az-Or-Gr-Li-AZ
4 1 0 1 0 0 0 az-GR

1 1 1 1 1 1 1 az-rj-or-or-gr-li
2 1 1 0 0 0 0 az-rj
3 1 1 1 1 1 1 az-AZ-AZ-AZ-AZ-AZ
4 1 1 1 0 0 0 az-AZ-AZ

Héctor Miguel wrote:

hola, Ivan !

2 se me ha ido de la cabeza, lo siento,





a) en relacion con 'el detalle' [que no se me habia 'ocurrido'] de 'stocks'


en ceros -> en toda una linea...
[efectivamente] el codigo 'entra' en un bucle-sin-fin :-( [te paso la


adaptacion al final del presente] ;)
b) por lo tocante a los colores [segun mis pruebas]... no se 'confunde' el


codigo al aplicar los colores :))
[quizas si comentas algun detalle mas especifico] -?-
c) usar un tipo de datos 'byte' en algunas variables es -solo- para


'ahorrar' recursos de codigo [como la memoria ocupada segun 'tipos'] ;)
[cuando se puede y no se requiere 'almacenar/contar/...' valores


superiores a 255] ;)
d) [segun yo] la columna 'E' donde se ponen las " l " SI se 'auto-ajusta'


[al final de la macro] -?-
lo que no contempla el codigo es insertar 'saltos de linea' :-(
-> si comentas que largo de caracteres necesitas dejar al final del pase


de los stocks :D
y si tiene alguna 'importancia' donde caiga un posible salto de


linea ??? [en las " l "... en el punto... ???]

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Respuesta Responder a este mensaje
#10 Héctor Miguel
10/02/2006 - 07:36 | Informe spam
hola, Ivan !

... funciona... pero a mi me sigue trastocando los colores en algunas ocasiones.
... cuando hay más de un cero seguido en G:L – excepto cuando son todos, que ya se ha resuelto con la correccion-.
He probado muchas combinaciones y funciona bien excepto cuando en la misma fila hay dos ceros seguidos...



=> tienes razon :)) despues de 'ver' los ejemplos que expones... -tambien- 'he visto' los colores 'trastocados' :D
corrige/cambia en el codigo... -> la primera instruccion posterior a la linea con el 'Do'
de -> If Celda.Offset(, Stock_Col + 2) = 0 Then Stock_Col = Stock_Col + 1
a:...
Do While Celda.Offset(, Stock_Col + 2) = 0 _
And Stock_Col < Stocks.Columns.Count + Stocks.Column - 8: _
Stock_Col = Stock_Col + 1: Loop

Por otro lado... lo que me interesaria no es que el ancho de celda se ajuste al contenido
- de momento he puesto la ultima instruccion como comentario-
sino que para un ancho de celda preestablecido -puede ser variable segun plantilla-
ya en la hoja cuando no quepan mas “ I “ se produzca un salto de linea y se ajuste el alto.
No me importa como quede el separador
-si el separador = 5 en la linea sup. pueden quedar 3 (p.ej.) después de un separador
y la siguiente empezar por 2 y a continuación el separador-
aunque para complicarlo un poco mas seria ideal si la primera “ I “ empezara con el mismo margen derecho.



=> cambia en la linea que has marcado como comentario la instruccion para ajustar el ancho de la columna...
de -> Range(Stock).EntireColumn.AutoFit
a -> Range(Stock).WrapText = True
=> lo que va a estar un poquitin 'dificil'... sera 'forzar' a que la segunda linea -tambien- inicie con dos espacios :-(
el ancho de la columna esta basada inicialmente en el tipo de fuente 'normal' de la plantilla en uso ;)

... la duda que se me quedo el otro dia en el tintero, era... si el declarar las variables a lo largo del codigo
en vez de al principio es por un motivo especial.
Agiliza el código o simplemente lo hace mas claro? O es que hay que hacerlo asi?



=> [en realidad] se debio a que en las pruebas las 'variables' se me fueron 'ocurriendo sobre la marcha' :DD
[aunque] tampoco 'le estorba' que te 'ahorres algo de memoria'... si algunas variables no llegan a ser 'necesarias' :))

si cualquier duda... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida