2016-01-04 66 views
2

我試圖設置一個工作流程/ UX,其中導入一個CSV文件,並且每個導入文件的列被分配一個「數據類型」,在每個頂部使用下拉列表柱。一旦這些數據類型被指定/分配給每一列,另一個宏將使用導入的CSV數據填充第二張表格,其中新表格中的位置取決於爲導入數據的每列指定的數據類型。創建一個包含未賦值變量的Excel VBA數組作爲條目

例如,如果導入數據的第一列是數據類型「DataA」,則將爲第一列選擇下拉選擇(從下拉菜單中的總共12個「數據類型」開始) 。這個「DataA」數據將被填充到第五列的第二張表格中。

下面是代碼我迄今爲止:

Dim DataA As Integer, DataB As Integer, DataC As Integer, DataD As Integer, DataE As Integer, DataF As Integer, DataG As Integer, DataH As Integer, DataI As Integer, DataJ As Integer, DataK As Integer, DataL As Integer 

    Dim ColArray(12) As Variant 

    For p = 1 To LastColImport 'This is a previously-defined/assigned variable 

     q = 1 

     Do While q <= 12 

     If ActiveSheet.DropDowns(p).Value = q Then 

      ColArray(q) = p 

      Exit Do 

      Else 

      q = q + 1 

     End If 

     Loop 

    Next p 

如果還沒有選擇它這填充ColArray陣列的整數條目如果數據類型被選擇時,或一個空條目。我想要做的下一步是將每個ColArray條目值分配給一個命名變量,以便我可以通過數據類型名稱調用ColArray條目值,而不必記住或查找每個ColArray整數值引用的數據類型。

我無法找到一個內置的「下拉列表中的區域名稱」召回任何地方的功能,所以我想做的是以下幾點:

Dim ColArrayNames(12) As Variant 

ColArrayNames(1) = DataA 'These variables were defined in the previous code block 
ColArrayNames(2) = DataB 

... 

ColArrayNames(12) = DataL 


ColArrayNames = ColArray 

我認識到,在這種特定的情況下,將數據類型變量直接分配給ColArray值可能會更容易,而不是將它們放入數組中,然後等同於數組值。我覺得在未分配變量的數組中填充數組在其他情況下也是有用的。我嘗試使用這種分配變量的方法失敗了。

改變代碼的最後一行後:

For i = 1 to 12 

ColArrayNames(i) = ColArray(i) 

Next i 

ColArray值不會分配給數據類型的變量。也就是說,ColArrayNames條目被分配了正確的值,因此問題似乎是通過未分配變量數組的方式將ColArray值分配給數據類型變量的「最後一步」。

如果有人對如何解決使用未分配變量數組爲每個數組條目賦值(同時保留使用條目的「原始」變量名稱調用這些值的能力)這一「常規」問題提出建議,或者如果有更有效的方式來完成這個電子表格功能,請讓我知道!

編輯1:根據John Coleman的要求,我會詳細介紹一下我在這裏要做的事情。

曾經有分配給數據類型導入的列數,我要一些代碼以這樣的方式將數據發送到一個第二片,例如:

For i = 2 to LastRow 'The LastRow variable value will be found using a simple xlDown search process 

Worksheets(2).Cells(1,i).Value = Worksheets(1).Cells(DataA,i).Value 
Worksheets(2).Cells(4,i).Value = Worksheets(1).Cells(DataB,i).Value 

Etc. 

Next i 

同樣,我發現我能很容易地使用

Worksheets(2).Cells(1,i).Value = Worksheets(1).Cells(ColArrayNames(1),i).Value 

等等,但我覺得,如果我要問的是可能的,我也許可以用它在另一種情況下(即使它不是最理想的方法,這例)。

+0

我不太知道你正在嘗試做的,也許你可以解釋一點。我懷疑「字典」可能會有所幫助。這不是原生的VBA(它來自VBScript),而是被大多數VBA開發者用作標準工具。請參閱:http://www.techbookreport.com/tutorials/vba_dictionary.html。這將允許您從一個字符串獲取信息(這是我認爲* *您'「原始」變量names'的意思) –

+0

感謝您的答覆,約翰 - 當我有一點時間,我會更新原始包括「下一步」。粗略地說,我想要做的是能夠用一些代碼填充第二個工作表,例如'For i = 2到LastRow Worksheets(2).Cells(1,j)= Worksheets(1).Cells(DataA,j)'等等每個數據類型列。因爲我知道數據類型應該在第二個工作表的列中,但第一個工作表是可變的(取決於導入的數據)。這樣我可以使用數據類型變量而不是ColArray位置從導入的數據調用適當的數據類型。 –

+0

好吧,我已經爲你更新了原始文章@JohnColeman,希望它現在更有意義! –

回答

0

對於作爲最好的,我明白你的問題,它似乎歸結爲有效(高效地)定義原來的源數據和格式化輸出(在這種情況下,在第二工作表單元)之間的數據映射。當遇到問題的數據分類部分時,我意識到目標數據類型的最終「持有者」是持有它的對象 - 在本例中,它是工作表單元格,而不是VBA變量或數組。您的注意力集中在VBA代碼上,該代碼將數據從一個工作表傳輸到另一個工作表(或從/從變體陣列)。您在效率方面的選擇應該是您的指導。如果你想使用相對通用的代碼,多種數據類型,我的建議是使用Variant值或數組複製到目標小區後,設置目標單元格的格式(這有效地「種」它不管什麼以後使用必要)。

字典甚至可能不是必要的,如果映射表可以靈活地掃描,以容納任何數量的數據類型,格式,或列。

+0

我想我用一種不同於解釋它的方式使用術語「數據類型」。我在「數據所指的內容」(例如「質量」,「速度」,「高度」)的上下文中使用「數據類型」,而不是代碼數據類型(例如「整數」,「長「,」字符串「)。目前,我已將工作表導入爲「常規」,並以相同的方式處理它們。數據類型與我的輸出的相關性在輸出表中它的放置位置(輸入是非標準列排列/順序,輸出是標準列排列/順序)。 –

+0

我還沒有機會看看字典用法,因爲它似乎可能是沒有必要的,我在這裏嘗試做什麼(儘管我想它可能值得在其他情況下使用)。 –

相關問題