2016-12-21 4 views
0

Ich würde gerne wissen, wie dies zu tun ist, wenn möglich. Ich habe die arrayC (26) wie folgt definiert:VBA - Erstellen Sie ein Array aus einem anderen Array

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 

Basierend auf dem Wert einer anderen Zelle, wenn sie einen Wert von 3 hat möchte ich von A nach C gehen, wenn sie einen Wert von 5 hat, wie ich Ich will von A nach E und so weiter.

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

Lassen Sie uns annehmen, dass es von A bis C. geht Also, ich möchte, dass in arrayCont (j) Ich habe folgende Werte "A, B, C". Dann gehe ich zu Cells (8, "C"), um zu prüfen, ob es gleich dem Wert im ArrayCont (j) ist. Wenn ja, möchte ich diesen Wert aus dem ArrayCont (j) entfernen. Betrachten Sie zum Beispiel Zellen (8, "C") = "B". Dann wird mein ArrayCont (j) "A, C" sein. Wie kann ich das machen?

Der Code, den ich erstellt habe, ist:

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 

Vielen Dank im Voraus.

+0

keine Antwort, aber 'arrayC' ist nicht das, was Sie denken, es ist - Es hat leere Strings für die ersten 26 Einträge (es beginnt bei Index 0) und dann 'ArrayC (26)' ist t er vollständige Zeichenfolge des Alphabets. Ich glaube, Sie wollen 'Dim ArrayC() ​​als String 'und' 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

Was bedeutet das 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 ",", ")? Wie Sie gesagt haben, beginnt ArrayC bei Index 0, aber wenn ich i = 1 definiere, beginnt es mit dem ersten Eintrag, richtig? – vbalearner

+0

Probieren Sie 'Debug.Print (arrayC (26))' mit Ihrem Code und 'Debug.Print (arrayC (25))' mit meinem Code aus, um den Unterschied zu sehen. – bobajob

Antwort

1

Erste, um alle Buchstaben in Ihrem Klammern Elemente in einem Array hinzufügen möchten, müssen das Array dynamisch (Dim arrayC As...) sein, und nicht statisch (Dim arrayC(26) As...). Sie können auch entweder Split verwenden, oder Sie müssen vor und nach jedem Element in Ihren Klammern " hinzufügen.

Zweite, um in „C8“, wenn der Wert zu finden innerhalb der kopierten Array gefunden wird (arrayCont), die Redim bis zu i (= 3), verwenden wir die Application.Match den Index der finden übereinstimmendes Element innerhalb des Arrays. Wenn es eine "Übereinstimmung" gibt, entfernen wir dieses Element aus dem Array.

Dritte Ich verwende ein Sub genannt „DeleteElementAt“, die aus einem Array ein bestimmtes Element entfernt, depeneds auf dem Index des Arrays Sie entfernen möchten.


My-Code (Geprüft)

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 

Sub DeleteElementAt-Code

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, ich möchte diese Werte von ArrayCont drucken von Zellen (9,3) zu Zellen (10,3), aber es wird dynamisch für andere Dimensionen tun. Der Code, den ich schrieb: Während p <= sh1.Range ("D6"). Wert - 1 sh3.Cells (8 + i, 3) = ArrayCont Wenn sh3.Cells (8 + i, 3) = ArrayCont dann Anruf DeleteElementArray (Application.Match (Cells (8 + i, 3) .Wert, arrayCont, 0) - 1, arrayCont) End If i = i + 1 p = p + 1 Wend Die definierte p ist dein Ich. – vbalearner

+0

Wenn es den Buchstaben C in Zellen (10,3) setzen muss, gibt es Laufzeitfehler Typ 13. Können Sie mir bitte helfen? – vbalearner

+0

Ich bin jetzt zu Hause, werde versuchen, es heute Abend zu sehen, wenn nicht dann morgen bei der Arbeit –

Verwandte Themen