visual valor una ultima seleccionar recorrer para obtener numero macro hasta fila datos con columnas columna codigo celda buscar buscado excel vba excel-vba vsto

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.