2010-03-06 2 views
6

У меня есть 3 массива данных, которые заполняются считыванием листа excel, некоторые из точек данных отсутствуют и как таковые только что были введены в excel как «NA», поэтому я хочу просмотрите мой массив и найдите каждый экземпляр этих NA и удалите их из массива, поскольку информация бесполезна. Мне нужно одновременно обновить все три массива.Редублирующие массивы в 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 

Так что, если я нахожу «NA» в качестве одного из значений в икре или ICAP я хочу, чтобы избавиться от этой части данных во всех там массивах.

+0

Пожалуйста, обратите внимание на назначение всего массива массивам вместо повторения. Детали будут зависеть от вашего листа, но он будет _much_ быстрее. –

ответ

1

Я бы даже не включил «NA» в первую очередь при построении массивов. Вот ваш код, но он изменился, чтобы не включать «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

Примечание: Я написал этот код в Блокноте.
Сообщите мне, если у вас возникнут проблемы с этим.

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

Просто чтобы быть ясно, я предполагаю, что у вас есть список стран, в диапазоне C1, а затем связанную икра и значение ICAP в диапазонах AP1 и ВМ1. Проблема в том, что некоторые из косули и iCap отсутствуют, и они были введены как «NA». Вы хотели бы создать массивы, которые содержат только страны, где есть икра и значение iCap.

Во-первых, использование Redim Preserve является «дорогой» операцией и будет влиять на эффективность кода.

Во-вторых, как и в стороне, используя синтаксис, как в вашем коде (ниже), установите только конечную переменную в String. Первые два будет создана переменная типа Variant:

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

Этот код должен быть написан как:

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

С точки зрения вашего вопроса, мой подход будет выглядеть следующим образом:

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 

Надеюсь, что это поможет.

Смежные вопросы