Очистка содержимого ячейки на основе значения другой ячейки в той же строке на основе ссылок заголовка - PullRequest
0 голосов
/ 26 апреля 2019

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

По сути, у меня есть месячный набор данных, который поступает, но данные несовершенны.Мне часто приходится очищать избыточные значения данных одной ячейки на основе значения другой.

Сложная часть состоит в том, что данные будут смещаться неделя на неделю, и единственное, что является статическим, - это заголовки столбцов.

Как пример, столбцы A - E имеют заголовки Company1, Company2, Company3 и т. д. Столбцы Q - U имеют заголовки Product1, Product2, Product3 и т. д.

столбцы продукта будут содержать названия компаний в качестве значений (часто больше одного, разделенных запятыми), и если название компании не отображается для ЛЮБОГО из столбцов продукта, ячейка той же строки для столбца этой компании должна бытьочищено.

Таким образом, если Q4: U4 не содержит в качестве значения « Product1 », значение в A4 (столбец продукта 1, строка 4) должно быть очищено.

Буду очень признателен за понимание того, как это сделать!

edit

Снимок экрана с примерами данных: Screenshot of example data

Пример 2

1 Ответ

0 голосов
/ 27 апреля 2019

Попробуй это. Создайте новый модуль в редакторе VBA и скопируйте приведенный ниже код ...

Public Sub ProcessData()
    Dim objCompanyRange As Range, objProductRange As Range, objCompanyCell As Range
    Dim strCompany As String, objThisProductRange As Range, rngFrom As Range
    Dim rngTo As Range, objFindResult As Range, lngLastRow As Long

    On Error Resume Next

    ' Get the range for the company data.
    Set objCompanyRange = Application.InputBox("Please select the COMPANY data range, including headers ...", "Company Data", , , , , , 8)
    If Err.Description <> "" Then Exit Sub

    ' Get the range for the product data.
    Set objProductRange = Application.InputBox("Please select the PRODUCT data range, including headers ...", "Product Data", , , , , , 8)
    If Err.Description <> "" Then Exit Sub

    On Error GoTo 0

    For Each objCompanyCell In objCompanyRange
        ' We want the headers in the range but want to skip processing the first row.
        If objCompanyCell.Row > objCompanyRange.Cells(1, 1).Row Then
            ' This is the only contentious line for me.  If your headers are specified as you had in your
            ' example, i.e. "Group: Company1" then the below will work.  If that was a mocked example that
            ' was not 100% accurate, the below line will need to change.  It is currently splitting the header
            ' by a colon and only storing the right hand side as the company.
            strCompany = Trim(Split(objCompanyRange.Cells(1, objCompanyCell.Column).Text, ":")(1))

            ' Only reset objThisProductRange if the row has changed, otherwise we use the same set of
            ' products we used last time.
            If objCompanyCell.Row <> lngLastRow Then
                ' Determine the range for the product data given the current row being processed
                With objProductRange.Worksheet
                    Set rngFrom = .Range(.Cells(objCompanyCell.Row, objProductRange.Cells(1, 1).Column).Address)
                    Set rngTo = rngFrom.Offset(0, objProductRange.Columns.Count - 1)
                End With

                Set objThisProductRange = Range(rngFrom.Address & ":" & rngTo.Address)
            End If

            ' Find the company name within the current row of Product data.
            Set objFindResult = objThisProductRange.Find(strCompany, MatchCase:=False)

            ' Clear the cell if nothing was found.
            If objFindResult Is Nothing Then
                objCompanyCell.ClearContents
            End If
        End If

        lngLastRow = objCompanyCell.Row
    Next
End Sub

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

Result

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

Надеюсь, это то, что вы ищете. Обязательно прочитайте комментарии в коде, если у вас есть какие-либо вопросы.

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