配列の最後に要素を追加する


14

VBA配列の最後に値を追加したいと思います。これどうやってするの?オンラインで簡単な例を見つけることができませんでした。ここに私が何をしたいのかを示すいくつかの疑似コードがあります。

Public Function toArray(range As range)
 Dim arr() As Variant
 For Each a In range.Cells
  'how to add dynamically the value to end and increase the array?
   arr(arr.count) = a.Value 'pseudo code
 Next
toArray= Join(arr, ",")
End Function

既存の配列の最後に値を追加するという考えですか?それとも範囲を配列にロードしたいだけの例ですか?後者の場合、ワンライナーを使用しないのはなぜarr = Range.Valueですか?
Excellll

回答:


10

これを試してください[編集済み]:

Dim arr() As Variant ' let brackets empty, not Dim arr(1) As Variant !

For Each a In range.Cells
    ' change / adjust the size of array 
    ReDim Preserve arr(1 To UBound(arr) + 1) As Variant

    ' add value on the end of the array
    arr (UBound(arr)) = a.value
Next

おかげで、残念ながらこれは機能しません。たとえば、いくつかの寸法で初期化されるUBound(arr)必要がarrありますDim arr(1) As Variantが、後でReDim Preserve失敗し、配列がすでにディメンション化されていると言っていますか?言い換えると、VBAで配列をredimできませんか?
megloff

msdn.microsoft.com/library/w8k3cys2.aspxによると、次のことができるはずです...
duDE

msdnの例は、Excel VBAでも機能しません。同じエラー、配列はすでにディメンション化されていると不平を言う
megloff

配列aの代わりに使用Collectionし、後で配列に変換する必要があるようです。他に何か提案はありますか?
megloff 2014

2
ありがとうございます。ただし、前述のようにUBound(arr)、すでにディメンション化された配列が必要なため、この方法では問題ありません。そうですね、代わりにコレクションを使わなければならないようです。とにかくありがとう
megloff 2014

8

コレクションを使用して問題を解決し、後でそれをアレイにコピーしました。

Dim col As New Collection
For Each a In range.Cells
   col.Add a.Value  '  dynamically add value to the end
Next
Dim arr() As Variant
arr = toArray(col) 'convert collection to an array

Function toArray(col As Collection)
  Dim arr() As Variant
  ReDim arr(0 To col.Count-1) As Variant
  For i = 1 To col.Count
      arr(i-1) = col(i)
  Next
  toArray = arr
End Function

2
コレクションを使用する場合は、ディクショナリオブジェクトを使用することもできます。`Set col = CreateObject(" Scripting.Dictionary ")`次に、Keysを配列として直接出力し、追加した関数をスキップできます。 `arr = col.keys` <= Array
B Hart

3

これは、バリアント(配列)変数を使用して行う方法です。

Dim a As Range
Dim arr As Variant  'Just a Variant variable (i.e. don't pre-define it as an array)

For Each a In Range.Cells
    If IsEmpty(arr) Then
        arr = Array(a.value) 'Make the Variant an array with a single element
    Else
        ReDim Preserve arr(UBound(arr) + 1) 'Add next array element
        arr(UBound(arr)) = a.value          'Assign the array element
    End If
Next

または、(たとえば、Shapes.Rangeなどのプロパティに渡すために)バリアントの配列が実際に必要な場合は、次の方法で行うことができます。

Dim a As Range
Dim arr() As Variant

ReDim arr(0 To 0)                       'Allocate first element
For Each a In Range.Cells
    arr(UBound(arr)) = a.value          'Assign the array element
    ReDim Preserve arr(UBound(arr) + 1) 'Allocate next element
Next
ReDim Preserve arr(LBound(arr) To UBound(arr) - 1)  'Deallocate the last, unused element

おかげで、ReDim arr(0 To 0)を使用してから、次の要素を割り当てることができました
Vasile Surdu 2018

1

範囲が単一のベクトルで、列の場合、行数が16,384未満の場合は、次のコードを使用できます。

Option Explicit
Public Function toArray(RNG As Range)
    Dim arr As Variant
    arr = RNG

    With WorksheetFunction
        If UBound(arr, 2) > 1 Then
            toArray = Join((.Index(arr, 1, 0)), ",")
        Else
            toArray = Join(.Transpose(.Index(arr, 0, 1)), ",")
        End If
    End With
End Function

0

どうも。それが私のような他の初心者を助けることができるなら、2つの関数で同じことをする:

コレクション

Function toCollection(ByVal NamedRange As String) As Collection
  Dim i As Integer
  Dim col As New Collection
  Dim Myrange As Variant, aData As Variant
  Myrange = Range(NamedRange)
  For Each aData In Myrange
    col.Add aData '.Value
  Next
  Set toCollection = col
  Set col = Nothing
End Function

1D配列:

Function toArray1D(MyCollection As Collection)
    ' See http://superuser.com/a/809212/69050


  If MyCollection Is Nothing Then
    Debug.Print Chr(10) & Time & ": Collection Is Empty"
    Exit Function
  End If

  Dim myarr() As Variant
  Dim i As Integer
  ReDim myarr(1 To MyCollection.Count) As Variant

  For i = 1 To MyCollection.Count
      myarr(i) = MyCollection(i)
  Next i

  toArray1D = myarr
End Function

使用法

Dim col As New Collection
Set col = toCollection(RangeName(0))
Dim arr() As Variant
arr = toArray1D(col)
Set col = Nothing


0
Dim arr()  As Variant: ReDim Preserve arr(0) ' Create dynamic array

' Append to dynamic array function
Function AppendArray(arr() As Variant, var As Variant) As Variant
    ReDim Preserve arr(LBound(arr) To UBound(arr) + 1) ' Resize array, add index
    arr(UBound(arr) - 1) = var ' Append to array
End Function
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.