Другой подход заключается в том, чтобы обработать текстовый файл и вернуть на лист столько столбцов, сколько вам нужно:
Sub CopyLessColumns()
Dim strSpec As String, i As Long, colToRet As Long
Dim arrSp As Variant, arrRez() As String, arrInt As Variant, j As Long
Dim fso As Object, txtStr As Object, strText As String
Set fso = CreateObject("Scripting.FileSystemObject")
strSpec = "C:\Users\xxxxxxx\Desktop\Input.txt"
If Dir(strSpec) <> "" Then 'check if file exists
Set txtStr = fso.OpenTextFile(strSpec)
strText = txtStr.ReadAll
txtStr.Close
End If
arrSp = Split(strText, vbCrLf)
colToRet = 5 'Number of columns you need
ReDim arrRez(UBound(arrSp), colToRet - 1)
For i = 0 To UBound(arrSp)
arrInt = Split(arrSp(i), vbTab)
If UBound(arrInt) > colToRet - 1 Then
For j = 0 To colToRet - 1
arrRez(i, j) = arrInt(j)
Next j
End If
Next i
ActiveSheet.Range(Cells(1, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez
End Sub
Я также хотел бы подчеркнуть, что идея @Ron Rosenfeld блестящая, во всяком случае. Вы можете просто обновить запрос, если / когда он вам нужен ...
Чтобы легко его использовать, следующий фрагмент кода дает вам возможность построить необходимый массив до QueryTables.Add
, таким образом :
Dim arrV() As Variant, i As Long, rng As Range
Const nrCol As Long = 20 'Number of columns to be returned
Set rng = Range("$A:$AF")
ReDim arrV(1 To rng.Columns.count)
For i = 1 To rng.Columns.count
If i > nrCol Then
arrV(i) = 9
Else
arrV(i) = 1
End If
Next i
И затем замените строку
.TextFileColumnDataTypes = Array(1, 1, 1,...)
на
.TextFileColumnDataTypes = arrV