Pregunta

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á muy apreciado.(Intenté buscarlo en Google, pero los fragmentos de código que encontré no hicieron lo que necesitaba)

Gracias.

¿Fue útil?

Solución

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 función para ilustrar los medios para verificar los valores en las celdas de forma ordenada.

Imagínelo como una especie de matriz 2D y aplique la misma lógica para recorrer las celdas.

Otros consejos

Si solo necesitas mirar las celdas que están en uso puedes usar:

sub IterateCells()

   For Each Cell in ActiveSheet.UsedRange.Cells
      'do some stuff
   Next

End Sub

eso afectará a todo lo que esté en el rango desde A1 hasta 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 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 usando 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

Luego puede obtener un valor de celda simplemente marcando ValArray (fila, columna)

Puede utilizar For Each para recorrer 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 mediante 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 la perspectiva del desarrollador de Visual Studio 2005

Básicamente necesitarás hacer lo siguiente:

  • Inicie la aplicación Excel.
  • Abra el libro de Excel.
  • Recupere la hoja de trabajo del libro por nombre o índice.
  • Repita todas las celdas de 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.

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

Se puede cambiar el tamaño de los rangos y demás, pero es posible que necesite utilizar 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 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 pasar a través de una capa con gastos generales;obtener un Rango le permite obtener/configurar todos los datos que desea en una sola 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

Básicamente puedes recorrer un rango

conseguir 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 "Grid Grid" 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).de 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 proporcionará el contenido de cualquier celda de 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, proporciónele la referencia a la hoja de trabajo que desea y el índice de fila y el índice de columna de la celda.Tanto el índice de fila como el índice de columna comienzan desde 1, lo que significa que la celda A1 será ws.Cells(1,1) y así sucesivamente.

Mis habilidades con VBA están un poco oxidadas, pero esta es la idea general de lo que haría.
La forma más sencilla de hacerlo 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 a VBA, pero espero que esto ayude un poco (al menos le dé un punto de partida desde el cual trabajar).

  • brisketer
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top