2010-03-06 53 views
6

Tôi có 3 mảng dữ liệu, được lấp đầy bằng cách đọc ra khỏi một bảng excel, một số điểm dữ liệu bị thiếu và như vậy vừa được nhập vào excel là "NA" vì vậy tôi muốn xem qua mảng của tôi và tìm từng trường hợp của các NA này và loại bỏ chúng khỏi mảng vì thông tin là vô ích. Tôi cần phải cập nhật tất cả ba mảng cùng một lúc.Mảng đổi màu trong VBA

Sub group_data() 
    Dim country(), roe(), iCap() As String 
    Dim i As Integer 
    For i = 1 To 3357 
     country(i) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("C1").Offset(i, 0) 
     roe(i) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("AP1").Offset(i, 0) 
     iCap(i) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("BM1").Offset(i, 0) 
    Next i 
End Sub 

Vì vậy, nếu tôi thấy "NA" là một trong các giá trị trong roe hoặc iCap, tôi muốn loại bỏ phần dữ liệu đó trong tất cả các mảng.

+0

Vui lòng xem xét việc chỉ định toàn bộ phạm vi cho các mảng thay vì lặp lại. Chi tiết sẽ tùy thuộc vào trang tính của bạn, nhưng nó sẽ nhanh hơn _much_. –

Trả lời

1

Tôi thậm chí sẽ không bao gồm "NA" ngay từ đầu khi tạo mảng. Đây là mã của bạn, nhưng đã thay đổi thành không bao gồm "NA".

Sub group_data() 

Dim country() As String 
ReDim country(0) 
Dim roe() As String 
ReDim roe(0) 
Dim iCap() As String 
ReDim iCap(0) 

Dim i As Integer 
Dim increment1, increment2, increment3 As Integer 
increment1 = 0 
increment2 = 0 
increment3 = 0 

For i = 1 To 3357 
    If Not Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("C1").Offset(i, 0) = "NA" Then 
     ReDim Preserve country(UBound(country) + 1) 
     country(increment1) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("C1").Offset(i, 0) 
     increment1 = increment1 + 1 
    End If 

    If Not Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("AP1").Offset(i, 0) = "NA" Then 
     ReDim Preserve roe(UBound(roe) + 1) 
     roe(increment2) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("AP1").Offset(i, 0) 
     increment2 = increment2 + 1 
    End If 

    If Not Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("BM1").Offset(i, 0) = "NA" Then 
     ReDim Preserve iCap(UBound(iCap) + 1) 
     iCap(increment3) = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("BM1").Offset(i, 0) 
     increment3 = increment3 + 1 
    End If 

Next i 

End Sub 
3

Lưu ý: Tôi đã viết mã này trong Notepad.
Hãy cho tôi biết nếu bạn gặp phải bất kỳ sự cố nào với vấn đề này.

Sub group_data() 
dim totalRows as integer 
dim rowNum as integer 
dim rowsWithoutNA as integer 

dim c1Range as Range 
dim ap1Range as Range 
dim bm1Range as Range 

set c1Range = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("C1") 
set ap1Range = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("AP1") 
set bm1Range = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("BM1") 


Dim country(), roe(), iCap() As String 
Dim i As Integer 

totalRows = 3357 

redim country(totalRows) 
redim roe(totalRows) 
redim iCap(totalRows) 

For i = 0 To (totalRows - 1) 
    rowNum = rowNum + 1 

    roe(rowsWithoutNA) = ap1Range.Offset(rowNum, 0).Text 
    iCap(rowsWithoutNA) = bm1Range.Offset(rowNum, 0).Text 

    if (WorksheetFunction.IsNA(roe(rowNum)) _ 
     OR WorksheetFunction.IsNA(iCap(rowNum))) = False Then 
    ' use the following condition, if NA is written in text 
    'if (trim(roe(rowNum)) = "NA" OR trim(iCap(rowNum)) = "NA") Then 
     country(rowsWithoutNA) = c1Range.Offset(rowNum, 0) 
     rowsWithoutNA = rowsWithoutNA + 1 
    end if 
Next i 

redim preserve country(rowsWithoutNA) 
redim preserve roe(rowsWithoutNA) 
redim preserve iCap(rowsWithoutNA) 

end sub 
1

Chỉ cần rõ ràng, tôi giả sử bạn có danh sách các quốc gia trong phạm vi C1 và sau đó liên kết giá trị roe và iCap trong phạm vi AP1 và BM1. Vấn đề mà một số người trong số các kẻ thù và kẻ thù bị mất tích và đã được nhập vào là 'NA'. Bạn muốn tạo các mảng chỉ chứa các quốc gia có cả giá trị iCap.

Thứ nhất, sử dụng Redim Preserve là hoạt động 'tốn kém' và sẽ ảnh hưởng đến hiệu quả của mã.

Thứ hai, như một sang một bên, sử dụng cú pháp như trong mã của bạn (bên dưới) sẽ chỉ đặt biến cuối cùng thành Chuỗi. Hai đầu tiên sẽ được tạo ra như là biến kiểu Variant:

Dim country(), roe(), iCap() As String 

Mã này sẽ được viết như sau:

Dim country() as String, roe() as String, iCap() As String 

Về vấn đề của bạn, cách tiếp cận của tôi sẽ như sau:

Sub FillArrays() 
'Define arrays 
Dim countryArray() As String, roeArray() As Variant, iCapArray() As Variant 

'Get total number of countries 
Dim totalRows As Long 
totalRows = Workbooks("restcompfirm.xls").Worksheets("Sheet1").Range("C1").End(xlDown).Row 

'Define array size based on totalRows 
ReDim countryArray(totalRows - 1) 
ReDim roeArray(totalRows - 1) 
ReDim iCapArray(totalRows - 1) 

'Define missing data text 
Dim missingData As String 
missingData = "NA" 

Dim iArray As Long 
iArray = 0 

With Workbooks("restcompfirm.xls").Worksheets("Sheet1") 

'Loop through each row and check if either roe or iCap are set to 'NA' 
For cl = 1 To totalRows 

    If Trim(.Range("AP" & cl)) <> missingData Then 
     If Trim(.Range("BM" & cl)) <> missingData Then 

      countryArray(iArray) = .Range("C" & cl) 
      roeArray(iArray) = .Range("AP" & cl) 
      iCapArray(iArray) = .Range("BM" & cl) 

      iArray = iArray + 1 
     End If 
    End If 

Next cl 

End With 

End Sub 

Hy vọng điều này sẽ hữu ích.