web-dev-qa-db-ja.com

Excel VBAまたはVSTO 2005のすべてのセルを反復処理する

Excelスプレッドシートのすべてのセルを調べて、セルの値を確認するだけです。セルには、テキスト、数字、または空白を含めることができます。私は「範囲」の概念に精通していない/快適ではありません。したがって、サンプルコードは大歓迎です。 (私はそれをグーグルしようとしましたが、私が見つけたコードスニペットは私が必要なことをまったくしていませんでした)

ありがとうございました。

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

http://www.Java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm でこのスニペットを見つけましたセル内の値を順番にチェックする手段を説明する関数として非常に便利です。

ソートの2D配列であると想像して、同じロジックを適用してセルをループします。

7
betelgeuce

使用中のセルだけを見る必要がある場合は、次を使用できます。

sub IterateCells()

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

End Sub

a1からデータのある最後のセル(右下のセル)までの範囲のすべてにヒットします

56
cori

セルの値を見ているだけであれば、バリアント型の配列に値を保存できます。配列内の要素の値を取得することは、Excelと対話するよりもはるかに高速であるように見えるため、すべてのセル値の配列を使用すると、単一のセルを繰り返し取得する場合と比べてパフォーマンスの違いを確認できます。

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

その後、ValArray(row、column)をチェックするだけでセル値を取得できます

5
Jon Fournier

For Eachを使用して、定義された範囲内のすべてのセルを反復処理できます。

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

VBまたはC#アプリの場合、これを行う1つの方法は、Office Interopを使用することです。これは、使用しているExcelのバージョンによって異なります。

Excel 2003の場合、このMSDNの記事は開始するのに適した場所です。 Visual Studio 2005開発者の視点からのExcelオブジェクトモデルの理解

基本的に次のことを行う必要があります。

  • Excelアプリケーションを起動します。
  • Excelブックを開きます。
  • 名前またはインデックスでワークブックからワークシートを取得します。
  • 範囲として取得されたワークシート内のすべてのセルを反復処理します。
  • 最後のステップのサンプル(未テスト)コードの抜粋。

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

Excel 2007の場合、 このMSDNリファレンス を試してください。

2

基本的に範囲をループできます

シートを入手する

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

すべてのセルを確認したい場合は、Excelの制限を使用して、関心のある範囲を取得します

Excel 2007の「ビッググリッド」は、ワークシートごとの最大行数を65,536から100万を超え、列数を256(IV)から16,384(XFD)に増やします。ここから http://msdn.Microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel

そして、範囲をループします

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

        string myValue;

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

これを達成するにはいくつかの方法があり、それぞれに利点と欠点があります。何よりもまず、Worksheetオブジェクトのインスタンスが必要になります。Application.ActiveSheetは、ユーザーが見ているものだけが必要な場合に機能します。

Worksheetオブジェクトには、セルデータ(セル、行、列)にアクセスするために使用できる3つのプロパティと、セルデータのブロックを取得するために使用できるメソッド(get_Range)があります。

範囲はサイズ変更などが可能ですが、データの境界がどこにあるかを調べるには、上記のプロパティを使用する必要がある場合があります。 VSTOアドインはExcelアプリケーション自体の境界外でホストされるため、大量のデータを操作する場合、Rangeの利点が明らかになります。したがって、Excelへのすべての呼び出しはオーバーヘッドのあるレイヤーを通過する必要があります。 Rangeを取得すると、1回の呼び出しで必要なすべてのデータを取得/設定できるため、パフォーマンスが大幅に向上しますが、各エントリを繰り返すのではなく、明示的な詳細を使用する必要があります。

このMSDNフォーラムの投稿 は、範囲の結果を配列として取得することについて質問するVB.Net開発者を示しています

1
TheXenocide

私のVBAスキルは少し錆びていますが、これは私がやろうとしていることの一般的な考え方です。
これを行う最も簡単な方法は、列ごとにループを繰り返すことです。

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

色の構文の強調表示はvbaを好まないように見えますが、これがいくらか役立つことを願っています(少なくとも作業の出発点を示します)。

  • ブリスケティア
0
Brisketeer

Excel VBAでは、この関数は任意のワークシートの任意のセルのコンテンツを提供します。

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

したがって、セルの値を確認する場合は、関数をループに入れて、目的のワークシートへの参照と、セルの行インデックスと列インデックスを指定します。行インデックスと列インデックスは両方とも1から始まり、セルA1はws.Cells(1,1)などになります。

0
Martin08