2011-07-21 47 views
19

我知道你可以很容易地取一些單元格並將它們放到一個Variant數組中,但我想使用一個字符串數組(因爲它是單維的,佔用的內存比一個Variant數組)。Excel VBA:範圍到1個步驟中的字符串數組

有沒有辦法自動將範圍轉換爲字符串數組?

現在我正在使用一個函數,它將採用範圍並將值保存在變量數組中,然後將變量數組轉換爲字符串數組。它的工作很好,但我正在尋找一種方法,直接從範圍到字符串數組。任何幫助將不勝感激。

Function RangeToArray(ByVal my_range As Range) As String() 

Dim vArray As Variant 
Dim sArray() As String 
Dim i As Long 

vArray = my_range.Value 
ReDim sArray(1 To UBound(vArray)) 

For i = 1 To UBound(vArray) 
    sArray(i) = vArray(i, 1) 
Next 

RangeToArray = sArray() 

End Function 

UPDATE: 它看起來像沒有辦法第一它轉換爲一維字符串數組之前跳過數據擲入變量陣列的步驟。如果這是真的,那真可惜(即使它不需要太多的努力,我喜歡超優化,所以我希望有一種方法可以跳過這一步)。如果沒有解決方案出現,我會在幾天內解決問題。感謝有用的評論,夥計們!

UPDATE2: 回答西蒙,他付出了很大的努力(所有人都這麼做),並且很好地指出,從一個鏡頭範圍到字符串陣列確實是不可能的。感謝大家。

+0

有,你可以在VBA訪問創建一個非常有效的作用於數組轉換直接內存操作例程。我沒有時間和技巧來鞭打一個,儘管我在主應用程序中有一些內存映射代碼,所以它就在那裏,並且會幫助您製作一個非常高效的陣列複製程序。 –

+1

我給出的一些內存函數的鏈接是[here](http://superuser.com/questions/196565/how-to-merge-data-from-two-differently-structured-excel -files/196577#196577)。 –

+0

儘管我無法將鏈接中的信息應用於此特定問題,但它是一個很好的閱讀和有趣的內容。感謝您的鏈接。 – aevanko

回答

10

......怎麼

Public Function RangeToStringArray(theRange As Excel.Range) As String() 

    ' Get values into a variant array 
    Dim variantValues As Variant 
    variantValues = theRange.Value 

    ' Set up a string array for them 
    Dim stringValues() As String 
    ReDim stringValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) 

    ' Put them in there! 
    Dim columnCounter As Long, rowCounter As Long 
    For rowCounter = UBound(variantValues, 1) To 1 Step -1 
     For columnCounter = UBound(variantValues, 2) To 1 Step -1 
      stringValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) 
     Next columnCounter 
    Next rowCounter 

    ' Return the string array 
    RangeToStringArray = stringValues 

End Function 
+1

我有一個函數,它需要一個變體數組,並將其設置爲一個字符串數組(發佈時有問題)。尋找一種跳過這一步的方法! – aevanko

+1

啊......我的不好。真的沒有辦法跳過這一步,儘管簡單地調用一個函數進行轉換有什麼問題?它只有大約10個額外的代碼字符... –

+0

@SimonCowen,但是在你的函數中有數百個字符,儘管沒有更少,但仍然可以工作 – iliketocode

2
Function RangeToStringArray(myRange as range) as String() 

    ReDim strArray(myRange.Cells.Count - 1) As String 
    Dim idx As Long 
    Dim c As Range 
    For Each c In myRange 
     Set strArray(idx) = c.Text 
     idx = idx + 1 
    Next c 

    RangeToStringArray = strArray 
End sub 
1

如果你不介意改變剪貼板的內容,那麼:

  1. COPY的範圍與方法複製到剪貼板:

    MyTargetRange.Copy 
    
  2. 將剪貼板中的內容複製到字符串變量(搜索此站點或其他位置,以便將函數傳遞到剪貼板或從剪貼板傳輸字符串)。

  3. 分割字符串成變量數組:

    MyStringArray = Split(MyClipboardText, vbCrLf) 
    
  4. 選購:數組將有一個額外的空白元素,因爲總是有文字的末尾額外回報(vbCrLf)你剛纔複製到剪貼板。要刪除只是調整陣列:

    Redim Preserve MyStringArray(Ubound(MyStringArray) - 1) 
    

非常簡單和快捷!

缺點是剪貼板可能會改變,當你至少期望它(在重新計算過程中),它只會產生字符串數組(不是雙精度或其他數值類型)。

如果您正在使用大量使用相同數據(數千個數據點)的重複函數(數千個),這將非常有幫助。第一次調用函數時,對所需數據範圍進行所有中間計算,但將結果保存在靜態變量中。還可以通過剪貼板保存輸入範圍的字符串副本。在隨後每次調用函數時,再次通過剪貼板將輸入範圍轉換爲文本,並與保存的副本進行比較。如果他們是相同的,你可能會繞過你的初步計算的分配。

+0

也許有人可以添加到如何複製到剪貼板並再次檢索它而不改變最高剪貼板數據。也許通過API? –

3

實際上,您可以使用函數Split,Join和分隔符不在文本中直接從範圍轉到數組。

假設你已指定的值的範圍1D作爲SrcRange

Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#") 
+1

這是唯一回答完整問題「Range to String Array ** in 1 step **」。從Office 2010開始,轉置方法通過WorksheetFunction對象進行訪問。 'WorksheetFunction.Transpose(SrcRange)' – lonestorm

+0

當我嘗試在Excel 2016中執行此操作時,我得到'無效的過程調用或參數'。 – nhinkle

0

VBA中使用的命名範圍已經陣列。因此,首先將範圍轉換爲命名範圍,然後引用它並刪除命名範圍。 例如:

ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") 
a = Sheet1.Range("test_array") 
ThisWorkbook.Names("test_array").Delete