#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