# Problema con Macros Excel



## Chaveliado (Nov 5, 2009)

Tengo un problema con esta macro, no se ejecuta bien, unicamente hace lo que quiero si la separo en 2 partes quisiera que me ayudaran, aqui les envio los codigos;

Aqui estan las 2 macros, estan separadas porque solo asi funcionan bien lo que quiero es que al unirlas ejecuten lo mismo. Gracias


Sub pasouno()
'
' pasouno Macro
' Macro recorded 17/04/2008 by CSF
'
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Range("A1").Select
Wend
Application.MoveAfterReturn = False

ActiveCell.Offset(0, 0).Select
Application.SendKeys ("%=~")
'
End Sub



Sub paso2()
'
' pruebaaaaaaaaaaaaa Macro
' Macro recorded 17/04/2008 by CSF


ActiveCell.Offset(0, 0).Select
ActiveCell.Copy
ActiveCell.Offset(-1, 1).Select

Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
ActiveCell.Offset(0, -1).Select
ActiveCell.Offset(1, 0).Select
Selection.ClearContents
ActiveCell.Offset(1, 0).Select
Application.MoveAfterReturn = True
'
End Sub


----------



## Greg Truby (Nov 7, 2009)

Bienvenido a MrExcel, Chaveliado,

Usted necesita una sola linea para hacer lo que usted está tratando de hacer. Favor sepa que funciona exactamente como lo que usted puso, o sea si no haya una celda con un valor debajo de la celda activa el macro brincará hasta la última fila de la hoja.
	
	
	
	
	
	



```
Sub foo()
    ActiveCell.End(xlDown).Offset(, 1).Value = Application.WorksheetFunction.Sum(Range(ActiveCell, ActiveCell.End(xlDown)))
End Sub
```


----------



## Chaveliado (Nov 11, 2009)

Hola, me sirvio de mucho gracias, solo que ahora le he agregado lo siguiente para que la macro siga sumando en una lista de precios, lo que quiero es que si la celda activa en que queda la macro esta vacia ya no se siga ejecutando. 



ActiveCell.End(xlDown).Offset(0, 1).Value = Application.WorksheetFunction.Sum(Range(ActiveCell, ActiveCell.End(xlDown)))
While ActiveCell.Value <> ""
        ActiveCell.Offset(1, 0).Range("A1").Select
    WendWhile ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(1, 0).Select


----------



## Greg Truby (Nov 20, 2009)

Perdone por haber tardado tanto en responder.  Ha sido un mes de trabajar de 80 a 96 horas semanalmente.

El código arriba no es un bucle.  Mejor proveer una muestra de sus datos y trater de mostrar o explicar qué es lo que quiere hacer.


----------



## Chaveliado (Nov 24, 2009)

Hola, aqui esta una muestra

*Producto Precio*

Producto x $5.10 *** La macro debe estar en el primer valor de 5.10 sumar el
producto x $5.15 *** bloque de producto x, y el resultado colocarlo a la derecha 
producto x $25.5 (suma)<-----------exactamente aqui 

producto y $20.2 ***<--------y luego colocarse en $20.2 y que realize el mismo 
producto y $85.2 ****proceso anterior, y asi sucesivamente y que se 
producto y $35.20 ***detenga cuando no encuentre nada más que sumar.
producto y $35.25 
producto y $3.10

producto z $8.10
producto z $50.20
producto z $8.10
producto z $25.3

Esta lista es mucho mas grande y con mas productos....


----------



## Greg Truby (Nov 24, 2009)

Todavía no es necesario usar un bucle. Parece probable que usted podría usar Subtotales.


```
Sub UsandoSubtotal()
    '// si producto no está en la primera columna habrá que cambiar
    '// ese 1 en GroupBy al número de la columna de productos.  Y si los
    '// precios no están en la segunda, habrá que cambiar la matrix para
    '// TotalList
    ActiveSheet.UsedRange.Subtotal GroupBy:=1, _
                                   Function:=xlSum, _
                                   TotalList:=Array(2), _
                                   Replace:=True, _
                                   PageBreaks:=False, _
                                   SummaryBelowData:=True
End Sub
```


----------



## Chaveliado (Nov 25, 2009)

Ya lo e intentado con subtotales, pero el problema es que en el nombre del producto van medidas u otras especificaciones, entonces se tiene que hacer manual la separacion por bloques de un producto especifico, que lo único que cambia son medidas o cosas asi, por ejemplo:

producto y CAL.80 30"X40"
producto y CAL 0.030 T.30 X 40"
producto y C-18 T.30 X 40"

En subtotales dividiria estos materiales, pero sigue siendo un producto Y solo que con otras especificaciones.


----------



## Greg Truby (Nov 25, 2009)

Para que sepa, no soy el tipo de MVP que da de comer con cuchara al menos que usted pone una foto de usted en pañal con sonajero. Enseño más que regalo. Si usted está dispuesto hacer el trabajo, estoy dispuesto servir de guía. 
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-comfficeffice" /><o></o> 
Bueno, ya me convenció usar un bucle. Primer paso es identificar el rango donde el bucle debe de trabajar. Un truco que empecé usar a penas estaba aprendiendo VBA es pintar la celdas para asegurar que había identificado el rango correcto.
<o></o> 
Paso uno: pinte tal rango. Algo *como* 


```
Sub PasoUno()
 
 
   Const c_strColDePrecios As String = "XFD"    '// cambie esta constante a la letra
                                                '// de la columna con los precios
 
   Dim rngColDePrecios As Excel.Range, lngUltimaFila As Long
 
 
 
   '// ponga el código necesario para identificar el rango buscado
   '// (estoy dejando esta tarea para usted.)
 
 
 
   '// ahora pintamos el rango amarillo para estar seguro que
   '// podemos escoger el rango correcto.
 
   rngColDePrecios.Interior.Color = vbYellow
 
End Sub
```


----------



## Chaveliado (Dec 1, 2009)

Sub PasoUno()


   Const c_strColDePrecios As String = "XFD"    '// cambie esta constante a la letra
                                                '// de la columna con los precios

   Dim rngColDePrecios As Excel.Range, lngUltimaFila As Long



   '// ponga el código necesario para identificar el rango buscado
   '// (estoy dejando esta tarea para usted.)
 
Range("C11:D31").Select 'no estoy seguro si esta bien este rango, la macro intente ejecutarla y no se que hace.
 
   '// ahora pintamos el rango amarillo para estar seguro que
   '// podemos escoger el rango correcto.

   rngColDePrecios.Interior.Color = vbYellow
End Sub
Gracias por la ayuda, solo aclaro que he leido un poco acerca de macros y me parece muy interesante y de mucha utilidad, pero desconozco mucho sobre las macros.


----------



## Greg Truby (Dec 3, 2009)

Bueno, tomamos un paso atrás para algo más básico y empezamos allí.

¿Usted sabe que para asignar un valor a una variable se escribe algo como?

```
x = 5
lngLastRow = 65536
y = Range("A19").Value
```
Para asignar un valor a *una variable de objeto* hay que usar la palabra SET o sea:
	
	
	
	
	
	



```
SET wsPrimeraHoja = Sheets("Hoja1")
SET rngLastCell = Range("A5:15")
```
Usted puede "caminar" código con la tecla F8. Asi que arregle su pantalla donde se puede ver ambos Excel y el editor VBE. Ahora camine el siguiente (con una hoja nueva (desechable) siendo la activa):
	
	
	
	
	
	



```
Sub PinteVarios()
 
    Dim rngPinteme As Excel.Range
 
    Set rngPinteme = Range("A1:A5")
    rngPinteme.Interior.Color = vbBlue
 
    Set rngPinteme = Range("B7:C12")
    rngPinteme.Interior.Color = vbRed
 
    Set rngPinteme = Range("E2:G14")
    rngPinteme.Interior.Color = vbYellow
 
    Set rngPinteme = Range("A3:H11")
    rngPinteme.Interior.Color = vbGreen
 
    Cells.ClearFormats
End Sub
```
¿Ve cómo funciona? Ahora trate de escribir el código para rutina "PasoUno" pero usando las direcciones directas de las celdas donde quiere poner la fórmula y píntelas amarilla. Si son muchos, haga nada más las primeras cinco celdas.


----------



## Chaveliado (Nov 5, 2009)

Tengo un problema con esta macro, no se ejecuta bien, unicamente hace lo que quiero si la separo en 2 partes quisiera que me ayudaran, aqui les envio los codigos;

Aqui estan las 2 macros, estan separadas porque solo asi funcionan bien lo que quiero es que al unirlas ejecuten lo mismo. Gracias


Sub pasouno()
'
' pasouno Macro
' Macro recorded 17/04/2008 by CSF
'
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Range("A1").Select
Wend
Application.MoveAfterReturn = False

ActiveCell.Offset(0, 0).Select
Application.SendKeys ("%=~")
'
End Sub



Sub paso2()
'
' pruebaaaaaaaaaaaaa Macro
' Macro recorded 17/04/2008 by CSF


ActiveCell.Offset(0, 0).Select
ActiveCell.Copy
ActiveCell.Offset(-1, 1).Select

Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
ActiveCell.Offset(0, -1).Select
ActiveCell.Offset(1, 0).Select
Selection.ClearContents
ActiveCell.Offset(1, 0).Select
Application.MoveAfterReturn = True
'
End Sub


----------



## Chaveliado (Dec 8, 2009)

ya observe como funciona Sub PinteVarios()
pero al escribir el pasouno me da errores (creo que no lo estoy haciendo bien) estoy trabajando en eso. y para asignar el valor a la variable y el objeto debe ir al principio del codigo?


----------



## Greg Truby (Dec 21, 2009)

Chevaliado,

Es difícil hacer recomendaciones sin ver el código que está usando. :wink:

Saludos,


----------

