根据父成员

时间:2017-05-23 06:27:28

标签: vba

我有下面提到的INPUT,我想在输出头下面得到输出。

在我的列A中的INPUT数据中包含具有不同缩进级别的数据。

基本上代码应该在这个范围内运行并检查最高级别的缩进,并且对于每个最高级别的缩进,它应该放在"映射1和#34;标题及其在映射2,3和4中的后续较低级别。

INPUT

输出: enter image description here

我开发了一个代码,它在下面提到的行上给出了错误: 运行时错误1004:

    If currVal > arr(i, 3) Then
        ActiveCell.Offset(k, arr(i, 3) - 1).Value = arr(i, 1)
        End If

整体守则: -

Sub transposerowcolmulti()

 Dim arr(1 To 8, 0 To 3) As Variant
 Dim i As Long, j As Long

 ActiveWorkbook.Sheets("Input").Activate

 For i = LBound(arr, 1) To UBound(arr, 1)

        arr(i, 1) = range("A6").Offset(i, 0).Value
        arr(i, 2) = IsBold(range("A6").Offset(i, 0))
        arr(i, 3) = Level(range("A6").Offset(i, 0))

        Next i
 Dim k As Long, l As Long
       Dim prevVal As Long, currVal As Long


    k = 0
    l = 0

        ActiveWorkbook.Worksheets.Add
        For i = LBound(arr, 1) To UBound(arr, 1)

            If l = 0 Then
                currVal = arr(i, 3)
                l = l + 1
            End If

            If currVal = arr(i, 3) Then
                ActiveCell.Offset(k, currVal - 1).Value = arr(i, 1)
                End If

            If currVal > arr(i, 3) Then
                ActiveCell.Offset(k, arr(i, 3) - 1).Value = arr(i, 1)
                End If

            If currVal < arr(i, 3) Then
                ActiveCell.Offset(k, arr(i, 3) - 1).Value = arr(i, 1)
                End If

             currVal = arr(i, 3)
             k = i
                Next i


End Sub

Function Level(Optional cCell As range)
' LEVEL returns the outline level of the current row. It will not automatically update and therefore
'   a recalculation Ctrl-Alt-F9 is required.

    If cCell Is Nothing Then
        Set cCell = Application.Caller
    End If
    Level = cCell.Rows.IndentLevel

End Function

Function IsBold(ByVal Cell As range) As Boolean

IsBold = Cell.Font.Bold

End Function

1 个答案:

答案 0 :(得分:0)

虽然我不知道代码应该如何运作,但我很确定您的运行时错误来自您访问ActiveCell的事实。您添加一个新的工作表(获取活动表),ActiveCell设置为此工作表的A1。在第二个循环的第一次迭代中。 currVal为0,术语ActiveCell.Offset(k, currVal - 1)ActiveCell.Offset(0, -1),这会导致运行时错误,因为您在第1列中 - 无偏移-1可能。

强烈建议:不要使用ActiveSheetActiveCellSelect因为它们会导致严重的性能问题,并且更难以调试。