2010-03-06 21 views
6

Tengo 3 matrices de datos, que se llenan leyendo de una hoja de Excel, faltan algunos de los datos y, como tal, se han ingresado en Excel como "NA", por lo que quiero mira a través de mi matriz y encuentra cada instancia de estas NA y quítalas del conjunto, ya que la información es inútil. Necesito actualizar las tres matrices al mismo tiempo.Redimming arrays en 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 

Así que si encuentro un "NA" como uno de los valores de huevas o ICAP que quiero para deshacerse de ese pedazo de datos en todas las matrices de allí.

+0

Mire en la asignación de todo el rango a las matrices en lugar de iterar. Los detalles dependerán de su hoja, pero será _mucho_ más rápido. –

Respuesta

1

Ni siquiera incluiría el "NA" en primer lugar al construir las matrices. Aquí está su código, pero cambió para no incluir "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

Nota: He escrito este código en el Bloc de notas.
Avíseme si tiene algún problema con esto.

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

Para que quede claro, estoy asumiendo que usted tiene una lista de países en cobertura C1 y huevas entonces asociado y los valores en rangos ICAP AP1 y BM1. El problema de que algunas de las entradas de hue y iCap faltan y se han ingresado como 'NA'. Desea crear matrices que contengan solo países donde exista un valor de huella y iCap.

En primer lugar, utilizar Redim Preserve es una operación 'costosa' e impactará la eficiencia del código.

En segundo lugar, como un lado, el uso de la sintaxis como en su código (a continuación) solo establecerá la variable final en Cadena. Los dos primeros se creará como tipo Variant variables:

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

Este código debe ser escrito como:

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

En términos de su problema, mi enfoque sería la siguiente:

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 

Espero que esto ayude.