Arrays Excel VBA:从现有数组生成新数组,但跳过特定字符串

Arrays Excel VBA:从现有数组生成新数组,但跳过特定字符串,arrays,vba,excel,Arrays,Vba,Excel,下面是我在Excel中尝试做的事情 简单地说,我试图获取一个2D数组,(1)将其转换为1D数组,(2)循环1D数组,(3)将任何非特定字符串的值复制到一个新数组,(4)然后将新的、经过修剪的1D数组写入一个特定列 更复杂的是,我尝试使用两个2D数组,将它们转换为匹配的1D数组,循环使用它们,但只将基于其中一个数组的内容复制到两个不同的数组中,然后将新数组写入两个不同的列(没有很好地解释这一点…) 利用我在网上所能找到的基本VBA知识,我设法编写了一些代码,完成了(1)、(2)和(4)。我遇到的问

下面是我在Excel中尝试做的事情

简单地说,我试图获取一个2D数组,(1)将其转换为1D数组,(2)循环1D数组,(3)将任何非特定字符串的值复制到一个新数组,(4)然后将新的、经过修剪的1D数组写入一个特定列

更复杂的是,我尝试使用两个2D数组,将它们转换为匹配的1D数组,循环使用它们,但只将基于其中一个数组的内容复制到两个不同的数组中,然后将新数组写入两个不同的列(没有很好地解释这一点…)

利用我在网上所能找到的基本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
子计算()
'将二维阵列转换为一维阵列
'定义数组
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