Excel VBA または VSTO 2005 のすべてのセルを反復処理する
質問
Excel スプレッドシート内のすべてのセルを調べて、セル内の値をチェックするだけです。セルにはテキスト、数字を含めることも、空白にすることもできます。私は「範囲」の概念にあまり慣れていませんし、快適に作業することもできません。したがって、サンプルコードをいただければ幸いです。(Google で検索してみましたが、見つかったコード スニペットは必要なことをまったく実行しませんでした)
ありがとう。
解決
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 配列として想像し、同じロジックをセルをループするために適用します。
他のヒント
使用中のセルだけを確認する必要がある場合は、以下を使用できます。
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
これにより、A1 からデータが含まれる最後のセル (一番下の右端のセル) までの範囲内のすべてがヒットします。
セルの値だけを確認する場合は、その値をバリアント型の配列に格納できます。配列内の要素の値を取得する方が、Excel を操作するよりもはるかに高速であるため、すべてのセル値の配列を使用すると、単一セルを繰り返し取得する場合と比較して、パフォーマンスに多少の違いが見られることがわかります。
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
その後、 ValArray( row , column ) をチェックするだけでセル値を取得できます。
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
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 リファレンス.
これを実現するにはいくつかの方法がありますが、それぞれに長所と短所があります。何よりもまず、Worksheet オブジェクトのインスタンスが必要です。ユーザーが見ているオブジェクトだけが必要な場合は、Application.ActiveSheet が機能します。
Worksheet オブジェクトには、セル データ (Cells、Rows、Columns) にアクセスするために使用できる 3 つのプロパティと、セル データのブロックを取得するために使用できるメソッド (get_Range) があります。
範囲のサイズ変更などは可能ですが、データの境界がどこにあるのかを確認するには、上記のプロパティを使用する必要がある場合があります。Range の利点は、VSTO アドインが Excel アプリケーション自体の境界の外側でホストされるため、大量のデータを操作するときに明らかになります。そのため、Excel へのすべての呼び出しはオーバーヘッドのあるレイヤーを通過する必要があります。Range を取得すると、1 回の呼び出しで必要なすべてのデータを取得/設定できるため、パフォーマンスに大きなメリットが得られますが、各エントリを反復処理するのではなく、明示的な詳細を使用する必要があります。
この MSDN フォーラムの投稿 Range の結果を配列として取得することについて質問している VB.Net 開発者を示しています。
基本的に範囲をループできます
シートを入手する
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();
}
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) などになります。
私の 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 には好まれないようですが、これが多少は役立つことを願っています (少なくとも作業の出発点にはなります)。
- ブリスケティア