2015-04-01 2 views
0

Я пытаюсь написать коды VBA, которые будут читать данное имя файла CSV и внести некоторые изменения в данные перед записью в другой файл CSV.Открытие и чтение файла CSV без имени листа

Set oSht_Input = Workbooks.Open(file_Path, UpdateLinks:=False).Worksheets(extractDataFile.convertedSheetName) 
lastRow = oSht_Input.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

For Rows = 2 To lastRow 
    extractedDataFileRecord.Variable1 = CStr(oSht_Input.Cells(Rows, 1)) 

.... code continues 

Этот код работает нормально.

Однако недостаток заключается в том, что файлы CSV просто копируют имя файла и помещают его в имя листа. Поэтому я могу с уверенностью предположить, что переменная convertSheetName эквивалентна предоставленному имени файла.

Этот код будет работать, если имя файла достаточно короткое для копирования в имя листа. Однако, если имя файла слишком длинное, имя файла обрезается внутри имени листа, поэтому я не могу получить правильную ссылку для установки объекта Worksheet.

Есть ли лучший способ получить ссылку на лист, чтобы я мог читать значения ячеек внутри листа?

+0

Если вы используете 'Workbooks.Open', то процесс по существу является файлом ► Open, а не импортом в существующий или новый рабочий лист. Там будет только один рабочий лист, когда CSV будет открыт таким образом. Используйте ссылку «Листы» (1) «Лист листа» или кодовое имя листа «Sheet1» для ссылки на нее. – Jeeped

+0

@ Поблагодарили! Извините, я немного новичок в VBA; поэтому я редактирую коды в Workbooks.Open(). Листы (1)? – lyk

+0

CSV - это всего лишь текстовый файл. Вам не нужно импортировать его в Excel для работы с ним. Вы можете использовать макрос excel для прямого изменения текстового файла. –

ответ

1

Если вы используете Workbooks.Open, то процесс по существу является файлом ► Open, а не импортом в существующий или новый рабочий лист. Там будет только один рабочий лист, когда CSV будет открыт таким образом. Используйте ссылку Sheets(1) лист данных или ссылку на нее Sheet1. Пример:

Dim rw As Long, lastRow As Long, file_Path As String, wb As Workbook, oSht_Input As Worksheet 

file_Path = "something" 
Set wb = Workbooks.Open(file_Path, UpdateLinks:=False) 
Set oSht_Input = wb.Sheets(1) 

With oSht_Input 
    lastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    For rw = 2 To lastRow 
     'do stuff to .Cells or .Range here 
     extractedDataFileRecord.Variable1 = CStr(.Cells(rw, 1)) 
    Next rw 
End With 

Set oSht_Input = Nothing 
Set wb = Nothing 

Это должно вас заставить. Я использовал ссылку на рабочий лист в With ... End With, так что последующие ссылки .cells и .range нужно только предварять с периодом, чтобы показать родителя.

+0

Это, вероятно, может использовать 'wb.Close, False' перед установкой wb в ничто и оставить суб. – Jeeped

+0

спасибо, я сначала попробую это решение! =) – lyk

+0

Спасибо @ Jeep, отлично работает! Не могу поверить, что я не мог понять это простое решение – lyk