Anzeige
Archiv - Navigation
1276to1280
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

Vektor bedingt füllen

Vektor bedingt füllen
Julia
Hallo liebe Herber - User,
habe mir eine Funktion geschrieben, die eine bestimmte Verteilung (beispielsweise Gewichtsmessungen von Obst) auf- oder absteigend sortiert und die Elemente in n gleiche Untermengen verteilt, um so bspw die ersten 20%, die zweiten 20% etc. zu unterteilen. Diese Funktion "Quantil_NO" wird in Spalte D genutzt.
Nun möchte ich zusätzlich die Verteilung nach Sorten (hier: Obstsorten) unterteilen und dann erst die ersten 20%, die zweiten 20% etc. bestimmen. Gedanklich würde funktionieren, indem einfach der modifizierte Meßvektor "mod_Matrix" nur mit den Werten aus "Matrix" befüllt wird, die zu dem j-ten Element gehören (bspw. nur "Obst"). Diese Funktion "Quantil_NO_Sector" wird in Spalte D genutzt.
Nur an dieser Schleife hakt VBA bzw iteriert nicht durch die Schleife:
For j = 1 To n
If Sector = Sector_Mat(j) Then
mod_Matrix(j) = Matrix(j)
Else
End If
Next j
könnte mir jemand auf die Sprünge helfen, was das falsch ist?
https://www.herber.de/bbs/user/81719.xls
MfG,
Julia

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Rein formal gar nichts, ...
05.09.2012 19:07:27
Luc:-?
…Julia,
denn wir wissen ja weder ob n>1 ist noch ob Sector bzw Sector_Mat u/o Matrix (in erforderlicher Länge) existieren oder die If-Bedingung immer erfüllt ist bzw was sonst passieren soll oder gar welche Fehlermeldung du erhältst… :->
Übrigens, warum schreibst du dafür eine neue Fkt? Man kann doch die alte sicher auch mit einer Vorauswahl per StandardFml im TabBlatt (oder entsprd vorbereitet in einer Subroutine) benutzen oder hast du die nicht flexibel genug geschrieben?! Dann solltest du das aber tun — Bspp für eine derartige Argument-Deklaration gibt's sicher etliche im Archiv.
Gruß Luc :-?

Anzeige
Rudis AW hat mich veranlasst, doch noch ...
05.09.2012 20:46:51
Luc:-?
…deine Datei anzusehen, Julia,
was normalerweise bei Posten eines Pgms nicht unbedingt nötig ist, wenn das denn aussagekräftig wäre!
Daraus resultieren ff Tipps:
Das Fehlen des 6., nicht-optionalen Arguments wäre im TabBlatt dann nicht schädlich, wenn du mit If IsMissing(…) Then … = … einen Ersatz bereitstellen würdest. Allerdings muss das ; vor dem Argument dann immer angegeben wdn. Bei Aufruf der Fkt aus einer Subroutine heraus würde sich die VBE-Syntax-Kontrolle aber dagg spreizen → Optional müsste dann immer angegeben wdn. Diesen Effektunterschied nutze ich gelegentlich.
Aber wie gesagt und nun auch gesehen halte ich die 2.Fkt für unnötig, wenn du in der 1. für das 1.Arg auch Datenfelder zulassen würdest, was du mit As Range aber definitiv ausschließt. Keine Angabe (bzw As Variant) wäre die bessere, weil flexiblere Wahl. Allerdings wäre dann der Pgmieraufwand etwas höher, wenn man das ordentl machen will. Wohl auch der Grund, weshalb MS bei einigen späteren Fktt wie RANG zum Ärger der Nutzer darauf verzichtet hat. As Range verwende ich idR nur, wenn es definitiv um Eigenschaften geht, die nur ein Bereich (Range) haben kann.
Übrigens, wenn du meinen Vorschlag aufgreifst, kannst du dieses Argument auch generell in ein Datenfeld umwandeln. Das kann dann auch 1dimensional sein, falls es horizontal orientiert ist. In allen anderen Fällen sind auch xlVektoren (wie es Rudi für Bereiche sagte) stets 2dimensional → ein vertikal orientiertes Datenfeld zB (x, 0). Außerdem gibt's noch einen anderen Datenfeldtyp (Variant), aber das würde jetzt zu weit führen, dazu gibt's auch Einiges im Archiv.
Gruß Luc :-?

Anzeige
AW: Rein formal gar nichts, ...
05.09.2012 21:48:27
Julia
Hi Luc und Rudi,
vielen Dank für Eure Anmerkungen. Jetzt läuft der Code. Bei sowas ist VBA wirklich sehr viel unintuitiver als bspw Matlab...
MfG,
Julia

AW: Vektor bedingt füllen
05.09.2012 19:26:14
Rudi
Hallo,
1. verlangt deine function 6 Parameter. Du hast aber nur 5 angegeben.
2. Range-Variablen sind immer 2-dimensional (Zeile, Spalte)
3. mod_matrix muss ein Variant sein, kein Range.
So läuft sie zumindest durch:
n = WorksheetFunction.Count(Matrix)
ReDim mod_Matrix(1 To n)
For j = 1 To n
If Sector = Sector_Mat(j, 1) Then
mod_Matrix(j) = Matrix(j, 1)
End If
Next j

Gruß
Rudi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige