Предисловие
Я нашел это через Google, и мне не хватало.Итак, я собираюсь заполнить еще немного информации, объяснить, что происходит, а также немного оптимизировать код.
Объяснение
Очевидный ответ, который должен был быть представлен вам:1007 * Да, это можно сделать.На самом деле, это проще, чем вы думаете.
Я заметил, что вы сделали это
newFileColIndex = filesToImport.ListColumns("New File Name").Index
, который дал вам индекс заголовка "Новое имя файла".
Затем,когда вы решили проверить столбцы, вы забыли, что индекс на самом деле также является относительной позицией столбца.
Таким образом, вместо номера столбца вы должны были сделать то же самое, что и раньше
InStr(fName.Range(1, filesToImport.ListColumns("Column Name")), "DATE")
Давайте копнем немного глубже и объясним не только словами, но и картинками
![Relative column index](https://i.stack.imgur.com/hIsnh.png)
На рисунке выше в первой строке показан абсолютный индекс столбца,
, где A1 имеетиндекс столбца 1, B1 имеет индекс столбца 2 и т. д.
Заголовки ListObject
имеют свои собственные относительные индексы, где, в этом примере, Column1 будет иметь индекс столбца 1, Column2будет иметь индекс столбца 2 и так далее.Это позволяет нам использовать свойство ListRow.Range
при обращении к столбцам с номерами или именами.
Чтобы лучше продемонстрировать, вот код, который печатает относительный и абсолютный индекс столбца "Column1""из предыдущего изображения.
Public Sub Example()
Dim wsCurrent As Worksheet, _
loTable1 As ListObject, _
lcColumns As ListColumns
Set wsCurrent = ActiveSheet
Set loTable1 = wsCurrent.ListObjects("Table1")
Set lcColumns = loTable1.ListColumns
Debug.Print lcColumns("Column1").Index 'Relative. Prints 1
Debug.Print lcColumns("Column1").Range.Column 'Absolute. Prints 3
End Sub
Поскольку ListRow.Range
относится к диапазону, он становится вопросом относительности, поскольку этот диапазон находится внутри ListObject
.
![ListRow range](https://i.stack.imgur.com/bAuuu.png)
Так, например, чтобы ссылаться на Column2 в каждой итерации ListRow
, вы можете сделать это следующим образом:
Public Sub Example()
Dim wsCurrent As Worksheet, _
loTable1 As ListObject, _
lcColumns As ListColumns, _
lrCurrent As ListRow
Set wsCurrent = ActiveSheet
Set loTable1 = wsCurrent.ListObjects("Table1")
Set lcColumns = loTable1.ListColumns
For i = 1 To loTable1.ListRows.Count
Set lrCurrent = loTable1.ListRows(i)
'Using position: Range(1, 2)
Debug.Print lrCurrent.Range(1, 2)
'Using header name: Range(1, 2)
Debug.Print lrCurrent.Range(1, lcColumns("Column2").Index)
'Using global range column values: Range(1, (4-2))
Debug.Print lrCurrent.Range(1, (lcColumns("Column2").Range.Column - loTable1.Range.Column))
'Using pure global range values: Range(5,4)
Debug.Print wsCurrent.Cells(lrCurrent.Range.Row, lcColumns("Column2").Range.Column)
Next i
End If
Оптимизированный код
Как и было обещано, вот оптимизированный код.
Public Sub Code()
Dim wsCurrentSheet As Worksheet, _
loSourceFiles As ListObject, _
lcColumns As ListColumns, _
lrCurrent As ListRow, _
strFileNameDate As String
Set wsCurrentSheet = Worksheets("Lists")
Set loSourceFiles = wsCurrentSheet.ListObjects("tblSourceFiles")
Set lcColumns = loSourceFiles.ListColumns
For i = 1 To loSourceFiles.ListRows.Count
Set lrCurrent = loSourceFiles.ListRows(i)
If InStr(lrCurrent.Range(1, lcColumns("Column Name").Index), "DATE") <> 0 Then
strSrc = lrCurrent.Range(1, lcColumns("New File Name").Index).value
strReplace = Format(ThisWorkbook.Names("ValDate").RefersToRange, "yyyymmdd")
strFileNameDate = Replace(strSrc, "DATE", strReplace)
wbName = OpenCSVFile("Path" & strFileNameDate)
CopyData sourceFile:=CStr(strFileNameDate), _
destFile:="file", _
destSheet:="temp"
End If
Next i
End Sub
Ссылки
Личный опыт.
MSDN