我最近开始帮助在Excel中使用Essbase / SmartView进行报告。我试图接受Essbase报告;它将我的项目层次结构的所有级别组合到一个列中 - 而是将其转换为表格。看起来Essbase没有这个功能,所以我一直试图弄清楚如何在VBA中做到这一点。下面是我尝试做的以及我的宏的示例,该宏仅适用于填充表中的项目ID和预算。我对VBA很陌生,所以我希望有人能指出我如何进入第1,2和3级的正确方向。我认为我最好的选择是某种根据前两个字符查找,例如" L2"但我感谢您提供的任何指导。
当前
+-------------+-----------------+--------------+---------+--------+
| L1 | L2 | L3 | Project | Budget |
+-------------+-----------------+--------------+---------+--------+
| L1 Division | L2 Initiative 2 | L3 Program 3 | P1200 | 150 |
| L1 Division | L2 Initiative 2 | L3 Program 3 | P1400 | 200 |
| L1 Division | L2 Initiative 2 | L3 Program 2 | P1100 | 250 |
| L1 Division | L2 Initiative 2 | L3 Program 2 | P1300 | 150 |
| L1 Division | L2 Initiative 1 | L3 Program 1 | P2200 | 300 |
| L1 Division | L2 Initiative 1 | L3 Program 1 | P2400 | 200 |
| L1 Division | L2 Initiative 1 | L3 Program 1 | P2600 | 300 |
+-------------+-----------------+--------------+---------+--------+
所需
Sub TabularView()
Dim esData As Worksheet
Dim tabView As Worksheet
Set esData = ThisWorkbook.Sheets("Sheet1")
Set tabview = ThisWorkbook.Sheets("TabularView")
rptLR = esData.Cells(Rows.Count, 1).End(xlUp).Row + 1
y = 2
For x = 9 to rptLR 'Data starts in row 9
If Left(esData.Cells(x, 1).Text, 1) = "P" Then
tabView.Cells(y,4) = esData.Cells(x,1)
tabView.Cells(y,5) = esData.Cells(x,2)
y = y + 1
End If
Next x
End Sub
当前宏
has_many :members, through: :bands
答案 0 :(得分:0)
见下面的代码,评论中的解释:
Sub TabularView()
Dim esData As Worksheet
Dim tabView As Worksheet
Set esData = ThisWorkbook.Sheets("Sheet1")
Set tabview = ThisWorkbook.Sheets("TabularView")
rptLR = esData.Cells(Rows.Count, 1).End(xlUp).Row + 1
y = 2
dim L1, L2, L3 as string
'My first suggestion is to work from the bottom up.
'This is because your data appear to be structured
'such that the details for level 1 2 and 3 only
'appear after the project code they apply to.
'(If you have any say on the structure, I would
'suggest rather reversing the order of the hierarchy
'on the sheet itself instep of looping backwards like this).
For x = rptLR to 9 step -1 'Data starts in row 9
' NOTE: Replace this series of If statements with a switch or case statement (whatever VBA has)
'The next thing to do is if you find an L, then store the name in memory so that we have it in future iterations
If Left(esData.Cells(x, 1).Text, 2) = "L1" Then
L1 = esData.Cells(x,1).value
End If
If Left(esData.Cells(x, 1).Text, 2) = "L2" Then
L2 = esData.Cells(x,1).value
End If
If Left(esData.Cells(x, 1).Text, 2) = "L3" Then
L3 = esData.Cells(x,1).value
End If
If Left(esData.Cells(x, 1).Text, 1) = "P" Then
'Finally, just use the L values we kept in memory in previous iterations
tabView.Cells(y,1) = L1
tabView.Cells(y,2) = L2
tabView.Cells(y,3) = L3
tabView.Cells(y,4) = esData.Cells(x,1)
tabView.Cells(y,5) = esData.Cells(x,2)
y = y + 1
End If
Next x
End Sub