Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA中的偏移解决方法_Vba_Excel_Accounting - Fatal编程技术网

Excel VBA中的偏移解决方法

Excel VBA中的偏移解决方法,vba,excel,accounting,Vba,Excel,Accounting,我正在尝试将会计日记账分录自动过账到分类账中,并且在添加新行后正在努力进行抵销。我的工作簿有两张表,日记账和分类账,我的目标是阅读每个日记账分录,并通过添加新行将分录添加到分类账中正确的T账户中。大多数复制条目都可以工作,但一旦偏移量发生变化,宏就会出现问题。我正在考虑使用.Find作为更好的选择,因为不同的T账户需要不同的抵消值,这取决于之前的账户数量。如何解决此偏移行问题 这里是指向的链接,下面是我在VBA中的代码 Sub RowInsert() Dim offset As Integer

我正在尝试将会计日记账分录自动过账到分类账中,并且在添加新行后正在努力进行抵销。我的工作簿有两张表,日记账和分类账,我的目标是阅读每个日记账分录,并通过添加新行将分录添加到分类账中正确的T账户中。大多数复制条目都可以工作,但一旦偏移量发生变化,宏就会出现问题。我正在考虑使用
.Find
作为更好的选择,因为不同的T账户需要不同的抵消值,这取决于之前的账户数量。如何解决此偏移行问题

这里是指向的链接,下面是我在VBA中的代码

Sub RowInsert()

Dim offset As Integer
offset = 0

Dim counter As Integer
For counter = 0 To 1

Dim account As String
account = Worksheets("Journal").Cells(counter + 2, 2)


Dim a As Double

If Worksheets("Journal").Cells(counter + 2, 2) = "Cash" Then
Worksheets("Ledger").Rows(4 + offset).Insert Shift:=xlDown

offset = offset + 1

Worksheets("Ledger").Cells(6 + offset, 1).Value = Worksheets("Journal").Cells(counter + 2, 1).Value

    If Worksheets("Journal").Cells(counter + 2, 3).Value = Null Then
    Worksheets("Ledger").Cells(6 + offset, 3).Value = Worksheets("Journal").Cells(counter + 2, 4).Value
    Else
    Worksheets("Ledger").Cells(6 + offset, 2).Value = Worksheets("Journal").Cells(counter + 2, 3).Value
    End If

ElseIf Worksheets("Journal").Cells(counter + 2, 2) = "Equipment" Then
Worksheets("Ledger").Rows(8 + offset).Insert Shift:=xlDown

offset = offset + 1

Worksheets("Ledger").Cells(6 + offset, 1).Value = Worksheets("Journal").Cells(counter + 2, 1).Value

    If Worksheets("Journal").Cells(counter + 2, 3).Value = Null Then
    Worksheets("Ledger").Cells(6 + offset, 3).Value = Worksheets("Journal").Cells(counter + 2, 4).Value
    Else
    Worksheets("Ledger").Cells(6 + offset, 2).Value = Worksheets("Journal").Cells(counter + 2, 3).Value
    End If

End If
Next counter
End Sub
编辑。如果我要寻找
范围。查找
解决方案,我如何访问此范围/单元格结果?现在我得到了“运行时错误'91':未设置对象变量或With block变量”


对您编辑的问题的回答:

您收到的错误是因为
.Find
没有找到任何内容,并且返回了
Nothing
。尝试访问
Nothing
的属性将出现“对象变量或未设置块变量”错误

.Find
不能很好地处理合并的单元格。在您的案例中,最简单的解决方案是扩展搜索范围,使其包括整个合并单元格

Dim Header As Range
Dim lastRow As Long

With Worksheets("Ledger").Columns("A:C")

    Set Header = .Find("Cash")
    lastRow = Header.Row + entries
    'I would prefer something like
    'lastRow = Worksheets("Ledger").Cells(Header.Row, "B").End(xlDown).Row (not tested)

    Rows(lastRow).Insert Shift:=xlDown

    Worksheets("Ledger").Cells(lastRow, 1) = Worksheets("Journal").Cells(counter + 2, 1).Value
End With

我更改了row变量的名称,因此属性
row
和变量
row
之间没有混淆。您可以看到,VBE在将属性设置为小写时已经混淆了。

回答您编辑的问题:

您收到的错误是因为
.Find
没有找到任何内容,并且返回了
Nothing
。尝试访问
Nothing
的属性将出现“对象变量或未设置块变量”错误

.Find
不能很好地处理合并的单元格。在您的案例中,最简单的解决方案是扩展搜索范围,使其包括整个合并单元格

Dim Header As Range
Dim lastRow As Long

With Worksheets("Ledger").Columns("A:C")

    Set Header = .Find("Cash")
    lastRow = Header.Row + entries
    'I would prefer something like
    'lastRow = Worksheets("Ledger").Cells(Header.Row, "B").End(xlDown).Row (not tested)

    Rows(lastRow).Insert Shift:=xlDown

    Worksheets("Ledger").Cells(lastRow, 1) = Worksheets("Journal").Cells(counter + 2, 1).Value
End With

我更改了row变量的名称,因此属性
row
和变量
row
之间没有混淆。您可以看到,VBE在将属性设置为小写时已经混淆了。

。如果您需要将帐户置于彼此之下,则Find
听起来是个不错的主意。查看
.End(xlDown)
方法。找到第一行后,它将帮助您找到帐户的最后一行。我如何防止
.End(xlDown)
继续到它下面的下一个帐户?我假设帐户之间至少有一个空行
.End(xlDown)
在那里停止(如果应用于非空单元格),这就是为什么不应该使用它来查找列中的最后一行。
.find
听起来是一个好主意,如果您需要将帐户放在彼此下面。查看
.End(xlDown)
方法。找到第一行后,它将帮助您找到帐户的最后一行。我如何防止
.End(xlDown)
继续到它下面的下一个帐户?我假设帐户之间至少有一个空行
.End(xlDown)
在那里停止(如果应用于非空单元格),这就是为什么不应使用它查找列中最后一行的原因。