VBA:如何处理Oracle的Stock Reports
Background:
在Oracle EBS中可以导出很多的Reports。其中我经常会使用到Inventory>Reports>On-Hand的数据。
这个数据比Discoverer导出库存数据要准确。也比用查询后File>export仅导出某个Subinventory要好。
但是报表导出后是几十页很长的,难以使用的分页报表,不是我们熟悉的二维关系数据表。
Objective:
我们需要一张这样的报表:可以清晰看到Org下每个库位的库存情况,现时的库存数量,位置等信息。
Procedure:
1,使用Excel打开Oracle EBS下载的报表。并调整分隔符的位置。具体的不同公司可能位置不一样,但是原理是一致的。
Tips:编码最好是Unicode-8,这个兼容性最好。
2,导入Excel后,可能会有很多空格,我们先删除空格行:
当然,如果计算机运行很慢,那么直接用Excel的筛选-删除空白行也是可以的。千万别排序!
Sub Delete_Blank()
Dim a, b As Long
a = ActiveSheet.UsedRange.Rows.Count
For b = a To 1 Step -1
If Worksheets.Application.CountA(Rows(b)) = 0 Then
Rows(b).Delete
End If
Next b
End Sub
3,然后,我们在A列前插入一列,并用代码把Subinventory后的具体库位自动填到每个物料的前面:
Sub Sub_Stock()
Columns("A:A").Select
Selection.Insert Shift:=xlToRight 'A列向右移动
Dim I, j, m As Integer
Dim c As Range
Dim str As String
j = ActiveSheet.UsedRange.Rows.Count
For I = 1 To j
If Left(Cells(I, 2).Value, 12) = "Subinventory" Then
str = Mid(Cells(I, 2).Value, 14, 12)
m = 1
Do
Cells(I + m, 1) = str
m = m + 1
Loop While Left(Cells(I + m, 2).Value, 12) <> "Subinventory" And (I + m) <= j
End If
Next I
End Sub
4,最后,把不是物料的行全部删除,并把第一行的Title填好:
Sub del()
Dim I, j, m As Integer
j = ActiveSheet.UsedRange.Rows.Count
For I = j To 1 Step -1
If Cells(I, 6) = "UOM" Or Cells(I, 6) = "" Or Mid(Cells(I, 6), 2, 1) = "-" Or Mid(Cells(I, 6), 3, 1) = "-" Then
Rows(I).Delete
End If
Next I
Rows("1:1").Select
Selection.Insert Shift:=xlTodown
Cells(1, 1) = "Subinventory"
Cells(1, 2) = "Item"
Cells(1, 3) = "Description"
Cells(1, 4) = "Rev"
Cells(1, 5) = "Locator"
Cells(1, 6) = "UOM"
Cells(1, 7) = "Quantity"
End Sub
最终得到的表格就可以直接被Excel和Access使用了。