2016-12-21 15 views
0

可能であれば、これを行う方法を知りたいと思います。それは私はそれが5の値を持っている場合はAからCに行きたい3の値を持っている場合、私は、別のセルの値に基づいてVBA - 別の配列から配列を作成する

Dim arrayC(26) As String 
arrayC(26) = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z" 
Dim i As Integer 'Position in the arrayC(26) 
i = 1 

:私はとarrayC(26)を定義していますAからEに行きたいと思っています。

Dim j As Integer 
j = 1 
ReDim arrayCont(j) As Variant 

私たちは、それはそうからC.に行くと仮定しましょう、私はarrayCont(j)の中で、私は次の値 "A、B、C" を持っていることを望みます。それから、ArrayCont(j)の値と等しいかどうかを調べるためにCells(8、 "C")に行きます。もしそうなら、arrayCont(j)からその値を削除したいと思います。たとえば、Cells(8、 "C")= "B"とします。次に、私のarrayCont(j)は "A、C"になります。これどうやってするの?

私が作成したコードは次のとおりです。

Do While p <= sh1.Range("D6").Value 
For p = 1 To sh1.Cells(6, "D").Value 
    If sh3.Cells(8, "C").Value = arrayC(p) Then 
    arrayCont(j) = arrayCont(j) 
    Else 
    arrayCont(j) = arrayC(p) 
    End If 
Next p 
j = j + 1 
Loop 

は、事前にありがとうございます。

+0

ない答えが、 'arrayC'は、あなたがそれだと思うものではありません - 最初の26エントリ(インデックス0から始まる)の空文字列があり、 'arrayC(26)'はt彼はアルファベットの完全な文字列です。私はあなたが 'Dim配列C()As String'と 'arrayC = Split(" A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P "Q、R、S、T、U、V、W、X、Y、Z"、 "、") " – bobajob

+0

arrayC = Split(" A、B、C、D、E、F、G、 O、P、Q、R、S、T、U、V、W、X、Y、Z "、" あなたが言ったように、arrayCはインデックス0から始まりますが、私がi = 1を定義している場合、最初のエントリから始まります。 – vbalearner

+0

あなたのコードと 'Debug.Print(arrayC(25))'で 'Debug.Print(arrayC(26))'を試してみてください。 – bobajob

答えて

1

まず、配列内の要素にあなたの括弧内のすべての文字を追加するために、配列は(Dim arrayC(26) As...)(Dim arrayC As...)、動的、および静的でないようにする必要があります。また、Splitを使用するか、かっこ内の各要素の前後に"を追加する必要があります。

、「C8」の値は、IまでRedimであるコピー配列(arrayCont)の中に発見された場合見つけるために(= 3)、我々は、のインデックスを見つけるためにApplication.Matchを使用配列内の一致する要素"一致"がある場合は、その要素を配列から削除します。

第三私が使用していますSub配列から特定の要素を削除し、「DeleteElementAt」、呼ば削除する配列のインデックスにdepeneds。


マイコード(テスト済み)

Option Explicit 

Sub SubArrayfromArray() 

Dim arrayC As Variant 
Dim i As Integer 'Position in the arrayC(26) 
Dim arrayCont As Variant 

' this is the way to put all the strings inside the brackets in an array (type Variant) in one line of code 
arrayC = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z") 
i = 3 ' i is the value of another worksheet cell 

' copy original dynamic array to destination dynamic array 
arrayCont = arrayC 

' redim the copied array up to 3 (from 0 to 2) 
ReDim Preserve arrayCont(0 To i - 1) 

' value in Range C8 >> if "B" was found inside the arrayCont >> remove it from the array 
If Not IsError(Application.Match(Range("C8").Value, arrayCont, 0)) Then 
    Call DeleteElementAt(Application.Match(Range("C8").Value, arrayCont, 0) - 1, arrayCont) 
End If 
' for debug only 
'For i = LBound(arrayCont) To UBound(arrayCont) 
' MsgBox "Array element " & i & " Value is " & arrayCont(i) 
'Next i 

' Edit 1: place arrayCont result in Cells(9, 3) >> Range("C9") 
Range("C9").Resize(UBound(arrayCont) + 1, 1).Value = Application.Transpose(arrayCont) 

End Sub 

サブDeleteElementAtコード

Public Sub DeleteElementAt(ByVal ArrIndex As Integer, ByRef myArr As Variant) 

' this sub removes a certain element from the array, then it shrinks the size of the array by 1  
Dim i As Integer 

' move all element back one position 
For i = ArrIndex + 1 To UBound(myArr) 
    myArr(i - 1) = myArr(i) 
Next 

' shrink the array by one, removing the last one 
ReDim Preserve myArr(UBound(myArr) - 1) 

End Sub 
+0

Shai Radoです。これらの値をarrayContセル(9,3)からセル(10,3)に変更されますが、他のディメンションに対しても動的に処理されます。もし私が書いたコード: p <= sh1.Range( "D6")の間に値1 sh3.Cells(8 + i、3)= arrayCont sh3.Cells(8 + i、3)= arrayCont次いで コールDeleteElementArray(Application.Match(セル(8 + I、3).Valueの、arrayCont、0) - 1、arrayCont) END IF I = I + 1 P = P + 1 Wendの定義あなたは私です。 – vbalearner

+0

セル(10,3)に文字Cを入れなければならないときは、ランタイムエラータイプ13が返されます。 – vbalearner

+0

私は家にいます。今夜はそれを見てみるつもりです –

関連する問題