Copiar Datos

15/05/2007 - 16:33 por al_sa_ca | Informe spam
Buen día a todos, escribo desde Colombia, para pedir de su amable
ayuda. Tengo un pequeño negocio e intento crear un sistemita contable
sencillo, pero he buscado en el foro algo para resolver mi problema y
no he encontrado, espero alguien me pueda ayudar.

Tengo la siguiente lista:

CLAVE CUENTA VALOR COPIADO
5140AB Almacén
5140AB01 A Almacén
5140AB02 B Almacén
5140AB03 C Almacén
5140AB04 D Almacén
5140AC Compras
5140AC01 A Compras
5140AC02 B Compras
5140AC03 C Compras
5140AC04 D Compras
5142ED Ventas
5142ED01 A Ventas
5142ED02 B Ventas
5142ED03 C Ventas
5142ED04 D Ventas
5160EZ Gastos
5160EZ01 A Gastos
5160EZ02 B Gastos
5160EZ03 C Gastos
5160EZ04 D Gastos

Lo que necesitaría es crear un código para que en la coloumna de
clave busque aquellas que sean sólo de 6 dígitos (5140AB, 5140AC,
5142ED, 5160EZ) que a su vez tienen en la siguiente columna una cuenta
(5140AB-Almacén, 5140AC-Compras, 5142ED-Ventas, 5160EZ -Gastos)
y que cuando encuentre la primer clave de 6 dígitos seleccione el
nombre de la cuenta y copie el valor en la tercer columna dependiendo
de las cuentas que se deriven, de tal manera que quede como en la
lista anterior (VALOR COPIADO).

Sin más por el momento, quedo a sus sugerencias y soluciones.

Preguntas similare

Leer las respuestas

#1 Arcano
15/05/2007 - 22:01 | Informe spam
On 15 mayo, 10:33, al_sa_ca wrote:
Buen día a todos, escribo desde Colombia, para pedir de su amable
ayuda. Tengo un pequeño negocio e intento crear un sistemita contable
sencillo, pero he buscado en el foro algo para resolver mi problema y
no he encontrado, espero alguien me pueda ayudar.

Tengo la siguiente lista:

CLAVE CUENTA VALOR COPIADO
5140AB Almacén
5140AB01 A Almacén
5140AB02 B Almacén
5140AB03 C Almacén
5140AB04 D Almacén
5140AC Compras
5140AC01 A Compras
5140AC02 B Compras
5140AC03 C Compras
5140AC04 D Compras
5142ED Ventas
5142ED01 A Ventas
5142ED02 B Ventas
5142ED03 C Ventas
5142ED04 D Ventas
5160EZ Gastos
5160EZ01 A Gastos
5160EZ02 B Gastos
5160EZ03 C Gastos
5160EZ04 D Gastos

Lo que necesitaría es crear un código para que en la coloumna de
clave busque aquellas que sean sólo de 6 dígitos (5140AB, 5140AC,
5142ED, 5160EZ) que a su vez tienen en la siguiente columna una cuenta
(5140AB-Almacén, 5140AC-Compras, 5142ED-Ventas, 5160EZ -Gastos)
y que cuando encuentre la primer clave de 6 dígitos seleccione el
nombre de la cuenta y copie el valor en la tercer columna dependiendo
de las cuentas que se deriven, de tal manera que quede como en la
lista anterior (VALOR COPIADO).

Sin más por el momento, quedo a sus sugerencias y soluciones.



En la columna C, escribe y copia la formula:
=SI(LARGO(A2)=6;B2;"")

donde A: Clave, B:Cuenta C:Valor copiado.
Espero haber entendido y ayudado.
Respuesta Responder a este mensaje
#2 Héctor Miguel
16/05/2007 - 06:07 | Informe spam
hola, 'anonimo/a' !

... necesitaria... codigo para que en la coloumna de clave busque aquellas que sean solo de 6 digitos
(5140AB, 5140AC, 5142ED, 5160EZ) que a su vez tienen en la siguiente columna una cuenta
(5140AB-Almacen, 5140AC-Compras, 5142ED-Ventas, 5160EZ -Gastos)
y que cuando encuentre la primer clave de 6 digitos seleccione el nombre de la cuenta
y copie el valor en la tercer columna dependiendo de las cuentas que se deriven
de tal manera que quede como en la lista anterior (VALOR COPIADO).



suponiendo que clave y cuenta estan en [A1] y [B1] -> datos a futuro en la columna 'C'
y que no existen filas vacias de por medio en la columna 'A' -?-
prueba con una macro +/- como la siguiente:

Sub Rellena_cuentas()
Dim Donde As String, n As Integer
Application.ScreenUpdating = False
Columns("c").ClearContents: [c2].Formula = "=len(a2)>6"
With Range([a1], [a65536].End(xlUp))
.AdvancedFilter xlFilterInPlace, [c1:c2], , False
Donde = .Offset(1).Resize(.Rows.Count - 1) _
.SpecialCells(xlCellTypeVisible).Address(0, 0)
.Parent.ShowAllData
End With: [c2].ClearContents
For n = 1 To Range(Donde).Areas.Count
With Range(Donde).Areas(n)
.Offset(, 2).Value = .Cells(1).Offset(-1, 1).Value
End With
Next
End Sub

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

__ los datos expuestos __
Tengo la siguiente lista:
CLAVE CUENTA VALOR COPIADO
5140AB Almacén
5140AB01 A Almacén
5140AB02 B Almacén
5140AB03 C Almacén
5140AB04 D Almacén
5140AC Compras
5140AC01 A Compras
5140AC02 B Compras
5140AC03 C Compras
5140AC04 D Compras
5142ED Ventas
5142ED01 A Ventas
5142ED02 B Ventas
5142ED03 C Ventas
5142ED04 D Ventas
5160EZ Gastos
5160EZ01 A Gastos
5160EZ02 B Gastos
5160EZ03 C Gastos
5160EZ04 D Gastos
Respuesta Responder a este mensaje
#3 Ivan
17/05/2007 - 00:45 | Informe spam
hola chicos,

disculpad la intromision, pero una vez mas Hector Miguel me acaba de dejar
alucinado y me gustaria hacerle una consulta.

hola Hector, como acabo de comentar, me has vuelto a sorprender, esta vez
con el uso de areas, de las que apenas se nada y tampoco parece que la
ayuda de muchas pistas sobre como trabajar con ellas. En concreto, lo que
mas me ha sorprendido ha sido esta parte:

For n = 1 To Range(Donde).Areas.Count
With Range(Donde).Areas(n)
.Offset(, 2).Value = .Cells(1).Offset(-1, 1).Value
End With
Next



por lo que creo entender, el valor maximo de n seria el nº de areas (pej.
para el ej. expuesto serian 4)

¿entonces, como asigna el valor a cada elemento de la columna c del area
(offset) correspondiente?

en un principio me ha dado la impresion de que asignaba todo como un bloque,
o sea, que si asignas/manipulas algo en base a un area esto se aplicara a
todos los elementos que tengan esa relacon para cada uno de los
miembros/celdas del area (en este caso Offset(,2)), y que esta relacion, al
menos con rangos 'externos' al propio area, se aplicaria a partir del
'limite del area.

Pero al hacer alguna prueba incluyendo un offset 'vertical' al final de tu
procedimiento, me ha dado la impresion de que toma como referencia del area
la 1ª celda de este, y que mas bien su funcionamiento es como un bucle.
Bueno no se si me explico, pero te pongo la prueba que he hecho y lo que
devuelven

1er intento ( dentro del bucle.)

If n = Range(Donde).Areas.Count Then .Offset(1, 0).Value = _
.Cells(1).Offset(-1, 1).Value

Pensaba que al asignar Offset(1,0) solo implicaria a la fila siguiente a la
ultima del area, o en su defecto a un nº igual de filas pero a partir de
esta. Sin embargo parece actuar a partir de la 1ª celda del rango, un poco
como si fuera un bucle ¿¿??

para conseguir que trabaje a partir del limite parece que hay que
indicarselo explicitamente: y haciendo referencia realmente a cada una de
las celdas, pues copia en tantas celdas como contiene el rango

If n Then .Offset(.Rows.Count, 0).Value = .Cells(.).Value

bueno, en definitiva:

¿podrias explicarnos un poco como funciona el codigo, al menos en lo que a
esa parte se refiere? <aunque segun he ido escribiendo me parece que
realmente no deja de funcionar como un bloque, pero tomando como referencia
la 1ª celda del rango?>

en cualquier caso muchas por el mismo y disculpas por la intromision y por
si estoy diciendo una tonteria.

un saludo y hasta pronto
Ivan

PD: tambien me ha servido para aprender como utilizar formulas como
criterios de los FA, gracias otra vez.
Respuesta Responder a este mensaje
#4 Héctor Miguel
17/05/2007 - 01:41 | Informe spam
hola, Ivan !

__ 1 __
... con el uso de areas, de las que apenas se nada y tampoco parece que la ayuda de muchas pistas ...
... esta parte:
For n = 1 To Range(Donde).Areas.Count
With Range(Donde).Areas(n)
.Offset(, 2).Value = .Cells(1).Offset(-1, 1).Value
End With
Next


... como asigna el valor a cada elemento de la columna c del area (offset) correspondiente?



1) prueba sustituyendo el copiado de los valores [la linea central del bloque with] por cuadros de mensaje [p.e.]

With Range(Donde).Areas(n)
MsgBox "Poner" & vbTab & .Cells(1).Offset(-1, 1).Address & vbCr & _
"Aqui" & vbTab & .Offset(, 2).Address & vbCr & _
"Segun" & vbTab & .Address
' .Offset(, 2) = .Cells(1).Offset(-1, 1)
End With

__ 2 __
en un principio me ha dado la impresion de que asignaba todo como un bloque, o sea
que si asignas/manipulas algo en base a un area esto se aplicara a todos los elementos que tengan esa relacon...
(en este caso Offset(,2)), y que esta relacion, al menos con rangos 'externos'... se aplicaria a partir del 'limite del area [...]



2) Offset lo unico que hace [en castellano] es: -> DES<plazar>REF<eferencias> [mismas dimensiones a menos que uses Resize]
-> MsgBox Range("a1:a5").Offset(0, 2).Address ' devuelve $C$1:$C$5
-> MsgBox Range("a1:a5").Offset(1, 1).Address ' devuelve $B$2:$B$6
-> MsgBox Range("a1:a5").Offset(1, 0).Address ' devuelve $A$2:$A$6

__ 3 __
para conseguir que trabaje a partir del limite parece que hay que indicarselo explicitamente:
y haciendo referencia realmente a cada una de las celdas, pues copia en tantas celdas como contiene el rango
If n Then .Offset(.Rows.Count, 0).Value = .Cells(.).Value
bueno, en definitiva:
podrias explicarnos un poco como funciona el codigo, al menos en lo que a esa parte se refiere?...



3) la propiedad 'Areas' contiene a su vez un conjunto de rangos [con las mismas propiedades y metodos]
cada area puede ser de una sola celda o de varias filas/columnas [que tambien son medibles/contables/...]
hacer referencia a la priner celda de una area [.Cells(1)] te da una 'cierta seguridad' de no estar considerando varias celdas
[creo que el ejemplo de los mensajes en el punto 1 podria ser mas 'explicativo'] :))

si cualquier duda... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#5 Ivan
17/05/2007 - 03:10 | Informe spam
hola Hector Miguel, muchas gracias de nuevo

la verdad es que a veces se nos(me) escapa lo evidente con tal de
complicarnos la vida. Con todo el tiempo que llevo usando Offset, nuca me
habia parado a pensar si seria valido para rangos de mas de una celda.

Bueno, esto lo explica (casi) todo, aunque le echare un vistazo a los msgbox
del ej.

un saludo, y gracias de nuevo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida