【发布时间】:2014-08-03 00:11:22
【问题描述】:
这是我在 Excel 中尝试做的事情。
简单地说,我正在尝试获取一个二维数组,(1) 将其转换为一维数组,(2) 循环遍历一维数组,(3) 将任何不是特定字符串的值复制到新数组, 和 (4) 然后将新的、修剪过的一维数组写入特定列。
更复杂地说,我正在尝试取两个二维数组,将它们都转换为匹配的一维数组,循环遍历它们,但仅将基于其中一个数组的内容复制到两个不同的数组中,然后编写新的数组分成两个不同的列(没有解释得那么好......)
凭借我在网上找到的基本 VBA 知识,我设法编写了一些代码来完成 (1)、(2) 和 (4)。我遇到的问题是(3)。我似乎无法让它跳过特定的单元格。
有人对如何做到这一点有任何建议吗?
下面是我拼凑的代码。请注意,这是我编写的第一个代码,所以我猜测有更简单、更优雅的方法可以做到这一点;我做了对我有用的事情。任何关于调整的建议将不胜感激!
Sub Calculating()
'Transforming 2D Arrays into 1D Arrays
'Defining the arrays
Dim InputNameArray() As Variant 'Input Names (strings)
Dim InputValueArray() As Variant 'Input Values (numbers)
Dim InputArrayR As Long 'Old Array Row
Dim InputArrayC As Long 'Old Array Column
Dim OldArrayP As Long 'Old Array Position
Dim OldNameArray() As Variant 'One Dimensional Names
Dim OldValueArray() As Variant 'One Dimensional Values
InputNameArray = Range("B3:M10")
InputValueArray = Range("B27:M34")
OldArrayP = 0 'Old Array One Dimensional Position
For InputArrayR = 1 To UBound(InputNameArray, 1)
For InputArrayC = 1 To UBound(InputNameArray, 2)
ReDim Preserve OldNameArray(0 To OldArrayP)
OldNameArray(OldArrayP) = InputNameArray(InputArrayR, InputArrayC)
ReDim Preserve OldValueArray(0 To OldArrayP)
OldValueArray(OldArrayP) = InputValueArray(InputArrayR, InputArrayC)
Debug.Print OldArrayP; OldNameArray(OldArrayP), OldValueArray(OldArrayP)
OldArrayP = OldArrayP + 1
Next InputArrayC
Next InputArrayR
'Scanning through 1D Arrays to Eliminate Specific Values
'Defining New Arrays
Dim NewNameArray() As Variant 'New Name Array (Strings)
Dim NewValueArray() As Variant 'New Value Array (Numbers)
Dim NewArrayP As Long 'New Array Position
Dim OldArrayPosition As Long 'Old Array Position
NewArrayP = 0
For OldArrayPosition = LBound(OldNameArray) To UBound(OldNameArray)
If OldNameArray(OldArrayPosition) <> "Blank" Or OldNameArray(OldArrayPosition) <> "Standard-100" Or OldNameArray(OldArrayPosition) <> "Standard-50" Or OldNameArray(OldArrayPosition) <> "Standard-25" Or OldNameArray(OldArrayPosition) <> "Standard-12.5" Or OldNameArray(OldArrayPosition) <> "Standard-6.25" Or OldNameArray(OldArrayPosition) <> "Standard-3.125" Or OldNameArray(OldArrayPosition) <> "Standard-1.5625" Or OldNameArray(OldArrayPosition) <> "Standard-0.7825" Then
ReDim Preserve NewNameArray(0 To NewArrayP)
NewNameArray(NewArrayP) = OldNameArray(OldArrayPosition)
ReDim Preserve NewValueArray(0 To NewArrayP)
NewValueArray(NewArrayP) = OldValueArray(OldArrayPosition)
Debug.Print OldArrayPosition, OldNameArray(OldArrayPosition), OldValueArray(OldArrayPosition)
Debug.Print NewArrayP, NewNameArray(NewArrayP), NewValueArray(NewArrayP)
NewArrayP = NewArrayP + 1
End If
Next OldArrayPosition
'Outputing Values
'Defining Variables
Dim OutputPosition As Long 'Output Array Position
Dim OutputRow As Long 'Output Row
OutputRow = 3
For OutputPosition = LBound(NewNameArray) To UBound(NewNameArray)
Cells(OutputRow, "O").Value = NewNameArray(OutputPosition)
Cells(OutputRow, "Q").Value = NewValueArray(OutputPosition)
Debug.Print OutputRow, OutputPosition, NewNameArray(OutputPosition), NewValueArray(OutputPosition)
OutputRow = OutputRow + 1
Next OutputPosition
'Cleaning Up
Erase InputNameArray
Erase InputValueArray
Erase OldNameArray
Erase OldValueArray
Erase NewNameArray
Erase NewValueArray
End Sub
【问题讨论】:
-
无论何时处理动态数据,我都建议使用集合或字典。 msdn.microsoft.com/en-us/library/a1y8b3b3%28v=vs.90%29.aspx