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

#1 klomkbock
05/02/2006 - 05:43 | Informe spam
Hola de nuevo.

Aqui pongo la macro original de Hector Miguel, sobre todo para aclarar que
cualquier posible error o burrada de la otra es culpa exclusivamente mia.

Tambien reiterar mis garcias a Hector Miguel (y a todos los que ayudais al
resto) y pedirte disculpas por usar tu nombre quizas en exceso.

Un saludo
Ivan

Sub ConcatenarVariasCeldasConFormato()
Application.ScreenUpdating = False
Dim Celda As Range
For Each Celda In Range("d1:d10")
With Celda
.Value = .Offset(, -3) & " " & .Offset(, -2) & " " & .Offset(, -1)
With .Characters(1, Len(.Offset(, -3))).Font
.ColorIndex = Celda.Offset(, -3).Font.ColorIndex
.Bold = Celda.Offset(, -3).Font.Bold
.Italic = Celda.Offset(, -3).Font.Italic
.Name = Celda.Offset(, -3).Font.Name
.Size = Celda.Offset(, -3).Font.Size
.Underline = Celda.Offset(, -3).Font.Underline
End With
With .Characters(Len(.Offset(, -3)) + 2, Len(.Offset(, -2))).Font
.ColorIndex = Celda.Offset(, -2).Font.ColorIndex
.Bold = Celda.Offset(, -2).Font.Bold
.Italic = Celda.Offset(, -2).Font.Italic
.Name = Celda.Offset(, -2).Font.Name
.Size = Celda.Offset(, -2).Font.Size
.Underline = Celda.Offset(, -2).Font.Underline
End With
With .Characters(Len(.Offset(, -3) & .Offset(, -2)) + 3,
Len(.Offset(,
-1))).Font
.ColorIndex = Celda.Offset(, -1).Font.ColorIndex
.Bold = Celda.Offset(, -1).Font.Bold
.Italic = Celda.Offset(, -1).Font.Italic
.Name = Celda.Offset(, -1).Font.Name
.Size = Celda.Offset(, -1).Font.Size
.Underline = Celda.Offset(, -1).Font.Underline
End With
End With
Next
End Sub
Respuesta Responder a este mensaje
#2 klomkbock
05/02/2006 - 05:43 | Informe spam
Hola de nuevo.

Aqui pongo la macro original de Hector Miguel, sobre todo para aclarar que
cualquier posible error o burrada de la otra es culpa exclusivamente mia.

Tambien reiterar mis garcias a Hector Miguel (y a todos los que ayudais al
resto) y pedirte disculpas por usar tu nombre quizas en exceso.

Un saludo
Ivan

Sub ConcatenarVariasCeldasConFormato()
Application.ScreenUpdating = False
Dim Celda As Range
For Each Celda In Range("d1:d10")
With Celda
.Value = .Offset(, -3) & " " & .Offset(, -2) & " " & .Offset(, -1)
With .Characters(1, Len(.Offset(, -3))).Font
.ColorIndex = Celda.Offset(, -3).Font.ColorIndex
.Bold = Celda.Offset(, -3).Font.Bold
.Italic = Celda.Offset(, -3).Font.Italic
.Name = Celda.Offset(, -3).Font.Name
.Size = Celda.Offset(, -3).Font.Size
.Underline = Celda.Offset(, -3).Font.Underline
End With
With .Characters(Len(.Offset(, -3)) + 2, Len(.Offset(, -2))).Font
.ColorIndex = Celda.Offset(, -2).Font.ColorIndex
.Bold = Celda.Offset(, -2).Font.Bold
.Italic = Celda.Offset(, -2).Font.Italic
.Name = Celda.Offset(, -2).Font.Name
.Size = Celda.Offset(, -2).Font.Size
.Underline = Celda.Offset(, -2).Font.Underline
End With
With .Characters(Len(.Offset(, -3) & .Offset(, -2)) + 3,
Len(.Offset(,
-1))).Font
.ColorIndex = Celda.Offset(, -1).Font.ColorIndex
.Bold = Celda.Offset(, -1).Font.Bold
.Italic = Celda.Offset(, -1).Font.Italic
.Name = Celda.Offset(, -1).Font.Name
.Size = Celda.Offset(, -1).Font.Size
.Underline = Celda.Offset(, -1).Font.Underline
End With
End With
Next
End Sub
Respuesta Responder a este mensaje
#3 Héctor Miguel
06/02/2006 - 05:23 | Informe spam
hola, Ivan !

1) para poder 'elegir' entre 1, 5 o mas 'campos' [creo que] harian falta mas detalles [como]...
campos 'saltados' ?... algun color 'especifico' SEGUN cada 'campo' ?... [etc. etc. etc.] ;)

2) puedes usar la funcion repetir(...) [de hoja de calculo] en vba con un: -> Application.WorksheetFunction.Rept(...)

3) podrias seguir utilizando un impubox [de vba] para solicitar 'el rango' -> adaptandolo para proveer SOLO la 'ultima fila' ;)

4) con respecto del 'tratamiento' de -posibles- errores [tambien] serviria si comentas a que tipo de errores 'esperas' enfrentarte -?-
[p.e.] si el usuario 'cancela' algun inputbox ?... o si no existe algun dato/valor en alguna celda de 'stock' ?... o ???

5) [por lo pronto] la siguiente propuesta de modificacion al codigo expuesto [supongo que] lo hara mas 'agil' :D
se 'agrupan' las acciones de la macro a SOLO 'donde sean necesarias' [y sin redundancias/repeticiones/...] :))

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

el codigo adaptado ==Sub RepetirConFormato_2()
Application.ScreenUpdating = False
Dim Celda As Range, f As Byte, g As Byte, h As String, Stock As String
Dim li As String, lj As String, lk As String, ih As String, jh As String
On Error Resume Next
f = Val(InputBox("A cuantas columnas esta el primer campo?", "ARTICULOS", 3))
g = Val(InputBox("Indica cada cuantos articulos necesitas un separador.", "AGRUPAR UNIDADES", 5))
h = Application.Rept(" I ", g)
Application.SendKeys "{end}"
Stock = InputBox("Introduce la ultima fila para el rango", "RANGO STOCK", "E2:E")
With Range(Stock).Font: .Bold = True: .Name = "Arial": .Size = 16: End With
For Each Celda In Range(Stock)
li = Application.Rept(" I ", Celda.Offset(, f))
lj = Application.Rept(" I ", Celda.Offset(, f + 1))
lk = Application.Rept(" I ", Celda.Offset(, f + 2))
ih = Application.Substitute(li, h, h & ".")
jh = Application.Substitute(li & lj, h, h & ".")
Celda = Application.Substitute(li & lj & lk, h, h & ".")
With Celda
' Da formato independiente a cada grupo de " I " correspondiente a cada campo.
.Characters(1, Len(ih)).Font.ColorIndex = 3 ' Stock tienda = Color rojo
.Characters(Len(ih) + 1, Len(jh) - Len(ih)).Font.ColorIndex = 44 ' Stock almacen = Color oro
.Characters(Len(jh) + 1, Len(kh) - Len(jh)).Font.ColorIndex = 44 ' Stock recibido = Color oro
End With
Next
End Sub

___ consulta original ___
... sobre una macro... que he retocado para adaptarla a mis necesidades.
... funciona bien para lo que la quiero, me gustaria... hacerla un poco mas versatil...
... se tratade una hoja de inventario inpreso para dar de baja manualmente articulos.
... 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.
... 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 [...]
Respuesta Responder a este mensaje
#4 klomkbock
06/02/2006 - 19:18 | Informe spam
hola, Hector Miguel

lo primero muchas gracias.

A continuacion te expongo las aclaraciones que me pides y las dudas que me
surgen. Si puedes ayudarme te lo agradezco. En cualquier caso tu ayuda ya
es impagable.

PD: aunque aquí personalice el agradecimiento, quiero hacerlo extensivo a
todo el FORO y en especial a sus expertos.

1) para poder 'elegir' entre 1, 5 o mas 'campos' [creo que] harian falta
mas
detalles [como]...
campos 'saltados' ?... algun color 'especifico' SEGUN cada 'campo'
?...
[etc. etc. etc.] ;)

1.- los campos irian seguidos pero comenzarian a partir del valor de la
variable “f”. Supongo que seria suficiente con un maximo de seis campos,
que según las circunstancias, serian: Nº articulos vendidos; art. en
tienda; art. en almacen; art. recibidos; articulos con tara; art. en
pedido pendiente.
vendidos = p.ej: azul oscuro tienda = rojo almacen y recibidos oro tara = gris claro
pedido pendiente = lila claro

NOTA: el motivo de los colores es ir tachando los art. de tienda según se
vendan y añadiendo con boli rojo los que se vayan llevando desde el
almacen. Todo ello para no recurrir al ordenador entre recepcion de pedido
y recepcion de pedido. Los otros campos serian informativos y solo de uso
ocasional.

2) puedes usar la funcion repetir(...) [de hoja de calculo] en vba con un:
->
Application.WorksheetFunction.Rept(...)

2.- esta ¿instrucción? ¿es utilizable con cualquier formula de hoja.?
supongo que Application.SendKeys “(end)” finaliza la instrucción

anterior

3) podrias seguir utilizando un impubox [de vba] para solicitar 'el rango'
->
adaptandolo para proveer SOLO la 'ultima fila' ;)

3.- aquí me referia al valor de la variable “f”. De cara a que la
pregunta del InputBox sea mas comprensible, sobre todo para los profanos,
lo ideal seria solicitar el primer campo del que se va a sacar la cantidad
a repetir ( en la macro artic. en tienda ) en formato “XX:XX” en vez de el
nº de columnas a las que se halla el primer campo. El problema es que no
se como traspasar el campo obtenido a la variable “f” para aplicarlo a la
propiedad Offset.

4) con respecto del 'tratamiento' de -posibles- errores [tambien] serviria
si
comentas a que tipo de errores 'esperas' enfrentarte -?-
[p.e.] si el usuario 'cancela' algun inputbox ?... o si no existe
algun dato/valor en alguna celda de 'stock' ?... o ???

4.- realmente me referia a la cancelacion de los InputBox

5) [por lo pronto] la siguiente propuesta de modificacion al codigo
expuesto
[supongo que] lo hara mas 'agil' :D
se 'agrupan' las acciones de la macro a SOLO 'donde sean necesarias'
[y sin
redundancias/repeticiones/...] :))

5.- aparte de lo anterior, esto es a lo que me referia, disponer del
codigo agilizado para poder estudiarlo y comprender los fallos.

Muchas gracias una vez mas.

Un saludo.
Ivan
Respuesta Responder a este mensaje
#5 Héctor Miguel
08/02/2006 - 04:47 | Informe spam
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.
=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
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)
Next
Next
Set Stocks = Nothing: Range(Stock).EntireColumn.AutoFit
End Sub

___ consulta original ___
1.- los campos irian seguidos... seria suficiente con un maximo de seis campos, que segun las circunstancias, serian:
... articulos vendidos; art. en tienda; art. en almacen; art. recibidos; articulos con tara; art. en pedido pendiente.
... vendidos = p.ej: azul oscuro tienda = rojo almacen y recibidos =oro tara = gris claro pedido pendiente = lila claro
3.- ... que la pregunta del InputBox sea mas comprensible sobre todo para los profanos
lo ideal seria solicitar el primer campo del que se va a sacar la cantidad a repetir (en la macro artic. en tienda)
en formato “XX:XX” en vez de el nº de columnas a las que se halla el primer campo...
4.- realmente me referia a la cancelacion de los InputBox
5.- aparte de lo anterior, esto es a lo que me referia, disponer del codigo agilizado para poder estudiarlo y comprender los fallos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida