2016-03-22 21 views
0

Ich habe es mit einem großen Datensatz zu tun, in dem jede dritte Spalte Werte enthält, für die ich eine Funktion ausführen muss, die den Wert 1 hat, wenn sie positiv ist -1 wenn es negativ ist. Das Schreiben der Funktion selbst ist kein Problem, aber die Dimensionen der Datenmatrix sind groß und die Spalten sind nicht gleich lang. Daher müsste ich in der Lage sein, einen Code zu schreiben, der die Spalten durchläuft, die Aufgabe ausführt, und die Ergebnisse in einer anderen Matrix mit der gleichen Anzahl von Spalten und Zeilen derselben Länge speichert. Um konkreter, ein Beispiel des Datensatzes, mit denen ich zu tun und was ich will, erreichen:Looping einer Funktion über Spalten mit unterschiedlicher Anzahl von Zeilen in VBA

x1;x2;x3;x4 
1;-1;2;4 
-5;1;2;-1 
1; ;2;1 
3; ; ;-4 
5; ; ; 
6; ; ; 

und übertragen diese in:

y1;y2;y3;y4 
1;-1;1;1 
-1;1;1;-1 
1; ;1;1 
1; ; ;-1 
1; ; ; 
1; ; ; 

x und Bedürfnis y auf der gleichen Reihe zu sein .

Vielen Dank im Voraus!

EDIT: In Wirklichkeit, was mit ich zu tun habe ist etwas, das mehr wie folgt aussieht:

Timestamp Last Trade Volume Timestamp Last Trade Volume Timestamp Last Trade Volume Timestamp Last Trade Volume 
4.1.2016 13:34 3.12 3300 4.1.2016 13:34 7.82 100 4.1.2016 13:34 4.58 3000 4.1.2016 13:35 4.59 #N/A 
4.1.2016 13:34 3.12 600 4.1.2016 13:34 7.83 300 4.1.2016 13:34 4.58 5750 4.1.2016 13:34 4.61 1000 
4.1.2016 13:34 3.12 1000 4.1.2016 13:34 7.85 200 4.1.2016 13:34 4.59 300 4.1.2016 13:34 4.61 9500 
4.1.2016 13:34 3.12 800 4.1.2016 13:34 7.85 500 4.1.2016 13:34 4.59 2000 4.1.2016 13:34 4.6 2200 
4.1.2016 13:34 3.12 1200 4.1.2016 13:34 7.85 1700 4.1.2016 13:34 4.59 1000 4.1.2016 13:34 4.6 1200 
4.1.2016 13:34 3.12 400 4.1.2016 13:34 7.85 100 4.1.2016 13:34 4.59 950 4.1.2016 13:33 4.6 500 
4.1.2016 13:34 3.12 600 4.1.2016 13:34 7.85 200 4.1.2016 13:34 4.59 100 4.1.2016 13:33 4.6 2000 
4.1.2016 13:34 3.11 4500 4.1.2016 13:34 7.85 1800 4.1.2016 13:34 4.59 750 4.1.2016 13:33 4.61 7500 
4.1.2016 13:34 3.11 300 4.1.2016 13:34 7.82 2000 4.1.2016 13:34 4.58 500 4.1.2016 13:33 4.59 1400 
4.1.2016 13:34 3.11 3700 4.1.2016 13:34 7.83 1000 4.1.2016 13:34 4.59 2000 4.1.2016 13:33 4.59 11000 

Abgesehen davon, dass die Reihen sind nicht gleich lang, ich habe mehr als 300 Spalten und die längsten Reihen über 100.000+ lang. Ich muss in der Lage sein, dieses Ding nur über die letzten Spalten laufen zu lassen, ich habe einen anderen Code, der über die Volume-Spalte läuft. Ich bin völlig in Ordnung mit einer Lösung, die mir erlaubt, eine Zelle einschließlich der Formel für eine Spalte mit entsprechender Länge einfügen, aber Einfügen des Codes über das gesamte Array ist nicht machbar, weil es das gesamte Excel zum Absturz bringen wird, dh ich muss in der Lage sein um die Zellen wegzulassen, die keine Werte haben, bilden die Schleife.

+1

Was haben Sie bis jetzt programmiert? Bitte fügen Sie Ihrer Frage Ihren VBA-Code hinzu. Ich wäre besonders daran interessiert, die Funktion zu sehen, die kein Problem darstellt. – Ralph

+0

Sie sagten "jede dritte Spalte", aber die Beispiele, die Sie gaben, scheinen auf jede Spalte zu wirken. wie ist das? – user3598756

+0

Hinzugefügt ein Beispiel der tatsächlichen Datei. Danke für die Klärung. – Ana

Antwort

0

Entschuldigung, ich habe nicht den Code vor mir, aber ich denke, ich kann immer noch helfen.

Was ist mit xlLastCell? Ich meine, das ist vielleicht nicht das effizienteste, aber das wäre am einfachsten. Holen Sie sich einfach die Zeile und Spalte von xlLastCell, und für Zeile = 1 nach lastrow, für col = 1 bis lastcol, wenn es leer ist, dann nächste Spalte/nächste Zeile, wenn abs (cell.value) = cell.value dann Blätter (2) .cells (row, col) = 1, sonst = -1. Du hast jede dritte Spalte erwähnt, ich würde dann einfach einen if .row mod 3 = (1,2,0, je nachdem, was du benötigst) verwenden, um zu entscheiden, ob du als nächstes die Spalte spalten oder tun sollst. Jetzt funktioniert das nur, wenn Sie mit "einer anderen Matrix" nur eine andere Tabelle meinen. Wenn Sie ein 2D-Array meinen, könnten Sie xlLastCell finden und dann Matrix (lastrow, lastcol) als int redimensionieren und alles in die Matrix anstatt in sheet2 einfügen. Oder, wenn Sie etwas völlig anderes meinen, dann entschuldige ich mich, und ich bin mir nicht sicher.

+0

Ich sehe die Bearbeitung, die Sie heute morgen gemacht haben. Ich bin mir immer noch nicht sicher, warum die Ausführung einer Schleife mehr als 30 Millionen Mal zum Absturz führen würde, aber wenn Sie dieses Problem haben, empfehle ich Ihnen, die Daten neu zu formatieren. – CWilson

+0

Nicht ganz so einfach wie das, was ich vorgeschlagen habe, aber immer noch ziemlich einfach. Sie könnten etwas Fantasievolles programmieren, wenn Sie wollten, aber da wir nur über 300-400 Spalten sprechen, wäre es schneller, nur ein Makro aufzunehmen. Markieren Sie Spalten D-F, Ausschneiden, neues Blatt (oder besser eine Datenbanktabelle in etwas, das Daten enthalten soll, auch Access würde funktionieren, aber nicht mein Anruf), fügen Sie in A1 ein, wechseln Sie zurück zum ursprünglichen Blatt. Stoppen Sie die Aufnahme, fügen Sie einen Hotkey hinzu und drücken Sie den Hotkey etwa hundert Mal. – CWilson

Verwandte Themen