2017-05-23 13 views
0

私は以下のINPUTを持っています。インデントされた階層リストを親メンバーに基づく列に分割する

私のINPUTデータには、列Aにはインデントレベルの異なるデータが含まれています。

基本的にコードはこの範囲で実行し、最も高いレベルのインデントをチェックし、最も高いレベルのインデントについてはマッピング2、3、および4の「マッピング1」ヘッダーとそれに続く下位レベルに配置する必要があります。

INPUT

OUTPUT: ファイル名を指定して実行時エラー1004:私は下記の行に私にエラーを与えているコードを開発した enter image description here

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 

答えて

0

私は、コードがどのように動作するかを正確に得ることはありませんが、私はあなたのランタイムエラーは、あなたがActiveCellにアクセスするという事実から来ていることを確信しています。新しいワークシート(アクティベートシートを取得)を追加し、ActiveCellがこのシートのA1に設定されています。 2番目のループの最初の反復で。 currValが0の場合、ActiveCell.Offset(k, currVal - 1)という語はActiveCell.Offset(0, -1)であり、これは列1にあるように実行時エラーを引き起こします。オフセット-1は使用できません。

強力なアドバイス:大きなパフォーマンス上の問題を引き起こし、デバッグするのがより困難なので、ActiveSheet,ActiveCellまたはSelectを使用しないでください。

+0

この行をどのように変更するべきですか? – Stacey

+0

私のコードが間違っていると、共有している出力が得られませんか?このコードの背後にある私のコンセプトは、2次元配列を作成し、インデントに基づいて行から列にデータを転置することです。 – Stacey

+0

このコードを修正して、必要な結果を得るように提案してください – Stacey

関連する問題