web-development-kb-es.site

Iterando a través de todas las celdas en Excel VBA o VSTO 2005

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.

23
Ryan Liang
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.

7
betelgeuce

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)

56
cori

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)

5
Jon Fournier

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
3
theo

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:

  • Inicie la aplicación de Excel.
  • Abra el libro de Excel.
  • Recupere la hoja de trabajo del libro por nombre o índice.
  • Iterar a través de todas las celdas en la hoja de trabajo que se recuperaron como un rango.
  • Extracto de código de muestra (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, intente esta referencia de MSDN .

2
Cory Engebretson

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();
        }
1
w4ik

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

1
TheXenocide

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).

  • Brisketeer
0
Brisketeer

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.

0
Martin08