Я пытаюсь создать макрос VBA для импорта данных из листа RAW в массив таблиц листов с помощью функции SUMIFS. Эта функция должна зациклить столбец для каждого сайта в списке и установить значение ячейки в соответствии с SUMIFS.
Однако у меня проблема, и я думаю, что это связано с тем, как я ссылаюсь на колонку.
Часть для поиска столбцов должна найти столбец слева от столбца, содержащий «Всего» в строке 7, а затем установить preCol равным этому номеру столбца.
Я получаю сообщение об ошибке 13: Несоответствие типов на preCol = .Find("Total", After:="OI7", LookIn:=xlValues).Offset(0, -1).Column
имеет смысл, но я не могу придумать, как найти столбец и затем превратить его в целое число в зависимости от местоположения этого столбца.
Любой совет или понимание с благодарностью.
Option Explicit
Sub ImportFile()
'Select import file
On Error GoTo err
Dim importFilePath As String
Dim fileExplorer As FileDialog
Set fileExplorer = Application.FileDialog(msoFileDialogFilePicker)
With fileExplorer
.AllowMultiSelect = False
.Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm; *.xlsb", 1
.Show
If .SelectedItems.Count > 0 Then
importFilePath = .SelectedItems.Item(1)
Else
GoTo err
MsgBox "Import cancelled."
End If
End With
'Beginning processes
Application.ScreenUpdating = False
Application.EnableEvents = False
'Defining and setting variables
'Loop variables
Dim i As Integer
Dim j As Integer
Dim s As Integer
'RAW workbook
Dim dataFile As Worksheet
Set dataFile = Workbooks.Open(importFilePath).Sheets("Cons Tx excluding credits")
'Worksheet variables
Dim wsBOS As Worksheet
Set wsBOS = ThisWorkbook.Sheets("FY19 Weekly Boston")
Dim wsMilford As Worksheet
Set wsMilford = ThisWorkbook.Sheets("FY19 Weekly Milford")
Dim wsMansfield As Worksheet
Set wsMansfield = ThisWorkbook.Sheets("FY19 Weekly Mansfield")
Dim wsSSH As Worksheet
Set wsSSH = ThisWorkbook.Sheets("FY19 Weekly SSH")
Dim wsLP As Worksheet
Set wsLP = ThisWorkbook.Sheets("FY19 Weekly Libbey Park")
Dim sheetArray As Variant
sheetArray = Array(wsBOS, wsMilford, wsMansfield, wsSSH, wsLP)
'SUMIF function variables
Dim sumIfRange As Range 'Quantity
Set sumIfRange = dataFile.Range("M:M")
Dim cSiteRange As Range 'Disease site
Set cSiteRange = dataFile.Range("AM:AM")
Dim criteriaSite As Range
Dim cDeptRange As Range 'Department
Set cDeptRange = dataFile.Range("B:B")
Dim criteriaDept As Range
Dim cTherapyRange As Range 'Therapy used
Set cTherapyRange = dataFile.Range("E:E")
Dim criteriaTherapy As Range
Dim c2TherapyRange As Range
Set c2TherapyRange = dataFile.Range("E:E")
Dim criteria2Therapy As Range
Dim cGlandGURange As Range
Set cGlandGURange = dataFile.Range("AM:AM")
Dim criteriaGlandGU As Range
'Insert before column containing "Total"
Dim f As Range
Dim firstAddress As String
For s = LBound(sheetArray) To UBound(sheetArray)
With sheetArray(s)
With .Rows(7).SpecialCells(XlCellType.xlCellTypeConstants, xlTextValues)
Set f = .Find(what:="Total", LookIn:=xlValues, lookat:=xlWhole)
If Not f Is Nothing Then
firstAddress = f.Offset(, 1).Address '<-- offset by one column since f will be shifted one column to the right in subsequent statement
Do
f.EntireColumn.Insert
Set f = .FindNext(f)
Loop While f.Address <> firstAddress
End If
End With
End With
Next s
Dim preCol As Long
With Sheets("FY19 Weekly Boston")
With .Rows(7).SpecialCells(XlCellType.xlCellTypeConstants, xlTextValues)
preCol = .Find("Total", After:="OI7", LookIn:=xlValues).Offset(0, -1).Column
End With
End With
For s = 1 To UBound(sheetArray)
With sheetArray(s)
For i = 8 To 21
Set criteriaDept = sheetArray(s).Cells("B7")
Set criteriaSite = sheetArray(s).Cells(i, 2)
Set criteriaTherapy = sheetArray(s).Cells("C6")
Set criteria2Therapy = sheetArray(s).Cells("C7")
sheetArray.Cells(i, preCol) = Application.WorksheetFunction.SumIfs(sumIfRange, cSiteRange, criteriaSite, cDeptRange, criteriaDept, cTherapyRange, criteriaTherapy) + Application.WorksheetFunction.SumIfs(sumIfRange, cSiteRange, criteriaSite, cDeptRange, criteriaDept, c2TherapyRange, criteria2Therapy)
Next i
End With
Next s
Set criteriaDept = Nothing
Set criteriaSite = Nothing
Set criteriaTherapy = Nothing
Set criteria2Therapy = Nothing
'Ending processes
Application.ScreenUpdating = True
Application.EnableEvents = True
err:
Exit Sub
End Sub