it-swarm-vi.tech

Lặp lại qua tất cả các ô trong Excel VBA hoặc VSTO 2005

Tôi chỉ cần đi qua tất cả các ô trong Bảng tính Excel và kiểm tra các giá trị trong các ô. Các ô có thể chứa văn bản, số hoặc để trống. Tôi không quen thuộc/thoải mái khi làm việc với khái niệm 'Phạm vi'. Do đó, bất kỳ mã mẫu sẽ được đánh giá rất cao. (Tôi đã cố gắng google nó, nhưng đoạn mã tôi thấy không hoàn toàn làm những gì tôi cần)

Cảm ơn bạn.

23
Ryan Liang
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

Đã tìm thấy đoạn trích này trên http://www.Java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htmlm Có vẻ như khá hữu ích như là một hàm để minh họa các phương tiện để kiểm tra các giá trị trong các ô theo kiểu được sắp xếp.

Chỉ cần tưởng tượng nó là một mảng 2d sắp xếp và áp dụng logic tương tự để lặp qua các ô.

7
betelgeuce

Nếu bạn chỉ cần nhìn vào các ô đang sử dụng, bạn có thể sử dụng:

sub IterateCells()

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

End Sub

sẽ đánh vào mọi thứ trong phạm vi từ A1 đến ô cuối cùng có dữ liệu (ô dưới cùng bên phải)

56
cori

Nếu bạn chỉ nhìn vào các giá trị của các ô, bạn có thể lưu trữ các giá trị trong một mảng của loại biến thể. Dường như việc nhận được giá trị của một phần tử trong một mảng có thể nhanh hơn nhiều so với tương tác với Excel, vì vậy bạn có thể thấy một số khác biệt về hiệu suất khi sử dụng một mảng của tất cả các giá trị ô so với việc nhận các ô đơn lẻ.

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

Sau đó, bạn có thể nhận được một giá trị ô chỉ bằng cách kiểm tra ValArray (hàng, cột)

5
Jon Fournier

Bạn có thể sử dụng một For Each để lặp qua tất cả các ô trong một phạm vi được xác định.

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
3
theo

Đối với ứng dụng VB hoặc C #, một cách để làm điều này là sử dụng Office Interop. Điều này phụ thuộc vào phiên bản Excel bạn đang làm việc với.

Đối với Excel 2003, bài viết MSDN này là một nơi tốt để bắt đầu. Hiểu mô hình đối tượng Excel từ phối cảnh của nhà phát triển Visual Studio 2005

Về cơ bản bạn sẽ cần phải làm như sau:

  • Bắt đầu ứng dụng Excel.
  • Mở sổ làm việc Excel.
  • Lấy bảng tính từ bảng tính theo tên hoặc chỉ mục.
  • Lặp lại qua tất cả các ô trong bảng tính được truy xuất dưới dạng phạm vi.
  • Đoạn trích mẫu (chưa được kiểm tra) dưới đây cho bước cuối cùng.

    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.
        }
    }

Đối với Excel 2007, hãy thử tham chiếu MSDN này .

2
Cory Engebretson

Về cơ bản, bạn có thể lặp qua một Phạm vi

Lấy một tờ

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

Nhận Phạm vi bạn quan tâm Nếu bạn thực sự muốn kiểm tra mọi ô sử dụng giới hạn của Excel

"Lưới lớn" của Excel 2007 tăng số lượng hàng tối đa trên mỗi trang tính từ 65.536 lên hơn 1 triệu và số cột từ 256 (IV) lên 16.384 (XFD). từ đây http://msdn.Microsoft.com/en-us/l Library/aa730921.aspx # Script2007excelPerf_BigGridIncreasedLimitsExcel

và sau đó lặp qua phạm vi

        Range myBigRange = myWs.get_Range("A1", "A256");

        string myValue;

        foreach(Range myCell in myBigRange )
        {
            myValue = myCell.Value2.ToString();
        }
1
w4ik

Có một số phương pháp để thực hiện điều này, mỗi phương pháp đều có ưu điểm và nhược điểm; Đầu tiên và quan trọng nhất, bạn sẽ cần phải có một phiên bản của đối tượng Worksheet, Application.ActiveSheet hoạt động nếu bạn chỉ muốn người dùng đang xem.

Đối tượng Worksheet có ba thuộc tính có thể được sử dụng để truy cập dữ liệu ô (Ô, Hàng, Cột) và một phương thức có thể được sử dụng để lấy khối dữ liệu ô, (get_Range).

Phạm vi có thể được thay đổi kích thước và như vậy, nhưng bạn có thể cần phải sử dụng các thuộc tính được đề cập ở trên để tìm ra ranh giới của dữ liệu của bạn. Lợi thế cho Phạm vi trở nên rõ ràng khi bạn đang làm việc với lượng dữ liệu lớn vì các bổ trợ VSTO được lưu trữ bên ngoài ranh giới của chính ứng dụng Excel, vì vậy tất cả các lệnh gọi đến Excel phải được chuyển qua một lớp có phí; có được Phạm vi cho phép bạn nhận/đặt tất cả dữ liệu bạn muốn trong một cuộc gọi có thể mang lại lợi ích hiệu suất rất lớn, nhưng nó yêu cầu bạn sử dụng các chi tiết rõ ràng thay vì lặp qua từng mục.

Bài đăng trên diễn đàn MSDN này cho thấy nhà phát triển VB.Net đặt câu hỏi về việc lấy kết quả của Phạm vi dưới dạng một mảng

1
TheXenocide

Các kỹ năng VBA của tôi hơi bị rỉ sét, nhưng đây là ý tưởng chung về những gì tôi sẽ làm.
[.__.] Cách dễ nhất để làm điều này sẽ là lặp qua một vòng lặp cho mỗi cột:

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

có vẻ như cú pháp tô sáng màu không giống vba, nhưng hy vọng điều này sẽ giúp ích phần nào (ít nhất là cung cấp cho bạn một điểm khởi đầu để làm việc).

  • Râu
0
Brisketeer

Trong Excel VBA, hàm này sẽ cung cấp cho bạn nội dung của bất kỳ ô nào trong bất kỳ trang tính nào.

Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
    getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function

Vì vậy, nếu bạn muốn kiểm tra giá trị của các ô, chỉ cần đặt hàm vào một vòng lặp, cung cấp cho nó tham chiếu đến bảng tính bạn muốn và chỉ mục hàng và chỉ mục cột của ô. Cả chỉ mục hàng và chỉ mục cột đều bắt đầu từ 1, có nghĩa là ô A1 sẽ là ws.Cells (1,1), v.v.

0
Martin08