我需要簡單瀏覽Excel電子表格中的所有單元格並檢查單元格中的值。單元格可能包含文本,數字或空白。我不太熟悉/舒適地使用「範圍」的概念。因此,任何示例代碼將不勝感激。 (我嘗試谷歌它,但我發現的代碼片段並沒有完全做我需要的)如何遍歷Excel VBA或VSTO 2005中的所有單元格
謝謝。
我需要簡單瀏覽Excel電子表格中的所有單元格並檢查單元格中的值。單元格可能包含文本,數字或空白。我不太熟悉/舒適地使用「範圍」的概念。因此,任何示例代碼將不勝感激。 (我嘗試谷歌它,但我發現的代碼片段並沒有完全做我需要的)如何遍歷Excel VBA或VSTO 2005中的所有單元格
謝謝。
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這似乎是非常有用的功能來說明的裝置,以檢查值細胞以有序的方式。
試想一下,它是一種二維數組,並應用相同的邏輯循環遍歷單元格。
在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)等等。
您可以使用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
如果你只需要看看正在使用的細胞可以使用:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
將在範圍內打擊一切從A1到數據的最後一個單元格(右下角最細胞)
哇...比我的系統死機的worksheet.cell好多了! – 2014-08-11 22:06:57
是的,這是一個整個lotta細胞迭代。 – cori 2014-08-11 23:29:55
有幾種方法可以做到這一點,每種方法都有優點和缺點;首先,您將需要有一個Worksheet對象的實例,如果您只是想要用戶正在查看的那個,Application.ActiveSheet就可以工作。
工作表對象有三個可用於訪問單元格數據(單元格,行,列)的屬性和一個可用於獲取單元格數據塊(get_Range)的方法。
範圍可以調整大小等,但您可能需要使用上述屬性來找出數據邊界的位置。當您處理大量數據時,範圍的優勢變得明顯,因爲VSTO加載項位於Excel應用程序本身的邊界之外,因此,所有對Excel的調用都必須通過帶有開銷的層進行傳遞;獲取Range可以讓您在一次調用中獲取/設置所有需要的數據,這些數據可以帶來巨大的性能優勢,但它要求您使用明確的細節而不是遍歷每個條目。
This MSDN forum post表示VB。.NET開發提出一個問題關於得到一系列的結果作爲數組
你基本上可以循環在一定範圍內
獲取片
myWs = (Worksheet)MyWb.Worksheets[1];
獲取你感興趣。如果您範圍真的要檢查每一個細胞使用Excel的限制
在Excel 2007中的「大網格」增加每 workshe的最大行數從65,536到超過1 萬,列數 從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();
}
我的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,但希望這會有所幫助(至少給你起點工作)。
對於VB或者C#應用程序,一個辦法做到這一點是通過使用Office互操作。這取決於您使用的是哪個版本的Excel。
對於Excel 2003,本MSDN文章是一個很好的開始。 Understanding the Excel Object Model from a Visual Studio 2005 Developer's Perspective
你基本上需要做到以下幾點:
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,嘗試this MSDN reference。
如果您只是查看單元格的值,則可以將值存儲在變體類型的數組中。看起來,獲取數組中元素的值可能比與Excel進行交互快得多,因此與重複獲取單個單元格相比,使用所有單元格值的數組可以看到性能上的差異。
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
然後,你可以通過檢查的valarray(行,列),其循環遍歷一個範圍內的每一個細胞的效率非常低
代碼得到一個單元格的值。將範圍讀入數組中,對數組進行檢查/更改,然後將數組寫回範圍。我們同意停止使用此代碼,也許它會消失。 – JimmyPena 2012-06-13 00:37:37