2008-09-16 23 views
22

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)Cómo iterar a través de todas las celdas en Excel VBA o VSTO 2005

Gracias.

Respuesta

7
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 

Encontrado 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 comprobar los valores en las células de una manera ordenada.

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

+4

Código que se repite a través de cada celda de un rango es extremadamente ineficiente. Lea el rango en una matriz, realice las comprobaciones/cambios en la matriz y luego vuelva a escribir la matriz en el rango. Aceptemos dejar de usar este código y tal vez desaparecerá. – JimmyPena

0

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 

lo tanto, si desea comprobar el valor de las células, sólo hay que poner la función en un bucle, darle la referencia a la hoja de trabajo que desea y el índice de índice de la fila y la 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.

3

Puede usar un 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 
52

Si sólo tiene que mirar a las células que están en uso se puede utilizar:

sub IterateCells() 

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

End Sub 

que llegará a todo en el rango de A1 a la última celda con datos (abajo a la derecha -más celular)

+2

Wow ... mucho mejor que worksheet.cells que bloquearon mi sistema. –

+0

Sí, eso es todo un montón de células para iterar. – cori

1

Existen 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 cálculo 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.

This MSDN forum post muestra un VB.desarrollador net haciendo una pregunta acerca de cómo obtener los resultados de una serie como una matriz

1

Es, básicamente, puede bucle en un rango

Obtener una hoja

myWs = (Worksheet)MyWb.Worksheets[1]; 

obtener el rango que le interesa Si realmente desee comprobar cada uso de células límites de Excel

los Excel 2007 "cuadrícula grande" aumenta el número máximo de filas por workshe et de 65,536 a más de 1 millones, 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 bucle sobre el rango

 Range myBigRange = myWs.get_Range("A1", "A256"); 

     string myValue; 

     foreach(Range myCell in myBigRange) 
     { 
      myValue = myCell.Value2.ToString(); 
     } 
0

Mis habilidades VBA son un poco oxidado, pero esta es la idea general de lo que lo 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 la sintaxis de color no le gusta VBA, pero espero que esto va a ayudar un poco (por lo menos darle un punto de partida para trabajar desde).

  • Brisketeer
2

Para un VB o C# aplicación, una manera de hacer esto es mediante el uso de oficina de interoperabilidad. 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. Understanding the Excel Object Model from a Visual Studio 2005 Developer's Perspective

podrás básicamente tiene que hacer lo siguiente:

  • iniciar la aplicación 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 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, trata de this MSDN reference.

5

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 

A continuación, se puede obtener un valor de la celda con tan solo marcar valarray (fila, columna)

+1

¡Absolutamente de acuerdo! Acabo de probar mi primera ejecución, por solo unos pocos miles de células, tomó más de 30 segundos ¡lo cual es bizzard! –

Cuestiones relacionadas