#excel #vba
#excel #vba
Вопрос:
У меня есть Рабочая тетрадь под названием «INVOICE.xls » с листом «СЧЕТ-ФАКТУРА» и другой рабочей книгой под названием «DATABASE.xls » с листом «БАЗА ДАННЫХ».
У меня есть два диапазона данных в рабочей книге «INVOICE.xls «Лист «СЧЕТ-ФАКТУРА«, который предполагает rngA- (от A13 до I29) и rngB- (от B23 до I29), оба из которых имеют заголовки над ними, которые я переношу в рабочую книгу «DATABASE.xls «Лист «БАЗЫ ДАННЫХ» с использованием кода VBA. В диапазоне rngB время от времени появляются данные. Код, который у меня есть сейчас, успешно передается только в том случае, если в rngB есть строка с данными. В тех случаях, когда в rngB нет данных, он копирует строку выше указанного диапазона, то есть метки заголовков. Вставляем приведенный ниже код. Я не эксперт, я просто вставил коды с различных форумов, чтобы заставить его работать до сих пор. Screenshot-Invoice.xls Скриншот Database.xls
РЕДАКТИРОВАТЬ — Есть еще одна ошибка, из-за которой мне нужна помощь. Когда оба диапазона rngA и rngB заполнены данными, он не вставляет этот диапазон. Вместо этого он вставляет диапазон A3: I3 из «INVOICE.xls « лист «НАКЛАДНОЙ « на «DATABASE.xls «лист «БАЗА ДАННЫХ» диапазон столбцов J: R. Пожалуйста, помогите.
Sub SavingData()
Dim rngA As Range
Dim rngB As Range
Dim i As Long
Dim a As Long
Dim b As Long
Dim rng_dest As Range
Application.ScreenUpdating = False
Windows("DATABASE.xls").Activate
'Check if invoice # is found on sheet "DATABASE"
i = 2
Do Until Sheets("DATABASE").Range("A" amp; i).Value = ""
If ActiveWorkbook.Sheets("DATABASE").Range("A" amp; i).Value = Workbooks("INVOICE").Sheets("INVOICE").Range("H8").Value Then
'Ask overwrite invoice #?
If MsgBox("Invoice Number Already Exists - Do you want to overwrite?", vbYesNo) = vbNo Then
Exit Sub
Else
Exit Do
End If
End If
i = i 1
Loop
i = 1
Windows("INVOICE.xls").Activate
Windows("DATABASE.xls").Activate
Set rng_dest = Sheets("DATABASE").Range("J:R")
'Delete rows if invoice # is found
Do Until Sheets("DATABASE").Range("A" amp; i).Value = ""
If Workbooks("DATABASE").Sheets("DATABASE").Range("A" amp; i).Value = Workbooks("INVOICE").Sheets("INVOICE").Range("H8").Value Then
Workbooks("DATABASE").Sheets("DATABASE").Range("A" amp; i).EntireRow.Delete
i = 1
End If
i = i 1
Loop
' Find first empty row in columns B:I on sheet Sales
Windows("INVOICE").Activate
Do Until WorksheetFunction.CountA(rng_dest.Rows(i)) = 0
i = i 1
Loop
'Copy range A13:I20 on sheet Invoice
With Sheets("INVOICE")
Dim lastRowA As Long
Dim lastRowB As Long
lastRowA = .Cells(20, 1).End(xlUp).Row
lastRowB = .Cells(29, 1).End(xlUp).Row
Set rngA = .Range(.Cells(13, 1), .Cells(lastRowA, 9))
Set rngB = .Range(.Cells(23, 1), .Cells(lastRowB, 9))
End With
' Copy rows containing values to sheet Sales
For a = 1 To rngA.Rows.Count
If WorksheetFunction.CountA(rngA.Rows(a)) <> 0 Then
rng_dest.Rows(i).Value = rngA.Rows(a).Value
'Copy Field 1
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("A" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H8").Value
'Copy Field 2
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("B" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C9").Value
'Copy Field 3
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("C" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("B10").Value
'Copy Field 4
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("D" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E8").Value
'Copy Field 5
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("E" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("G10").Value
'Copy Field 6
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("F" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C11").Value
'Copy Field 7
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("G" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E11").Value
'Copy Field 8
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("H" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H11").Value
'Copy Field 9
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("I" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("I11").Value
i = i 1
End If
Next a
For b = 1 To rngB.Rows.Count
If WorksheetFunction.CountA(rngB.Rows(b)) <> 0 Then
rng_dest.Rows(i).Value = rngB.Rows(b).Value
'Copy Field 1
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("A" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H8").Value
'Copy Field 2
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("B" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C9").Value
'Copy Field 3
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("C" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("B10").Value
'Copy Field 4
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("D" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E8").Value
'Copy Field 5
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("E" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("G10").Value
'Copy Field 6
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("F" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C11").Value
'Copy Field 7
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("G" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E11").Value
'Copy Field 8
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("H" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H11").Value
'Copy Field 9
Workbooks("DATABASE.xls").Sheets("DATABASE").Range("I" amp; i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("I11").Value
i = i 1
End If
Next b
Application.ScreenUpdating = True
End Sub
Ответ №1:
вы можете проверить lastRowB
, чтобы оно было больше 23, прежде чем начинать rngB
копирование / вставку:
If lastRowB > 23 Then
For b = 1 To rngB.Rows.Count
' your code
Next b
End If