Я пытаюсь автоматизировать запись записей бухгалтерского учета в бухгалтерскую книгу и борюсь со смещением после добавления новых строк. В моей книге есть два листа, журнал и книга, и моя цель - прочитать каждую запись в журнале и добавить запись в правильный T-счет в книге, добавив новую строку. Большинство записей копирования работают, но макрос сталкивается с проблемами после изменения смещения. Я рассматривал возможность использования .Find
в качестве лучшего варианта, поскольку разные T-счета нуждаются в разных значениях смещения в зависимости от того, сколько предыдущих учетных записей находится над ними. Как я могу решить эту проблему смещения строк?Обходное решение в Excel VBA
Вот ссылка на Excel File, а ниже - мой код в 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
EDIT. Если бы я должен был выполнить решение Range.Find
, как я могу получить доступ к этому результату Range/cell? Прямо сейчас я получаю «Ошибка времени выполнения 91»: переменная объекта или с переменной блока не установлена ».
Sub RowInsert()
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
Dim entries As Integer
entries = 0
Dim Header As Range
Dim row As Long
With Worksheets("Ledger").Range("a1:a100")
Set Header = .Find("Cash")
` Error here when try to use the Range Header
row = Header.row + entries
Rows(row).Insert Shift:=xlDown
Cells(row, 1) = Worksheets("Journal").Cells(counter + 2, 1).Value
End With
End If
Next counter
End Sub
'.Find' звучит неплохо, если вам нужно иметь учетные записи под друг другом. Посмотрите на метод '.End (xlDown)'. Это поможет вам найти последнюю строку учетной записи, как только вы найдете первую строку. – arcadeprecinct
Как я могу предотвратить '.End (xlDown)' от перехода к следующей учетной записи ниже? – cpage
Я бы предположил, что у вас есть хотя бы одна пустая строка между учетными записями. '.End (xlDown)' останавливается (если применяется к непустой ячейке), поэтому его нельзя использовать для поиска самой последней строки в столбце. – arcadeprecinct