Чтение в заголовках столбцов с разных листов с небольшими различиями

#excel #vba

Вопрос:

Является ли это правильным подходом?

У меня есть несколько листов от разных поставщиков для в основном перекрывающегося списка продуктов.

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

Проблема в том, что не все поставщики предоставляют одинаковый формат или даже точные заголовки столбцов в своих таблицах данных (например, Цена, Price_$, Price1, как заголовки столбцов от разных поставщиков, ссылающихся на один и тот же столбец в своих данных).

Иногда провайдеры даже меняют формат, в котором они представляют свои заголовки, включая изменение названия. например, в один месяц его цена, в следующий-его Цена1.

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

Прошло некоторое время с тех пор, как я что-либо делал в Excel (в последнее время в основном работал с таблицами Google). Из того, что я понял, это было бы в VBA.

Я предполагаю, что мой вопрос заключается в следующем: «Кажется ли этот подход правильным? и является ли VBA правильным подходом к кодированию?»

Любые комментарии, указания или советы приветствуются.

Ответ №1:

Разные заголовки для одних и тех же данных

  • Я написал это несколько дней назад, наверное, для вопроса, который был закрыт.
 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Purpose:      Loops through a list of strings ('Headers') and attempts to find
'               a match in a cell of a row ('RowNumber') of a worksheet ('ws').
'               Returns the column number of the cell of the first found string.
'               Returns 0 if there is no match.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetFirstHeaderColumn( _
    ByVal ws As Worksheet, _
    ByVal RowNumber As Long, _
    ParamArray Headers() As Variant) _
As Long
    If ws Is Nothing Then Exit Function
    If RowNumber < 1 Or RowNumber > ws.Rows.Count Then Exit Function
    
    Dim rrg As Range: Set rrg = ws.Rows(RowNumber)
    
    Dim cIndex As Variant
    Dim n As Long
    For n = LBound(Headers) To UBound(Headers)
        cIndex = Application.Match(CStr(Headers(n)), rrg, 0)
        If IsNumeric(cIndex) Then
            GetFirstHeaderColumn = cIndex
            Exit For
        End If
    Next n
    
End Function
 
  • Вы могли бы использовать его следующим образом.
 Sub GetFirstHeaderColumnTEST()
    
    Const FirstRow As Long = 1
    
    Dim ws As Worksheet: Set ws = Sheet1

    Dim Col1 As Long
    Col1 = GetFirstHeaderColumn(ws, FirstRow, "Price", "Price1")
    If Col1 > 0 Then
        Debug.Print Col1
    Else ' non of the headers were found
        Debug.Print "Nope"
    End If

    Dim Col2 As Long
    Col2 = GetFirstHeaderColumn(ws, FirstRow, "Sales", "Amount", "Sold")
    If Col1 > 0 Then
        Debug.Print Col2
    Else ' non of the headers were found
        Debug.Print "Nope"
    End If
    
End Sub