Arrays Excel VBA:从现有数组生成新数组,但跳过特定字符串
下面是我在Excel中尝试做的事情 简单地说,我试图获取一个2D数组,(1)将其转换为1D数组,(2)循环1D数组,(3)将任何非特定字符串的值复制到一个新数组,(4)然后将新的、经过修剪的1D数组写入一个特定列 更复杂的是,我尝试使用两个2D数组,将它们转换为匹配的1D数组,循环使用它们,但只将基于其中一个数组的内容复制到两个不同的数组中,然后将新数组写入两个不同的列(没有很好地解释这一点…) 利用我在网上所能找到的基本VBA知识,我设法编写了一些代码,完成了(1)、(2)和(4)。我遇到的问题是(3)。我似乎无法让它跳过特定的单元格 有人对如何做到这一点有什么建议吗 下面是我拼凑的代码。事先警告一下,这是我写的第一个代码,所以我猜有更简单、更优雅的方法来实现这一点;我做了对我有用的事。任何关于调整的建议都将不胜感激Arrays Excel VBA:从现有数组生成新数组,但跳过特定字符串,arrays,vba,excel,Arrays,Vba,Excel,下面是我在Excel中尝试做的事情 简单地说,我试图获取一个2D数组,(1)将其转换为1D数组,(2)循环1D数组,(3)将任何非特定字符串的值复制到一个新数组,(4)然后将新的、经过修剪的1D数组写入一个特定列 更复杂的是,我尝试使用两个2D数组,将它们转换为匹配的1D数组,循环使用它们,但只将基于其中一个数组的内容复制到两个不同的数组中,然后将新数组写入两个不同的列(没有很好地解释这一点…) 利用我在网上所能找到的基本VBA知识,我设法编写了一些代码,完成了(1)、(2)和(4)。我遇到的问
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
子计算()
'将二维阵列转换为一维阵列
'定义数组
Dim InputNameArray()作为变量的输入名称(字符串)
Dim InputValueArray()作为变量的输入值(数字)
Dim InputArrayR为“长”旧数组行
Dim INPUTRARYC作为“长”旧数组列
Dim OldArrayP作为“长”旧阵列位置
Dim OldNameArray()作为变量“一维名称”
Dim OldValueArray()作为变量“一维值”
InputNameArray=范围(“B3:M10”)
InputValueArray=范围(“B27:M34”)
OldArrayP=0'旧数组一维位置
对于InputArrayR=1到UBound(InputNameArray,1)
对于InputArray=1到UBound(InputNameArray,2)
ReDim保留OldNameArray(0到OldArrayP)
OldNameArray(OldArrayP)=InputNameArray(InputArrayR,InputArrayC)
ReDim保留OldValueArray(0到OldArrayP)
OldValueArray(OldArrayP)=InputValueArray(InputArrayR,InputArrayC)
调试。打印OldArrayP;OldNameArray(OldArrayP)、OldValueArray(OldArrayP)
OldArrayP=OldArrayP+1
下一个输入阵列
下一次输入
'扫描一维数组以消除特定值
'定义新数组
Dim NewNameArray()作为变量的新名称数组(字符串)
Dim NewValueArray()作为变量的新值数组(数字)
Dim NewArrayP作为“长”新阵列位置
Dim OldArrayPosition与Long“旧阵列位置”相同
NewArrayP=0
对于OldArrayPosition=LBound(OldNameArray)到UBound(OldNameArray)
如果OldNameArray(OldArrayPosition)“空白”或OldNameArray(OldArrayPosition)“标准-100”或OldNameArray(OldArrayPosition)“标准-50”或OldNameArray(OldArrayPosition)“标准-25”或OldNameArray(OldArrayPosition)“标准-12.5”或OldNameArray(OldArrayPosition)“标准-6.25”或OldNameArray(OldArrayPosition)“标准-1.5625”或OldNameArray(OldArrayPosition)“标准-0.7825”
ReDim保留NewNameArray(0到NewArrayP)
NewNameArray(NewArrayP)=OldNameArray(OldArrayPosition)
ReDim保留NewValueArray(0到NewArrayP)
NewValueArray(NewArrayP)=OldValueArray(OldArrayPosition)
调试。打印OldArrayPosition、OldNameArray(OldArrayPosition)、OldValueArray(OldArrayPosition)
调试。打印NewArrayP、NewNameArray(NewArrayP)、NewValueArray(NewArrayP)
NewArrayP=NewArrayP+1
如果结束
下一个旧阵列位置
'输出值
“定义变量
Dim OutputPosition作为“长”输出阵列位置
Dim OutputRow作为“长”输出行
输出流量=3
对于OutputPosition=LBound(NewNameArray)到UBound(NewNameArray)
单元格(OutputRow,“O”)。值=新名称数组(OutputPosition)
单元格(OutputRow,“Q”)。值=新值数组(OutputPosition)
调试。打印OutputRow、OutputPosition、NewNameArray(OutputPosition)、NewValueArray(OutputPosition)
OutputRow=OutputRow+1
下一个输出位置
“清理
擦除InputNameArray
擦除InputValueArray
擦除旧名称数组
擦除OldValueArray
擦除新名称数组
擦除新值数组
端接头
您的代码非常符合逻辑。错误是在If语句中使用或;将这些切换到和,代码应该可以工作
您可以避免操纵所有这些数组,可能类似于以下内容。我命名了输入范围,以便更容易地调整它们的大小。如果您喜欢,您可能希望对输出范围执行相同的操作
虽然我知道这是相当标准的VBA实践,但我真的,真的不喜欢流控制这样的异常,因此存在冗长的方法;您可能更喜欢上面提到的备选方案。(对于如此小的数据集,这对性能没有影响)
最后,我有点懒了。例如,网上有很多“最佳实践”资源,您可能想通读一下
选项显式
私有函数以布尔形式存在(ByRef col作为集合,ByRef key作为变量)
暗淡的Iter
对于Iter=1至列计数
如果键=列项(Iter),则
存在=真
退出功能
如果结束
下一个Iter
存在=错误
端函数
子计算()
Dim NamesToSkip As集合
Dim名称数组作为范围
Dim ValueArray作为范围
Dim OutputRange As范围
模糊的行和长的行一样
将列设置为等长
暗排一样长
暗柱一样长
暗淡的Iter
Set NamesToSkip=新集合
NamesToSkip。添加“空白”
NamesToSkip.添加“标准-100”
NamesToSkip.添加“标准-50”
NamesToSkip.添加“标准-25”
NamesToSkip.添加“标准-12.5”
NamesToSkip.添加“标准-6.25”
NamesToSkip.添加“标准-3.125”
NamesToSkip.添加“标准-1.5625”
NamesToSkip.添加“标准-0.7825”
设置名称数组=范围(“输入名称”)
设置值数组=范围(“输入值”)
设置输出范围=范围(“O3
Option Explicit
Private Function Exists(ByRef col As Collection, ByRef key As Variant) As Boolean
Dim Iter As Long
For Iter = 1 To col.Count
If key = col.Item(Iter) Then
Exists = True
Exit Function
End If
Next Iter
Exists = False
End Function
Sub Calculating()
Dim NamesToSkip As Collection
Dim NameArray As Range
Dim ValueArray As Range
Dim OutputRange As Range
Dim Rows As Long
Dim Columns As Long
Dim Row As Long
Dim Column As Long
Dim Iter As Long
Set NamesToSkip = New Collection
NamesToSkip.Add "Blank"
NamesToSkip.Add "Standard-100"
NamesToSkip.Add "Standard-50"
NamesToSkip.Add "Standard-25"
NamesToSkip.Add "Standard-12.5"
NamesToSkip.Add "Standard-6.25"
NamesToSkip.Add "Standard-3.125"
NamesToSkip.Add "Standard-1.5625"
NamesToSkip.Add "Standard-0.7825"
Set NameArray = Range("InputNames")
Set ValueArray = Range("InputValues")
Set OutputRange = Range("O3")
Rows = NameArray.Rows.Count
Columns = NameArray.Columns.Count
If Rows <> ValueArray.Rows.Count Or Columns <> ValueArray.Columns.Count Then
Err.Raise vbObjectError + 513, "Calculating()", "Mismatched sizes of input arrays"
End If
Iter = 1
For Row = 1 To Rows
For Column = 1 To Columns
If Not Exists(NamesToSkip, NameArray.Cells(Row, Column)) Then
OutputRange.Cells(Iter, 1) = NameArray.Cells(Row, Column)
OutputRange.Cells(Iter, 3) = ValueArray.Cells(Row, Column)
Iter = Iter + 1
End If
Next Column
Next Row
Set NamesToSkip = Nothing
End Sub