Simplemente necesito revisar todas las celdas en una hoja de cálculo de Excel y verificar los valores en las celdas. Las celdas pueden contener texto, números o estar en blanco. No estoy muy familiarizado/cómodo trabajando con el concepto de 'Rango'. Por lo tanto, cualquier código de muestra sería muy apreciado. (Intenté buscarlo en Google, pero los fragmentos de código que encontré no hicieron lo que necesitaba)
Gracias.
Sub CheckValues1()
Dim rwIndex As Integer
Dim colIndex As Integer
For rwIndex = 1 To 10
For colIndex = 1 To 5
If Cells(rwIndex, colIndex).Value <> 0 Then _
Cells(rwIndex, colIndex).Value = 0
Next colIndex
Next rwIndex
End Sub
Encontré este fragmento en http://www.Java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Parece ser bastante útil como una función para ilustrar los medios para verifique los valores en las celdas de manera ordenada.
Imagínelo como una especie de matriz 2D y aplique la misma lógica para recorrer las celdas.
Si solo necesita mirar las celdas que están en uso, puede usar:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
que golpeará todo en el rango de A1 a la última celda con datos (la celda inferior derecha)
Si solo está mirando los valores de las celdas, puede almacenar los valores en una matriz de tipo de variante. Parece que obtener el valor de un elemento en una matriz puede ser mucho más rápido que interactuar con Excel, por lo que puede ver alguna diferencia en el rendimiento utilizando una matriz de todos los valores de celda en comparación con obtener celdas individuales repetidamente.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
Entonces puede obtener un valor de celda simplemente marcando ValArray (fila, columna)
Puede usar un For Each para recorrer en iteración todas las celdas en un rango definido.
Public Sub IterateThroughRange()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range
Set wb = Application.Workbooks(1)
Set ws = wb.Sheets(1)
Set rng = ws.Range("A1", "C3")
For Each cell In rng.Cells
cell.Value = cell.Address
Next cell
End Sub
Para una aplicación VB o C #, una forma de hacerlo es usando Office Interop. Esto depende de la versión de Excel con la que esté trabajando.
Para Excel 2003, este artículo de MSDN es un buen lugar para comenzar. Comprensión del modelo de objetos de Excel desde la perspectiva del desarrollador de Visual Studio 2005
Básicamente, deberá hacer lo siguiente:
Excel.Range allCellsRng;
string lowerRightCell = "IV65536";
allCellsRng = ws.get_Range("A1", lowerRightCell).Cells;
foreach (Range cell in allCellsRng)
{
if (null == cell.Value2 || isBlank(cell.Value2))
{
// Do something.
}
else if (isText(cell.Value2))
{
// Do something.
}
else if (isNumeric(cell.Value2))
{
// Do something.
}
}
Para Excel 2007, intente esta referencia de MSDN .
Básicamente puedes recorrer un rango
Obtener una hoja
myWs = (Worksheet)MyWb.Worksheets[1];
Obtenga el rango que le interesa Si realmente desea verificar cada celda, use los límites de Excel
La "gran cuadrícula" de Excel 2007 aumenta el número máximo de filas por hoja de trabajo de 65,536 a más de 1 millón, y el número de columnas de 256 (IV) a 16,384 (XFD). desde aquí http://msdn.Microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel
y luego recorrer el rango
Range myBigRange = myWs.get_Range("A1", "A256");
string myValue;
foreach(Range myCell in myBigRange )
{
myValue = myCell.Value2.ToString();
}
Hay varios métodos para lograr esto, cada uno de los cuales tiene ventajas y desventajas; En primer lugar, necesitará tener una instancia de un objeto de hoja de trabajo, Application.ActiveSheet funciona si solo desea el que está mirando el usuario.
El objeto Hoja de trabajo tiene tres propiedades que se pueden usar para acceder a los datos de la celda (Celdas, Filas, Columnas) y un método que se puede usar para obtener un bloque de datos de la celda (get_Range).
Los rangos se pueden cambiar de tamaño y demás, pero es posible que deba usar las propiedades mencionadas anteriormente para averiguar dónde están los límites de sus datos. La ventaja de un rango se hace evidente cuando se trabaja con grandes cantidades de datos porque los complementos VSTO se alojan fuera de los límites de la aplicación Excel, por lo que todas las llamadas a Excel deben pasar a través de una capa con sobrecarga; obtener un Rango le permite obtener/configurar todos los datos que desea en una llamada, lo que puede tener enormes beneficios de rendimiento, pero requiere que use detalles explícitos en lugar de repetir cada entrada.
Esta publicación del foro de MSDN muestra a un desarrollador de VB.Net haciendo una pregunta sobre cómo obtener los resultados de un Rango como una matriz
Mis habilidades de VBA están un poco oxidadas, pero esta es la idea general de lo que haría.
La forma más fácil de hacer esto sería iterar a través de un ciclo para cada columna:
public sub CellProcessing()
on error goto errHandler
dim MAX_ROW as Integer 'how many rows in the spreadsheet
dim i as Integer
dim cols as String
for i = 1 to MAX_ROW
'perform checks on the cell here
'access the cell with Range("A" & i) to get cell A1 where i = 1
next i
exitHandler:
exit sub
errHandler:
msgbox "Error " & err.Number & ": " & err.Description
resume exitHandler
end sub
parece que el resaltado de sintaxis de color no le gusta vba, pero espero que esto ayude un poco (al menos le dará un punto de partida para trabajar).
En Excel VBA, esta función le dará el contenido de cualquier celda en cualquier hoja de trabajo.
Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function
Entonces, si desea verificar el valor de las celdas, simplemente coloque la función en un bucle, dele la referencia a la hoja de trabajo que desea y al índice de fila y el índice de columna de la celda. El índice de fila y el índice de columna comienzan desde 1, lo que significa que la celda A1 será ws.Cells (1,1) y así sucesivamente.