Как предотвратить копирование строки в другую рабочую книгу, когда у диапазона нет данных, при использовании «LastRow» «xlUp» - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть книга под названием " INVOICE.xls " с листом " INVOICE " и другая книга под названием " DATABASE.xls " с листом " БАЗА ДАННЫХ ».

У меня есть два диапазона данных в Рабочей книге " INVOICE.xls " Лист " INVOICE ", который предполагает rngA- (от A13 до I29) и rngB- (от B23 до I29) у обоих из которых есть заголовки над ними, которые я передаю в книгу " DATABASE.xls " Sheet " DATABASE " с использованием Код VBA . Диапазон rngB имеет данные время от времени. Код, который у меня есть, теперь успешно переносится, только если есть строка с данными в rngB . В случаях, когда в rngB нет данных, он копирует строку выше указанного диапазона, то есть метки заголовка. Вставка кода ниже. Я не эксперт, я только что вставил коды с разных форумов, чтобы заставить его работать до сих пор. Снимок экрана-Invoice.xls Снимок экрана Database.xls

РЕДАКТИРОВАТЬ - Есть еще одна ошибка, где мне нужна помощь. Когда оба диапазона rngA & rngB заполнены данными, этот диапазон не вставляется. Вместо этого он вставляет диапазон A3: I3 из "INVOICE.xls" лист "INVOICE" в "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" & i).Value = ""
    If ActiveWorkbook.Sheets("DATABASE").Range("A" & 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" & i).Value = ""
    If Workbooks("DATABASE").Sheets("DATABASE").Range("A" & i).Value = Workbooks("INVOICE").Sheets("INVOICE").Range("H8").Value Then
      Workbooks("DATABASE").Sheets("DATABASE").Range("A" & 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" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H8").Value
      'Copy Field 2
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("B" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C9").Value
      'Copy Field 3
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("C" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("B10").Value
       'Copy Field 4
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("D" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E8").Value
      'Copy Field 5
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("E" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("G10").Value
      'Copy Field 6
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("F" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C11").Value
      'Copy Field 7
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("G" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E11").Value
      'Copy Field 8
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("H" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H11").Value
      'Copy Field 9
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("I" & 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" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H8").Value
      'Copy Field 2
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("B" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C9").Value
      'Copy Field 3
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("C" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("B10").Value
       'Copy Field 4
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("D" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E8").Value
      'Copy Field 5
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("E" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("G10").Value
      'Copy Field 6
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("F" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("C11").Value
      'Copy Field 7
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("G" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("E11").Value
      'Copy Field 8
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("H" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("H11").Value
      'Copy Field 9
      Workbooks("DATABASE.xls").Sheets("DATABASE").Range("I" & i).Value = Workbooks("INVOICE.xls").Sheets("INVOICE").Range("I11").Value
      i = i + 1
    End If
  Next b
  Application.ScreenUpdating = True
End Sub

1 Ответ

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

Вы можете проверить, что lastRowB больше 23, прежде чем начинать rngB копирование / вставку:

If lastRowB > 23 Then
       For b = 1 To rngB.Rows.Count

            ' your code

       Next b
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...