VBA-重复数据的范围选择

时间:2018-09-06 14:06:16

标签: excel vba

我有以下数据表: https://ethercalc.org/zeacfw3jskc3

此数据的重要之处在于每一列重复两次,一次重复用于A型数据,一次重复于B型数据。如果第一组列中没有数据(直到修订),我想使用第二列来创建范围,而不是使代码失败。这是尝试这样做的代码:

Set w1 = wbk.Sheets("PositionsDB")
Set w2 = wbk.Sheets("Performance")
num_rows = w1.Cells(Rows.Count, 1).End(xlUp).row
'If there's no parentName column, we can't continue.
If w1.Rows(1).Find("portfolioName") Is Nothing Then Exit Sub

'find first instance
Set f1 = w1.Rows(1).Find("portfolioName", lookat:=xlWhole)
If Not f1 Is Nothing Then
    'find second instance
    Set f2 = f1.Offset(0, 1).Resize(1, w1.Columns.Count - f1.Column).Find("portfolioName", lookat:=xlWhole)
    If Not f2 Is Nothing Then
        'set range based on f2
        Set parentRange = w1.Range(f2.Offset(1, 0), w1.Cells(Rows.Count, f2.Column).End(xlUp))

    End If
End If
'If there's no Root level, how do we know where to start?
If parentRange.Find("Main") Is Nothing Then Exit Sub

Debug.Print "test1"
Debug.Print parentRange.Width
Debug.Print parentRange.Height
Debug.Print "test2"

For Each parent In parentRange
    If Not dict.Exists(parent.Value) Then
        childCount = Application.WorksheetFunction.CountIf(parentRange, parent.Value)
        Set childrenRange = parent.Offset(, 2).Resize(childCount, 1)
        dict.Add parent.Value, Application.Transpose(Application.Transpose(childrenRange.Value))
    End If
Next

但是,当我使用工作表中的数据运行它时,出现以下错误:

Variable Required - Can't assign to this expression
For Each parent In parentRange

这很奇怪,因为我得到了这个异常,而没有任何Debug.Prints显示在立即控制台中。我的代码有问题吗?

2 个答案:

答案 0 :(得分:2)

Parent是保留字。对象的Parent属性是指该对象的父对象,例如Range对象具有Worksheet父对象,而Worksheet对象具有Workbook父对象。

错误:

  

需要变量-无法分配给该表达式

之所以会发生变化,是因为For Each...Next需要一个用于迭代集合或数组元素的变量,而Parent不是一个变量。

使用其他名称,例如For each rng in parentRange

编辑:

请注意,此编译错误专门出现,原因是:

  1. 您尚未声明Parent,并且
  2. 由于与Parent属性的混淆,该代码无法编译-在这种情况下,Parent不是Variant的{​​strong>不是-因此”必需的变量,不能分配给该表达式。”

正如其他地方所指出的,添加Option Explicit Dim parent as Range甚至是Dim parent,将消除编译错误,但可能会产生误导,建议不要这样做。 。

答案 1 :(得分:2)

Parent未声明。因此,VBA认为它的类型为Variant。要遍历范围,您需要一个对象,而不是一个变体:

Sub TestMe()

    Dim parent As Range

    For Each parent In Range("A1:A5")
        Debug.Print parent.Address
    Next parent

End Sub

如果将parent声明为Variant,则VBA会将其立即转换为对象:

enter image description here

为避免所有此类问题,请确保模块/工作表/类的顶部始终有Option Explicit

再考虑一下,命名变量parent确实不是一个好主意,但是可以。