从试算表数据中填充资产负债表的VBA代码

时间:2014-12-07 22:32:11

标签: excel vba

下午好,伙计们,

我是很长时间的读者,但是第一次发布海报。我正在做一个项目,要求我在Excel中获取试算平衡数据,并将这些数据格式化为资产负债表"。

基本上我将试算表数据放在一个工作表("数据")中,将资产负债表模板放在另一个工作表中("资产负债表")

我需要将资产负债表从("数据")表填充到("资产负债表")。我无法绕过如何做到这一点

我记录的第一个宏根据账号格式化试算表数据,第二个宏将每组账户汇总在一起(例如,所有现金账户在资产负债表中的一行汇总在一起)。

但是我无法使这段代码变得强大而灵活,目前它很难编码到资产负债表中的值。如何使这段代码变得灵活,以便正确填充(例如,如果我向现金组添加了另一个"现金"帐户,它会将该金额添加到"现金"资产负债表中的一行)

如果需要查看,这是文件。不是很多代码所以任何帮助将不胜感激!

http://s000.tinyupload.com/?file_id=22382427361802516291

http://imgur.com/a/bYjUp

2 个答案:

答案 0 :(得分:0)

我还没有下载你的项目,但似乎你需要做的是为每种类型的帐户创建一个数组。为简单起见,假设您只有arrCash和arrLiability。然后,您将使用每个已知的gl代码填充数组。或者另一种方法是在单独的电子表格中保留gl代码列表。有趣的来了。您将遍历excel电子表格并将每个代码与数组中的元素进行比较。如果比较等于true,则将该数量添加到您的一个变量中。如果比较等于false,则创建一个例程,用于重新设置需要添加gl代码的数组,然后将该代码添加到数组中。或者添加到单独的电子表格中。将新的gl代码添加到数组后,您需要将该数量添加到它的相应变量中。完成所有计算后,您将使用变量中的疑问更新资产负债表。很容易,对吧?

答案 1 :(得分:0)

以下函数接受逗号分隔的值列表(数据表中a列的值),并将汇总数据表中与提供的值匹配的所有行。

例如:?getSum(" 10300-000,10303-000")= 433094.74

Public Function getSum(ByVal Search As String) As Double
Dim Data As Worksheet: Set Data = ThisWorkbook.Worksheets("Data")
Dim List() As String: List = Split(Search, ",")
Dim ListSize As Integer: ListSize = UBound(List)
Dim Values() As Variant
Dim Row As Integer
Dim Rows As Integer
Dim Match As Integer
Dim Matched As Boolean

Dim Result As Double: Result = 0

Rows = Data.Range("A" & Data.Rows.Count).End(xlUp).Row
Values = Data.Range("A1", "C" & Rows).Value2

Row = 1

Do
    Matched = False
    For Match = 0 To ListSize
        If Values(Row, 1) = List(Match) Then
            Matched = True
            Exit For
        End If
    Next Match

    If Matched = True Then
        Result = Result + CDbl(Values(Row, 3))
    End If

    If Row >= Rows Then
        Exit Do
    Else
        Row = Row + 1
    End If
Loop

getSum = Result

End Function

已更新以允许帐户范围而非列表

Public Function getSum2(ByVal sFirst As String, ByVal sLast As String) As Double
Dim Data As Worksheet: Set Data = ThisWorkbook.Worksheets("Data")
Dim Values() As Variant
Dim Row As Integer
Dim Rows As Integer
Dim First As Long: First = CLng(Left(sFirst, 5))
Dim Test As Long
Dim Last As Long: Last = CLng(Left(sLast, 5))
Dim Result As Double: Result = 0

Rows = Data.Range("A" & Data.Rows.Count).End(xlUp).Row
Values = Data.Range("A1", "C" & Rows).Value2

Row = 1

Do
    Test = CLng(Left(Values(Row, 1), 5))

    If Test >= First And Test <= Last Then
        Result = Result + CDbl(Values(Row, 3))
    End If

    If Row >= Rows Then
        Exit Do
    Else
        Row = Row + 1
    End If
Loop

getSum2 = Result

End Function