在VBA中调整数组

我有3个数据的数组,通过读取excel表格填充,一些数据点丢失,因此刚刚进入excel作为“NA”,所以我想通过我的数组,查找每个这些NA的实例,并从arrays中删除,因为信息是无用的。 我需要同时更新所有三个数组。

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”作为roe或iCap中的值之一,我想摆脱所有数组中的那块数据。

在构buildarrays时,我甚至不会将“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 

注:我已经在记事本中写了这段代码。
如果您遇到任何问题,请告诉我。

 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 

为了清楚起见,我假设你有范围C1中的国家列表,然后在范围AP1和BM1中关联roe和iCap值。 一些roe和iCap entires缺失并被input为“NA”的问题。 您想要创build仅包含具有roe iCap值的国家的数组。

首先,使用Redim Preserve是一个“昂贵的”操作,会影响代码的效率。

其次,另一方面,在代码中使用语法(如下)只会将最终variables设置为String。 前两个将被创build为variablestypesVariant:

 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 

希望这可以帮助。