Сброс автоматической генерации c счета-фактуры до 000 / «текущий год» в начале нового финансового года в Excel VBA - PullRequest
1 голос
/ 14 апреля 2020

У меня есть рабочий код, который автоматически увеличивает номер счета-фактуры в формате 112/2020, 113/2020 и т. Д. (Для финансового года 2020), когда пользователь вводит другие данные в пользовательской форме и нажимает кнопку "Отправить".

Я хочу сбросить этот номер счета-фактуры на 001/2021, как только финансовый год изменится на апрельский месяц в соответствии с моей функцией финансового года. И он должен делать это каждый год, когда финансовый год увеличивается.

Функция, которую я использую для расчета текущего финансового года, указана ниже

If Month(dDate) <= 3 Then
    FinancialYear = Year(dDate) - 1
  Else
    FinancialYear = Year(dDate)
  End If
End Function

Я увеличиваю номера счета-фактуры автоматически, когда пользователь Хиты отправить на форму, используя:

.Cells(emptyRow, 2) = Format(Int(Left(.Cells(emptyRow - 1, 2).Value, 3)) + 1, "000") & "/" & current_year

где

emptyRow = WorksheetFunction.CountA(nwb.Sheets("Sheet1").Range("A:A")) + 1 'To calculate next empty row

current_year = FinancialYear(Date)

Полный код (я не включил другие ненужные вещи):

Function FinancialYear(dDate As Date) As Integer
  If Month(dDate) <= 3 Then
    FinancialYear = Year(dDate) - 1
  Else
    FinancialYear = Year(dDate)
  End If
End Function

Sub Submit()
    Dim nwb As Workbook
    Set nwb = Workbooks.Open("C:\Users\CHAMARA2\Downloads\TestDB.xlsx")

    Dim emptyRow As Long

    Dim current_year As String
    emptyRow = WorksheetFunction.CountA(nwb.Sheets("Sheet1").Range("A:A")) + 1

    With nwb.Sheets("Sheet1")

        .Cells(emptyRow, 1) = emptyRow - 1  'serial number

        'If current_year = 2020 Or current_year = 2022 Or current_year = 2023 Or current_year = 2024 Or current_year = 2025 Then .Cells(emptyRow, 2) = "000/" & current_year

        .Cells(emptyRow, 2) = Format(Int(Left(.Cells(emptyRow - 1, 2).Value, 3)) + 1, "000") & "/" & current_year

    End With
End Sub



Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Непосредственно перед созданием вашего увеличенного номера счета-фактуры просто проверьте, существует ли счет-фактура 1 текущего года 001/2021 в ваших счетах. Например, используя метод WorksheetFunction.Match .

Если этот номер счета-фактуры существует, то счетчик счета-фактуры уже находится в текущем году, если он не существует, нам нужно сбросить счетчик на 0, так как в текущем году счет еще не был написан.

Dim FirstInvoice As String
FirstInvoice = "001" & "/" & current_year

Dim MatchInvoice As Double
On Error Resume Next 'next line will error if invoice 001/2021 does not exist yet
MatchInvoice = Applicarion.WorksheetFunction.Match(FirstInvoice, RangeOfInvoceNumbers, 0)
On Error Goto 0  're-enable error reporting

If MatchInvoice = 0 Then
    'first invoice of the current year does not exist so
    'reset your invoice counter to 0 here
End If

'proceed generating your increment as you did before.

Это не будет сбрасывать счетчик напрямую в 1 января, но всякий раз, когда первый счет выставляется в новом году. Так что это даже работает, если вы напишите свой первый счет в июне, например.


Немного не в топи c:

Обратите внимание, что при использовании этого формата 001/2021 будет сортироваться следующим образом :

001/2020
001/2021
001/2022
002/2020
002/2022
002/2023

Таким образом, вы можете рассмотреть лучший формат, такой как:

2020/001
2020/002
2021/001
2021/002
2022/001
2022/002

, который будет автоматически сортировать по году.

Если вы сохраните фактический номер счета, сохраненный в цифрах c как 2020001 и просто используйте числовой формат 0000"/"000, чтобы показать его как 2020/001 для лучшей читаемости человеком, вы даже можете использовать функцию MAX, чтобы найти последний номер счета в ваших счетах и ​​увеличить его на вычисление +1.

Тогда вы также можете использовать Application.WorksheetFunction.Max, чтобы проверить, нужно ли вам более легко сбрасывать и увеличивать

Dim FirstInvoiceCurrentYear As Long
FirstInvoiceCurrentYear = cLng(current_year & "001")

Dim CurrentInvoice As Long
CurrentInvoice = Application.WorksheetFunction.Max(RangeOfInvoceNumbers)

Dim NextInvoiceNumber As Long
If FirstInvoiceCurrentYear > CurrentInvoice Then
     NextInvoiceNumber = FirstInvoiceCurrentYear 
Else
     NextInvoiceNumber = CurrentInvoice + 1
End If

Таким образом, вы видите, что выбор лучшего формата делает вашу жизнь намного в некоторых пунктах проще.

Вам просто нужно убедиться, что любая ячейка, содержащая номер счета, установлена ​​в числовой формат 0000"/"000, если вы затем введете 2020001 в эту ячейку, она автоматически будет отображаться как 2020/001 , но т ячейка - это все еще число, которое вы можете вычислить.

0 голосов
/ 14 апреля 2020

Вы можете проверить номер строки предыдущего счета за последние 4 цифры (например, с помощью функции IIF()):

Dim nwb As Workbook
Set nwb = Workbooks.Open("C:\Users\CHAMARA2\Downloads\TestDB.xlsx")

Dim current_year As String
current_year = FinancialYear(Date)

With nwb.Sheets("Sheet1")
    With .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
        .Value = .Row - 1 'serial number
        .Offset(, 1) = Format(Int(Left$(IIf(Right$(.Offset(-1, 1).Value, 4) = current_year, .Offset(-1, 1).Value, 0), 3)) + 1, "000") & "/" & current_year
    End With
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...