2016-06-02 10 views
1

Есть ли более простой способ импорта данных в массив excel или другую структуру данных? Я пытался исследовать коллекции, но я нашел документацию трудно понять. http://www.functionx.com/vbaexcel/objects/Lesson6.htmПростой способ импорта данных в Excel-коллекции?

https://msdn.microsoft.com/en-us/library/f26wd2e5%28v=vs.100%29.aspx

код у меня ниже открывает файл выбор и ищет заголовок столбца, а затем перебирает каждую строку, хранящие данные в соответствии с цоколем и переменных строками, я сделал этот метод для многих макросов в прошлом, но теперь я имею дело со многими столбцами, и я ищу более продвинутый способ?

Sub Import_NAVRec() 

MyPath = Range("b2")        'Defines cell that contains path to source file 
Workbooks.Open (MyPath)        'Opens file 
Set tempbook = ActiveWorkbook      'Names workbook 
LR = Range("A65000").End(xlUp).Row     'finds last row in sourcefile 



ReDim aNavRec(1 To LR, 1 To 4)      'Defines NAV Rec array 
nRow = 0 


cName = "Accounting Basis" 
CA = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 
cName = "Accounting Date" 
cB = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 
cName = "Asset Currency" 
cC = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 

    For r = 2 To LR 
     'If Cells(r, cB) = "Trading Gain Loss" Then 
     nRow = nRow + 1 
     aNavRec(nRow, 1) = Cells(r, CA) 'Fund Number 
     aNavRec(nRow, 2) = Cells(r, cB) 'Ledger 
     aNavRec(nRow, 3) = Cells(r, cC) 'Balance change 
     'End If 

    Next r 


tempbook.Close 
End Sub 

Sub Print_output() 

Sheets("Output").Select 
Set Destination = Range("a2") 
Destination.Resize(UBound(aNavRec, 1) + 1, UBound(aNavRec, 2)).Value = aNavRec 


End Sub 
+0

Посмотрите с помощью ADO, чтобы соединиться с Excel, и с помощью SQL, поэтому независимо от того, где столбцы, до тех пор, как она есть, вы можете использовать что-то например '' select column_name из [Sheet1 $] ", вы будете использовать набор записей, со связанными свойствами и методами для изучения –

+0

После того, как вы установили диапазон, который хотите импортировать, вы можете сделать переменную Variant в одном шаг. Например: «V = диапазон (ячейки (1,1), ячейки (LastRow, LastCol)», тогда V будет одномерным массивом, где первое измерение представляет строки, а второе - столбцы. –

+1

Если вы есть рабочий код, который просто нуждается в улучшениях, тогда вы, вероятно, не в том месте с этим сообщением. [Обзор кода] (http://codereview.stackexchange.com/) - это то, где они обрабатывают существующий/рабочий код и делают все возможное для улучшения это с точки зрения скорости, безопасности, устойчивости и долговечности.Пробуйте попробовать.Они хорошо! Тем временем вы можете рассмотреть возможность использования этого: 'Dim aNavRec as Variant', а затем' aNavRec = Range («A2: D "и LR)' – Ralph

ответ

0

Единственное, что мы можем помочь вам устранить это for петли в середине вас код. Остальное кажется необходимым.

Option Explicit 

Sub Import_NAVRec() 

Dim LR As Long 
Dim MyPath As String 
Dim aNavRec As Variant        'Defines NAV Rec array 
Dim tempbook As Workbook 
Dim CA As Long, cB As Long, cC As Long 

MyPath = Range("B2")        'Defines cell that contains path to source file 
Workbooks.Open (MyPath)        'Opens file 
Set tempbook = ActiveWorkbook      'Names workbook 
LR = Range("A65000").End(xlUp).Row     'finds last row in sourcefile 

cName = "Accounting Basis" 
CA = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 
cName = "Accounting Date" 
cB = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 
cName = "Asset Currency" 
cC = Cells.Find(What:=UCase(cName), After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Column 

aNavRec = Application.Index(Range("A:AZ"), Application.Evaluate("Row(1:" & LR & ")"), Array(CA, cB, cC)) 

tempbook.Close 
End Sub 

С Option Explicit еще немного Dim были необходимы (которые я включил в приведенном выше soluion).

Примечание: только что нашел это решение здесь: use variable for row_num application.index

Смежные вопросы