it-swarm-pt.tech

Iterando através de todas as células no Excel VBA ou VSTO 2005

Eu preciso simplesmente passar por todas as células em uma planilha do Excel e verificar os valores nas células. As células podem conter texto, números ou ficar em branco. Não estou muito familiarizado/confortável trabalhando com o conceito de 'Range'. Portanto, qualquer código de amostra seria muito apreciado. (Tentei pesquisar no Google, mas os trechos de código que encontrei não fizeram exatamente o que eu precisava)

Obrigado.

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

Encontre este trecho em http://www.Java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm Parece ser bastante útil como uma função ilustrar os meios para verifique os valores nas células de maneira ordenada.

Imagine-o como um tipo de matriz 2d e aplique a mesma lógica para percorrer as células.

7
betelgeuce

Se você precisar apenas observar as células em uso, poderá usar:

sub IterateCells()

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

End Sub

que atingirá tudo no intervalo de A1 até a última célula com dados (a célula inferior direita)

56
cori

Se você estiver apenas analisando valores de células, poderá armazenar os valores em uma matriz do tipo variante. Parece que a obtenção do valor de um elemento em uma matriz pode ser muito mais rápida do que a interação com o Excel, para que você possa ver alguma diferença no desempenho usando uma matriz de todos os valores de células em comparação à obtenção repetida de células únicas.

Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value

Então você pode obter um valor de célula apenas marcando ValArray (linha, coluna)

5
Jon Fournier

Você pode usar um For Each para percorrer todas as células em um intervalo 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 um aplicativo VB ou C #, uma maneira de fazer isso é usando o Office Interop. Isso depende de qual versão do Excel você está trabalhando).

Para o Excel 2003, este artigo do MSDN é um bom lugar para começar. Entendendo o modelo de objeto do Excel na perspectiva de um desenvolvedor do Visual Studio 2005

Basicamente, você precisará fazer o seguinte:

  • Inicie o aplicativo Excel.
  • Abra a pasta de trabalho do Excel.
  • Recupere a planilha da pasta de trabalho por nome ou índice.
  • Iterar todas as células na planilha que foram recuperadas como um intervalo.
  • Exemplo de trecho de código (não testado) abaixo para a última etapa.

    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 o Excel 2007, tente esta referência do MSDN .

2
Cory Engebretson

Basicamente, você pode fazer um loop sobre um intervalo

Obter uma folha

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

Obtenha o intervalo de seu interesse Se você realmente deseja verificar todas as células, use os limites do Excel

O Excel 2007 "Big Grid" aumenta o número máximo de linhas por planilha de 65.536 para mais de 1 milhão e o número de colunas de 256 (IV) para 16.384 (XFD). daqui http://msdn.Microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

e depois percorrer o intervalo

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

        string myValue;

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

Existem vários métodos para conseguir isso, cada um dos quais com vantagens e desvantagens; Em primeiro lugar, você precisará ter uma instância de um objeto Planilha, Application.ActiveSheet funcionará se você quiser apenas aquele que o usuário está vendo.

O objeto Planilha possui três propriedades que podem ser usadas para acessar dados da célula (Células, Linhas, Colunas) e um método que pode ser usado para obter um bloco de dados da célula (get_Range).

As faixas podem ser redimensionadas e assim por diante, mas você pode precisar usar as propriedades mencionadas acima para descobrir onde estão os limites dos seus dados. A vantagem de um intervalo se torna aparente quando você trabalha com grandes quantidades de dados porque os suplementos do VSTO são hospedados fora dos limites do próprio aplicativo do Excel; portanto, todas as chamadas para o Excel precisam ser passadas por uma camada com sobrecarga; a obtenção de um intervalo permite obter/definir todos os dados que você deseja em uma chamada, o que pode trazer enormes benefícios de desempenho, mas requer o uso de detalhes explícitos, em vez de iterar em cada entrada.

Esta publicação no fórum do MSDN mostra um desenvolvedor de VB.Net fazendo uma pergunta sobre como obter os resultados de um intervalo como uma matriz

1
TheXenocide

Minhas habilidades em VBA estão um pouco enferrujadas, mas essa é a ideia geral do que eu faria.
A maneira mais fácil de fazer isso seria percorrer um loop para cada coluna:

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 o realce da sintaxe de cores não gosta de vba, mas espero que isso ajude um pouco (pelo menos, dê-lhe um ponto de partida para trabalhar).

  • Brisketeer
0
Brisketeer

No Excel VBA, essa função fornecerá o conteúdo de qualquer célula em qualquer planilha.

Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
    getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function

Portanto, se você quiser verificar o valor das células, basta colocar a função em um loop, forneça a referência para a planilha desejada e o índice de linha e índice de coluna da célula. O índice de linha e o índice de coluna iniciam em 1, significando que a célula A1 será ws.Cells (1,1) e assim por diante.

0
Martin08