Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1400to1404
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array finde Fehler nicht

Array finde Fehler nicht
06.01.2015 10:35:09
Blaumann
Hi,
habe ein Array
Dim arr(1 To 200) As Variant
dieses soll in einer Schleife so gefüllt werden
arr(i - 7) = ActiveSheet.Cells(6, x).Value (i = 8)
es passiert aber nichts, es gibt kein Fehler aber es steht auch nichts drin
Wenn ich in eine Zelle schreibe ist aber alles in Ordnung
.Cells(j, i).Value = ActiveSheet.Cells(6, x).Value
Gruß Peter

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array finde Fehler nicht
06.01.2015 10:38:28
Rudi
Hallo,
wie soll man den minimalen Angaben helfen?
Gruß
Rudi

AW: Array finde Fehler nicht
06.01.2015 10:41:12
Jack_d
Hallo Peter,
wie sieht denn die Schleife aus?
Grüße

AW: Array finde Fehler nicht
06.01.2015 11:25:05
Blaumann
Hi,
weiß zwar nicht warum die Schleife wichtig ist,da ja in die Zelle geschrieben wird
so sieht das aus

i = 8
For Each zelle In Bereich
If zelle.Height > 0 Then
j = zelle.Row - 7
If zelle.Value Like "*g*" And Not zelle.Offset(0, -1).Value Like "*g*" Then
x = zelle.Column
With Sheets("Auswertung")
.Cells(j, i).Value = ActiveSheet.Cells(6, x).Value
End With
arr(i - 7) = ActiveSheet.Cells(6, x).Value
Debug.Print arr(i - 7)
i = i + 1
x = 0
End If
Next
Gruß Peter

Anzeige
AW: Array finde Fehler nicht
06.01.2015 11:38:51
Rudi
Hallo,
der Code kann nicht funktionieren.
Es fehlt ein End If.
Gruß
Rudi

Musst du auch nicht
06.01.2015 11:42:15
Jack_d
wissen.
Also der Code so wie du ihn eingestellt hast, müsste so in der form erstmal einen Fehler erzeugen, da ein "end if" fehlt.
Ansonsten seh ich mit den gegebenen Infos keinen weiteren Fehler.
Vielleicht lädts du einfach eine Mustermappe hoch, in der die vollständige relevante Codesequenz ist, sowie die relevanten Arbeitsblätter.
Grüße

Wie ist arr deklariert und dimensioniert? Gruß owT
06.01.2015 12:42:17
Luc:-?
:-?

steht im 1.Thread. Gruß owT
06.01.2015 12:56:57
Rudi

Aja, danke Rudi! Dann erstmal Fehler unklar! owT
06.01.2015 13:04:15
Luc:-?
:-?

AW: Aja, danke Rudi! Dann erstmal Fehler unklar! owT
06.01.2015 19:39:30
Blaumann
Hi,
das end If ist vorhanden, hatte ich nur übersehen hier rein zu kopieren.
und jetzt das Seltsame, nachdem ich den Code hier reinkopiert und die Datei geschlossen hatte und jetzt wieder probiert habe, funktioniert der Code plötzlich.
Eigentlich hätte ich mir das auch sparen können, ich wollte eigentlich mit dem Array den Code schneller machen, nur meine ich er ist sogar langsamer geworden.
Würde es etwas bringen, die Zeile komplett in das Array zu schreiben und die Auswertung dort zu machen.
Gruß Peter

Anzeige
IdR ja! Nicht doppelt moppeln! Morrn owT
07.01.2015 01:52:17
Luc:-?
:-?

AW: verstehe ich nicht
07.01.2015 11:21:40
Blaumann
Hi,
ich kenne zwar hoppel moppel doppel koppel, aber das ist eigentlich was anderes.
Die Frage ist ja ob man den Vergleich in einem Array machen kann und ob das schneller ist.
ins Array müssen in Spalte 1 die Werte aus der aktiven Zeile(spal 4-394, ab zeil 15), in Spalte 2 des Arrays die Werte aus Zeile 6.
nehme im folgenden Text X für "*g*"
Die erste Spalte sollte jetzt durchsucht werden nach X steht vor dem X kein X dann Wert aus Spalte2, steht nach Dem X kein X dann nochmal den Wert aus Spalte 2. Bei mehreren X nacheinander wird erst das letzte wieder übernommen.
Gruß Peter

Anzeige
verstehe ich nicht: dito!!! owT
07.01.2015 11:49:12
Rudi

D.h., das dauert jetzt länger, weil du beides ...
07.01.2015 15:21:05
Luc:-?
…im Zyklus machst, Peter,
obwohl du ja nur entweder das Datenfeld (Array) oder die DirektEintragung brauchst. Also entscheide dich für eines von beiden. Beides ist „doppelt gemoppelt“ wie man bei uns sagt. Ein reguläres Datenfeld kann dann auf einmal in einen ZellBereich eingetragen wdn (zB unter Verwendung von .Resize).
Was deine VglsOperationsBeschreibung betrifft, schließe ich mich Rudis Meinung an.
Gruß, Luc :-?

es soll ja nur das Array sein
07.01.2015 17:29:19
Blaumann
Hi,
ich möchte es ja mit einem Array lösen, die Direkteintragung war ja nur wie es jetzt ist. Auch weiß ich nicht was an der Auswertung unklar sein soll.
habe inzwischen folgenden Code
Sub Arraytest()
Dim arr(0 To 11, 1 To 2) As Variant
Dim arr1(1 To 20) As Variant
Dim x
Dim i
Dim k
x = ActiveCell.Row
On Error Resume Next
arr(0, 1) = ""
arr(0, 2) = ""
For i = 1 To 11
arr(i, 1) = ActiveSheet.Cells(x, i).Value
arr(i, 2) = ActiveSheet.Cells(2, i).Value
Next
k = 1
For i = 1 To UBound(arr)
If arr(i, 1) = "g" And arr(i - 1, 1)  "g" Then
arr1(k) = arr(i, 2)
k = k + 1
End If
If arr(i, 1) = "g" And arr(i + 1, 1)  "g" Then
arr1(k) = arr(i, 2)
k = k + 1
End If
Next
For i = 1 To UBound(arr1)
ActiveSheet.Cells(i + 10, 1).Value = arr1(i)
Next
End Sub
Der macht auch das was er soll, bis auf zwei Sachen
obwohl in der letzten zeile in arr(11,1) kein "g" vorhanden ist, holt er den wert aus arr(11.2)
Das Array arr1 sollte sich anpassen und nicht wie im Code eine feste Größe haben.
Gruß Peter

Anzeige
AW: es soll ja nur das Array sein
08.01.2015 11:53:36
Ewald
Hallo Peter,
eigentlich sollte das passen,speichere mal die Datei und leere am Ende die Arrays.
arr1 ist ja schon klein, warum willst du da noch was ändern.
Gruß Ewald

AW: es soll ja nur das Array sein
08.01.2015 13:29:08
Blaumann
Hi,
wie leere ich dann das Array
arr1 ist jetzt nur im Test so klein, anstatt 20 wäre da 400
Gruß Peter

AW: es soll ja nur das Array sein
08.01.2015 15:25:19
fcs
Hallo Peter,
der Fehler mit der letzten Zeile/Spalte tritt auf, weil i + 1 größer ist Ubound(arr).
Das resultiert in einen Fehler. Da du per Anweisung
On Error Resume Next
vorgegeben hast, dass bei einem Fehler die nächste Zeile ausgeführt werden soll, wird trotzdem ein Wert ins Ergebnis-Array geschrieben.
Mit nachfolgenden Anpassungen sollte das Ganze dynamisch funktionieren und durch die zusätzliche Prüfung wird der Fehler vermieden.
Man könnte arr1 auch jedes mal neu dimensionieren, wenn ein weiterer Wert hinzugefügt werden soll. Das ist aber in der Summe langsamer als das Array einmal auf die mögliche max. Anzahl von Werten zu dimensionieren und am Schluß den nicht benutzen Teil des Arrays wieder abzuschneiden.
Gruß
Franz
Sub Arraytest()
Dim arr() As Variant
Dim arr1() As Variant
Dim x
Dim i
Dim k
Dim Spalte As Long
x = ActiveCell.Row
With ActiveSheet
'Anzahl Spalten in Tabelle in Zeile x / Zeilen im Array
Spalte = .Cells(x, .Columns.Count).End(xlToLeft).Column '11
'Alt-Daten im Ausgabebereich löschen
i = .Cells(11, 1).End(xlDown).Row
If i  "g" Then
arr1(k) = arr(i, 2)
k = k + 1
End If
If i  "g" Then
arr1(k) = arr(i, 2)
k = k + 1
End If
Else
If arr(i, 1) = "g" Then
arr1(k) = arr(i, 2)
k = k + 1
End If
End If
Next
'leeren Bereich des Arrays entfernen
ReDim Preserve arr1(1 To k - 1)
For i = 1 To UBound(arr1)
ActiveSheet.Cells(i + 10, 1).Value = arr1(i)
Next
'Daten-Arrays leeren - funktioniert nur bei dynamischen Arrays!!
Erase arr1, arr
End Sub

Anzeige
AW: es soll ja nur das Array sein
08.01.2015 23:36:00
Blaumann
Hi,
das funktioniert jetzt, musste nur arr1 auf Spalte*2 setzen, da ja bei einem einzelnen "g" der Wert zweimal kommt(das ist auch so gewollt)
in dem Testcode wird nach "g" gesucht, im richtigen Code steht dort die Variable var1 diese wird in einer aüßeren Schleife immer anders gesetzt, wie im ersten geposteten Code bei der Zellenauswertung zB. so

var1 = "*g*", oder "*G*"
wenn ich aber schreibe
If arr(i, 1) = var1 And arr(i - 1, 1)  var1 Then
dann findet er nichts.
Was ist da wieder falsch
Gruß Peter

Anzeige
AW: Wertevergleich mit Array-Inhalten
09.01.2015 10:13:48
fcs
Hallo Peter,
wenn die * im Vergleichstext Joker für beliebige Zeichen sein sollen, dann musst du mit Like vergleichen, wie in dem Code beim Vergleich von Zellinhalten.
Mir ist aber nicht klar, wie beim Vergleich die Groß-/Kleinschreibung ausgewertet werden soll. Zur Zeit wird sie behandelt wie unterschiedliche Zeichen.
Gruß
Franz
  For j = LBound(arrSuch) To UBound(arrSuch)
var1 = arrSuch(j)
For i = 1 To Spalte
If arr(i, 1) Like var1 And Not arr(i - 1, 1) Like var1 Then
arr1(k) = arr(i, 2)
k = k + 1
End If
If i 

AW: Wertevergleich mit Array-Inhalten
10.01.2015 13:19:38
Blaumann
Hi Franz,
generell funktioniert das so, wenn ich aber die Schleife au0en rum setze wo ich dann jeweils var1 setze, funktioniert es nicht wenn
1. das erste var1 nicht vorhanden ist, dann ist k = 1

ReDim Preserve arr1(1 To k-1) 
ergibt Fehler
2. beide var1 vorhanden, erster Durchlauf korrekt, beim zweiten Durchlauf kommt dann Fehler

arr1(k) = arr(i, 2)
wobei arr(i, 2) den richtigen Wert hat, der Fehler ist wohl bei arr1
hängt das mit dem Erase zusammen.
Gruss Peter

Anzeige
AW: Wertevergleich mit Array-Inhalten
11.01.2015 14:39:02
fcs
Hallo Peter,
zu 1.
Baue vor der Redim-Anweisung eine entsprechende Prüfung des Wertes von k=1 ein.
zu 2.
Ich tippe mal, dass das alle Werte des arr1 belegt sind k zu groß geworden ist
vergrößere die obere Dimension des Ergebnis-Arrays in der ensprechenden Zeile.
Es dürfte nichts mit der Erase-Zeile zu tun haben, denn diese steht ja erst am Ende des Codes.
Gruß
Franz

AW: Wertevergleich mit Array-Inhalten
11.01.2015 15:17:30
Ewald
Hallo,
zu 1 alternativ kannst du auch einfach die -1 entfernen
zu 2 Ursache dürfte sein das das erste Redim für arr1 wie von Franz gepostet vor deiner Schleife steht, beim zweiten Durchlauf ist dann arr1 nur so groß wie im zweiten Redim gesetzt und damit zu klein.
Setze das erste Redim nicht vor die Schleife sondern als erstes nach dem Schleifenbefehl. Damit wird arr1 auch beim zweiten Durchlauf wieder auf benötigte Größe gesetzt.
 ReDim arr(0 To Spalte, 1 To 2)
ReDim arr1(1 To Spalte * 2)  'hier entfernen
arr(0, 1) = ""
arr(0, 2) = ""
For i = 5 To Spalte
arr(i - 4, 1) = ActiveSheet.Cells(x, i).Value
arr(i - 4, 2) = ActiveSheet.Cells(6, i).Value
Next
For j = 1 To 2
ReDim arr1(1 To Spalte * 2)  'hier einfügen
Gruß Ewald

Anzeige
AW: Wertevergleich mit Array-Inhalten
12.01.2015 23:20:43
Blaumann
Hi,
danke für eure Hilfe, jetzt klappt es.
eine Frage habe ich noch, ist die Methode in Array auswerten, dann in Tabelle schreiben, nächster Durchlauf optimal. oder wäre es besser zunächst alle Durchläufe zu machen in verschiedene Spalten in arr1 schreiben und dann erst alles in die Tabelle schreiben.
Gruss Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige