# celdas fantasma!



## •Daniel• (Jun 6, 2011)

tengo una hoja de un inventario que acabe de digitar a excel, el problema es que lo digité en diferentes libros de excel, ya lo pasé todo a un libro pero las cantidades están en columnas diferentes, si sumo ambas columnas pareciera que todo va bien.

 Excepto que los códigos que no tienen cantidad quedan en ceros y preferiria que quedaran en blanco, luego hago un condicional que si las dos celdas están en blanco deje en blanco de lo contrario sume, todo de maravilla,  quedan sumadas y los códigos sin existencias quedan con cantidad en blanco....el problema es que como son 9mill códigos ya que la columnad está llena de condicionales me gustaria pasar rapidamente por los q tienen existencias, usando la tecla control+abajo pero se salta de una al final de los códigos...

pensé que bastaría con seleccionar toda la columna ponerle ctrl+c ctrl+v y pegar solo valores, esto elimina los condicionales y las celdas se ven en blanco pero al usar contrl+dirrección sigue sin reconocer esas celdas como en blanco, es decir no me hace paradas intermedias entre los números de esa columna sino que toma como si todo estuviera lleno........

he intentado seleccionar todo y arle f5 ir a celdas en blanco y poner suprimir pero nada, tampoco las reconoce como en blanco, hay una forma de eliminar este "fantasma" e pararce en cada celda y darle suprimir, pero entiendan que son 9mill celdas, espero no haberlos confundido mucho 

gracias


----------



## Marcelo Branco (Jun 6, 2011)

Hola Daniel,

Decir que después de Ctrl+C y pegar solo valores su rango és P1:P9000

Proba esto eu un libro de ensayo (test-workbook)


```
Sub test1()
    Dim aCell As Range
    For Each aCell In Range("P1:P9000")
        If Len(aCell) = 0 Then
            aCell.ClearContents
        End If
    Next aCell
End Sub
```
 
Espero que ayude

M.


----------



## •Daniel• (Jun 9, 2011)

Gracias, 

Sí sirve me has ayudado a ampliar mis conocimientos en visual basic, también encontré como solucionar el problema sin necesidad de VB, al tener los datos solo como valores le doy f5 y me voy a constantes y no selecciono el cuadro de numéricas, luego me selecciona todos los espacios en blanco, le doy f2 y después ctrl+enter.


----------



## Marcelo Branco (Jun 9, 2011)

Daniel,

También aprendi algo nuevo con usted (F5, constantes....) 

M.


----------



## Greg Truby (Jun 13, 2011)

Hola Daniel y Marcelo,
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-comfficeffice" /><o></o>
De hecho topé con algo igual hace poco y me tuvo bien, bien confundido. Hice un programa para un cliente para pasar datos de una hoja vieja a una nueva y también había columnas de validación de datos que usaban =ISBLANK() y ISBLANK() me estaba devolviendo FALSO para las celdas que debían haber estado completamente vacías.
<o></o>
La solución que hice fue algo parecido a lo que hizo Marcelo, un bucle que buscaba celdas de largo cero. 
<o></o>
Un par de comentarios para otros lectores que pueden topar con la presente en el futuro. 
<o></o>
(a) En este caso tratamos con *valores* y no con fórmulas. Si existían la posibilidad de tener fórmulas involucradas también sería necesario especificar eso en el código de Marcelo o sea:
<o></o>
If Len(aCell.Formula) = 0 Then
<o></o>


(b) Además a veces bucles son bastantes lerdos. Si la hoja no tiene demasiados cálculos puede ser que una combinación de las soluciones de Daniel y Marcelo brindará resultados óptimos. Además el siguiente también resuelva un problema con la solución de Daniel que es si una encuentra el problema de «blancos falsos» con una columna de texto y no de números.

<o>
	
	
	
	
	
	



```
<o:p>Sub LimpiarBlancosFalsos()</o:p>
<o:p></o:p>
<o:p>  Dim rngHelper       As Excel.Range, _
        rngSelection    As Excel.Range, _
        rngToClear      As Excel.Range
    </o:p>
<o:p>   If TypeName(Selection) <> "Range" Then Exit Sub
 
    Set rngSelection = Selection
    If rngSelection.Columns.Count > 1 Then Exit Sub
 
    Application.ScreenUpdating = False
    rngSelection.Offset(, 1).EntireColumn.Insert
    Set rngHelper = rngSelection.Offset(, 1)
 
    rngHelper.FormulaR1C1 = "=1/len(rc[-1])"
 
    On Error Resume Next
    Set rngToClear = rngHelper.SpecialCells(XlCellType.xlCellTypeFormulas, _
                                            XlSpecialCellsValue.xlErrors)
 
    If Not rngToClear Is Nothing Then
        Set rngToClear = rngToClear.Offset(, -1)
        rngToClear.ClearContents
    End If
 
    rngHelper.EntireColumn.Delete
    Application.ScreenUpdating = True
</o:p>
<o:p>End Sub</o:p>
```
 
Una posible falla del código arriba es que hay un máximo número de areas que un rango puede contener.  La última vez que vi, el límite fue 2,048 areas.</o>


----------



## Marcelo Branco (Jun 22, 2011)

Hi Greg,

Sorry for the delay in answering (i was abroad playing a Bridge tournament - no computer, no internet... )

Interesting solution. I liked it.

All the best

M.


----------

