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
#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
#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 ___
Mostrar la cita
#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
#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 ___
Mostrar la cita
Ads by Google
Search Busqueda sugerida