Excel スプレッドシートのすべてのセルを調べて、セルの値を確認するだけです。セルには、テキスト、数字、または空白を含めることができます。私は「Range」の概念にあまり慣れていません/快適に作業できません。したがって、サンプルコードは大歓迎です。(私はそれをググろうとしましたが、見つけたコード スニペットは必要な機能を完全には実行しませんでした)
ありがとうございました。
使用中のセルのみを確認する必要がある場合は、次を使用できます。
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
A1からデータのある最後のセル(一番右下のセル)までの範囲のすべてにヒットします
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 配列であると想像して、同じロジックを適用してセルをループします。
セルの値だけを見ている場合は、バリアント型の配列に値を格納できます。配列内の要素の値を取得することは、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 相互運用機能を使用することです。これは、使用している Excel のバージョンによって異なります。
Excel 2003 については、この MSDN の記事から始めることをお勧めします。 Visual Studio 2005 開発者の視点から見た 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 リファレンスを試してください。
基本的に 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();
}
これを実現するにはいくつかの方法があり、それぞれに長所と短所があります。何よりもまず、Worksheet オブジェクトのインスタンスが必要です。Application.ActiveSheet は、ユーザーが見ているものだけが必要な場合に機能します。
Worksheet オブジェクトには、セル データ (Cells、Rows、Columns) にアクセスするために使用できる 3 つのプロパティと、セル データのブロックを取得するために使用できるメソッド (get_Range) があります。
範囲はサイズ変更などを行うことができますが、データの境界がどこにあるかを調べるために、上記のプロパティを使用する必要がある場合があります。Range の利点は、VSTO アドインが Excel アプリケーション自体の境界外でホストされているため、大量のデータを操作している場合に明らかになります。そのため、Excel へのすべての呼び出しはオーバーヘッドのあるレイヤーを通過する必要があります。Range を取得すると、必要なすべてのデータを 1 回の呼び出しで取得/設定できるため、パフォーマンスが大幅に向上しますが、各エントリを反復処理するのではなく、明示的な詳細を使用する必要があります。
この MSDN フォーラムの投稿では、VB.Net 開発者が Range の結果を配列として取得することについて質問しています。
私の 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 が気に入らないようですが、うまくいけば、これが多少は役に立ちます (少なくとも、作業の開始点が得られます)。
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) などになります。