valor - Iterando a través de todas las celdas en Excel VBA o VSTO 2005
seleccionar hasta la ultima celda con datos vba (9)
Necesito simplemente ir a través de 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 exactamente lo que necesitaba)
Gracias.
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.
El Excel 2007 "Big Grid" aumenta el número máximo de filas por hoja de cálculo 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();
}
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, solo coloque la función en un bucle, proporciónela con la hoja de trabajo que desea y el índice de fila y columna de la celda. El índice de fila y el índice de columna comienzan en 1, lo que significa que la celda A1 será ws.Cells (1,1) y así sucesivamente.
Hay varios métodos para lograr esto, cada uno de los cuales tiene ventajas y desventajas; Lo primero y más importante, necesitará una instancia de un objeto Hoja de trabajo, Application.ActiveSheet funciona si solo desea la que el usuario está mirando.
El objeto Hoja de trabajo tiene tres propiedades que se pueden usar para acceder a datos de celda (Células, Filas, Columnas) y un método que se puede usar para obtener un bloque de datos de celda, (get_Range).
Los rangos se pueden cambiar de tamaño y demás, pero es posible que necesite usar las propiedades mencionadas anteriormente para averiguar dónde están los límites de sus datos. La ventaja de un Rango se pone de manifiesto cuando se trabaja con grandes cantidades de datos porque los complementos de VSTO se alojan fuera de los límites de la propia aplicación de Excel, por lo que todas las llamadas a Excel deben pasarse por 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 iterar a través de cada entrada.
Esta publicación en el 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 VBA están un poco oxidadas, pero esta es la idea general de lo que haría.
La forma más sencilla de hacer esto sería iterar a través de un bucle 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 darle un punto de partida para trabajar).
- Brisketeer
Para una aplicación VB o C #, una forma de hacerlo es mediante el uso de 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. Comprender el modelo de objetos de Excel desde una perspectiva de desarrollador de Visual Studio 2005
Básicamente necesitarás hacer lo siguiente:
- Inicie la aplicación de Excel.
- Abra el libro de Excel.
- Recupere la hoja de trabajo del libro de trabajo por nombre o índice.
- Itere a través de todas las celdas en la hoja de trabajo que se recuperaron como un rango.
- Ejemplo de fragmento de código (no probado) a continuación para el último paso.
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, pruebe esta referencia de MSDN .
Puede usar For Each para iterar a través de 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
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 algunas diferencias en el rendimiento utilizando una matriz de todos los valores de celda en comparación con la obtención repetida de celdas individuales.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
Luego puede obtener un valor de celda simplemente marcando ValArray (fila, columna)
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
eso afectará todo en el rango de A1 a la última celda con datos (la celda inferior derecha)
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 verificar los valores en las celdas en un orden Moda.
Imagínenlo como una especie de matriz 2d y apliquen la misma lógica para recorrer las celdas.