Удаление строк на основе нескольких критериев в двух книгах в VBA - PullRequest
0 голосов
/ 16 января 2019

У меня 2 рабочие тетради. 1 использовался как Мастер, а 1 - ежедневно использовался Oracle Cloud с новой информацией, относящейся к Главной рабочей книге. Я хочу сравнить два значения между книгами и, если есть совпадение, удалить соответствующую строку в главной таблице. Обсуждаемые столбцы - это столбец A в обеих книгах, который представляет собой уникальный номер, идентифицирующий счет-фактуру, и столбец AB, который либо «оплачен», либо «не оплачен», но должен использоваться только для определения необходимости удаления или обновления строки между книгами. 1001 *

Если значение в столбце AB - «ОПЛАТА» и находится в ежедневной книге (назовем его WB2), а значение в столбце A WB2 - в «Мастер», удалите строку в «Мастер».

Ниже приведен код, который я получил в настоящее время. Я пошел по пути помещения обоих диапазонов в массив, а затем надеялся сделать что-то вроде проверки, совпадают ли значения в массиве (что я делал ранее), но я не совсем уверен, как затем перемещать на удаление соответствующей строки из правильного WB, когда условия были выполнены.

Public startCell As Range

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  Dim i As Long
  Dim j As Integer
  j = 0

  For i = LBound(arr) To UBound(arr)
    If arr(i, 1) = stringToBeFound Then
        IsInArray = True
        j = 1
    End If
  Next i
  If j = 0 Then IsInArray = False
End Function

Sub AmendMaster()

Set startCell = ActiveWorkbook.Sheets("Main_Data").Cells(Rows.Count, 
"A").End(xlUp)

Dim mainRng As Range
Dim newRng As Range

Dim cell As Range

Dim mainArr As Variant

Dim wb As Workbook
Dim wbs(1) As Workbook


Dim i As Long
Dim j As Long
Dim RowMatch As Long
a = 0

Set mainRng = ActiveWorkbook.Sheets("Main_Data").Range("A2", ActiveWorkbook.Sheets("Main_Data").Cells(Rows.Count, "A").End(xlUp).Offset(0,27)) 'Column A is the Cust Transaction ID on the Main Report


mainArr = mainRng.Value

For Each wb In Workbooks

Set wbs(a) = wb
a = a + 1

Next wb

Set newRng = wbs(1).Sheets("Sheet1").Range("A3", wbs(1).Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(0,28)) 'Column A is the Cust Transaction ID on the Daily Report
newArr = newRng.Value

For Each cell In mainRng
    cell.Value = cell.Value * 1
Next cell
For Each cell in newRng
    cell.Value = cell.Value * 1
Next cell

newRng.NumberFormat = "0"
newRng.NumberFormat = "0"

mainRng = newRng.Value


For i = 1 To UBound(newArr)
match = False
For j = 1 To UBound(mainArr)
    If newArr(i,28) = "PAID" And newArr(i,1) = mainArr(j,1) THEN 
        .Rows(i).Delete
    End If
Next i


End Sub

Ожидаемый результат должен быть, если в электронной таблице Master есть 10 строк в WB2, а эти 10 строк в WB2 также имеют «PAID» в столбце AB, тогда VBA должен удалить 10 соответствующих строк в Master. Если AB "UNPAID", тогда, хотя он может совпадать, ему просто нужно скопировать и перезаписать все столбцы из A: V в главной книге Master, но для целей этого поста я просто хочу сосредоточиться на удалении строк, так как я почти уверен, что смогу определить значения вставки.

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

Если вам что-то еще понадобится от меня, чтобы лучше понять проблему или попробовать, пожалуйста, не стесняйтесь, дайте мне знать.

С уважением,

Мэтт

1 Ответ

0 голосов
/ 17 января 2019

Затерянный в VBA

Невозможно определить, что происходит. К сожалению.

Option Explicit

Public startCell As Range

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean

    Dim i As Long

    For i = LBound(arr) To UBound(arr)
        If arr(i, 1) = stringToBeFound Then
            IsInArray = True
            Exit For
        End If
    Next

End Function

Sub AmendMaster()

    Const cSource As Variant = "Sheet1"     ' Source Worksheet Name/Index
    Const cSrc1 As Variant = "A"            ' Source Column 1 Letter/Number
    Const cSrc2 As Variant = "AC"           ' Source Column 2 Letter/Number
    Const cSrcFirstR As Long = 3            ' Source First Row Number

    Const cTarget As Variant = "Main_Data"  ' Target Worksheet Name/Index
    Const cTgt1 As Variant = "A"            ' Target Column 1 Letter/Number
    Const cTgt2 As Variant = "AB"           ' Target Column 2 Letter/Number
    Const cTgtFirstR As Long = 2            ' Target First Row Number

    Dim ws As Worksheet     ' Source Worksheet
    Dim rngU As Range       ' Union Range
    Dim vntSrc As Variant   ' Source Array
    Dim vntTgt As Variant   ' Target Array
    Dim srcLastR As Long    ' Source Last Row Number
    Dim tgtLastR As Long    ' Target Last Row Number
    Dim i As Long           ' Array Row Counter
    Dim j As Long

    With ThisWorkbook.Worksheets(cTarget)
        tgtLastR = .Cells(.Rows.Count, cTgt1).End(xlUp).Row
        vntTgt = .Range(.Cells(cTgtFirstR, cTgt1), .Cells(tgtLastR, cTgt2))
    End With

    For i = 1 To Workbooks.Count
        If Workbooks(i).Name <> ThisWorkbook.Name _
                And Windows(Workbooks(i).Name).Visible = True Then
            Debug.Print Workbooks(i).Name
            With Workbooks(i).Worksheets(cSource)
                srcLastR = .Cells(.Rows.Count, cSrc1).End(xlUp).Row
                vntSrc = .Range(.Cells(cSrcFirstR, cSrc1), _
                        .Cells(srcLastR, cSrc2))
            End With
            Exit For
        End If
    Next

    For i = 1 To UBound(vntSrc)
        For j = 1 To UBound(vntTgt)
            If vntTgt(i, UBound(vntTgt, 2)) = "PAID" _
                    And vntSrc(i, 1) = vntTgt(j, 1) Then
                With ThisWorkbook.Worksheets(cTarget)
                    .Rows(j).Hidden = True ' Delete
                End With
            End If
        Next
    Next

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