Как предотвратить копирование строки в другую книгу, когда в диапазоне нет данных при использовании ‘lastRow’ ‘xlUp’

#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