Excelスプレッドシートのすべてのセルを調べて、セルの値を確認するだけです。セルには、テキスト、数字、または空白を含めることができます。私は「範囲」の概念に精通していない/快適ではありません。したがって、サンプルコードは大歓迎です。 (私はそれをグーグルしようとしましたが、私が見つけたコードスニペットは私が必要なことをまったくしていませんでした)
ありがとうございました。
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.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リファレンス を試してください。
基本的に範囲をループできます
シートを入手する
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();
}
これを達成するにはいくつかの方法があり、それぞれに利点と欠点があります。何よりもまず、Worksheetオブジェクトのインスタンスが必要になります。Application.ActiveSheetは、ユーザーが見ているものだけが必要な場合に機能します。
Worksheetオブジェクトには、セルデータ(セル、行、列)にアクセスするために使用できる3つのプロパティと、セルデータのブロックを取得するために使用できるメソッド(get_Range)があります。
範囲はサイズ変更などが可能ですが、データの境界がどこにあるかを調べるには、上記のプロパティを使用する必要がある場合があります。 VSTOアドインはExcelアプリケーション自体の境界外でホストされるため、大量のデータを操作する場合、Rangeの利点が明らかになります。したがって、Excelへのすべての呼び出しはオーバーヘッドのあるレイヤーを通過する必要があります。 Rangeを取得すると、1回の呼び出しで必要なすべてのデータを取得/設定できるため、パフォーマンスが大幅に向上しますが、各エントリを繰り返すのではなく、明示的な詳細を使用する必要があります。
このMSDNフォーラムの投稿 は、範囲の結果を配列として取得することについて質問するVB.Net開発者を示しています
私の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)などになります。