24

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

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

4

9 に答える 9

62

使用中のセルのみを確認する必要がある場合は、次を使用できます。

sub IterateCells()

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

End Sub

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

于 2008-09-16T15:58:33.477 に答える
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

http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htmでこのスニペットを見つけましたファッション。

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

于 2008-09-16T15:57:50.950 に答える
5

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

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

次に、 ValArray( row , column ) をチェックするだけでセル値を取得できます

于 2008-09-17T20:55:47.497 に答える
4

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
于 2008-09-16T15:58:17.627 に答える
2

VB または C# アプリの場合、これを行う 1 つの方法は、Office 相互運用機能を使用することです。これは、使用している 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 リファレンスを試してください。

于 2008-09-16T16:24:12.260 に答える
1

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

シートを入手する

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

興味のある範囲を取得します本当にすべてのセルをチェックしたい場合は、Excel の制限を使用します

Excel 2007 の "Big Grid" では、ワークシートあたりの最大行数が 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();
        }
于 2008-09-16T16:06:30.760 に答える
1

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

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

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

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

于 2008-09-16T16:01:26.997 に答える
0

私の 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 が気に入らないようですが、うまくいけば、これが多少は役に立ちます (少なくとも、作業の開始点が得られます)。

  • ブリスケティア
于 2008-09-16T16:06:57.543 に答える
0

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) などになります。

于 2008-09-16T15:57:06.587 に答える