Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
620to624
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
620to624
620to624
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Datenfelder

Datenfelder
05.06.2005 21:44:49
Arnd
Hallo,
ich habe eine zweidimensionale Matrix, die ich in ein 2-D Datenfeld eingelesen habe. Ich habe nun zwei Fragen:
1. Ich muss die Differenz zwischen den beiden kleinsten Elementen jeder Zeile und Spalte bestimmen. Wie kann man einfach realisieren, ohne dass ich alle Werte miteinander vergleichen muss?
2. Ich muss entweder eine komplette Zeile oder Spalte aus dem Datenfeld löschen. Wie kann ich das geschickt lösen?
Gruss Arnd

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datenfelder
06.06.2005 00:17:22
MichaV
Hi,
mal als Ansatz:


      
Option Explicit
Option Base 1
Private Sub CommandButton1_Click()
Dim arr()
Dim tmp()
Dim s%, z%, d%
Dim maxZeilen%, maxSpalten%
With Application.WorksheetFunction
'2-D-Datenfeld aus Matrix bauen
arr = .Transpose(Range("a1:e9"))
'1. Dimension=Spalten
maxSpalten = UBound(arr, 1)
'2. Dimension=Zeilen
maxZeilen = UBound(arr, 2)
'Diff der 2 kleinsten Werte der 4. Spalte
MsgBox .Small(.Index(arr, 4), 2) - .Small(.Index(arr, 4), 1)
'Diff der 2 kleinsten Werte der 4. Zeile
MsgBox .Small(.Index(arr, 0, 4), 2) - .Small(.Index(arr, 0, 4), 1)
'4. Spalte löschen
'maxSpalten = maxSpalten - 1
'ReDim tmp(maxSpalten, maxZeilen)
'For s = 1 To maxSpalten
'  If Not s = 4 Then
'    For z = 1 To maxZeilen
'      tmp(s - d, z) = arr(s, z)
'    Next
'  Else
'    d = 1
'  End If
'Next

'oder

'4. Zeile löschen
maxZeilen = maxZeilen - 1
ReDim tmp(maxSpalten, maxZeilen)
For z = 1 To maxZeilen
  
If Not z = 4 Then
    
For s = 1 To maxSpalten
      tmp(s, z - d) = arr(s, z)
    
Next
  
Else
    d = 1
  
End If
Next
'Feld neu erstellen
Erase arr
ReDim arr(UBound(tmp, 1), UBound(tmp, 2))
arr = tmp
'Ausgabe
Range(Cells(20, 1), Cells(19 + UBound(arr, 2), UBound(arr, 1))) = .Transpose(arr)
End With
End Sub 
Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Datenfelder
06.06.2005 15:53:50
Arnd
Hallo Micha,
herzlichsten Dank für den Code. Der scheint zu machen, was er soll :-).
Ich habe aber noch eine Frage zum Indexbefehl:
.Index(arr, 4) gibt doch den Bezug zur 4. Spalte zurück.
Wenn ich mir aber die Dokumentation zu dem Befehl anschaue, würde ich als Befehl eher .Index(arr,0,4) erwarten.
Da die Syntax ja Index(Matrix, Zeile, Spalte) lautet. Was verstehe ich da nicht?
Und noch eine weitere Frage:
Kann ich mir den Index des kleinsten Wertes angeben lassen? .Small() gibt mir ja nur den absoluten Wert an.
Gruß Arnd
PS: Wollte mir die Spalte dann in ein 1-D Datenfeld ausgeben lassen, also die Matrixversion der Befehls. Dies hat leider nicht geklappt, wie muss ich das anstellen?
Anzeige
AW: Datenfelder
06.06.2005 19:57:56
MichaV
Hi,
also Deine Fragen haben mich dann doch nachdenklich gemacht und ich bin auf einen Fehler gestoßen. Transpose dreht die Matrix ja, also wurde aus Zeilen Spalten und aus Spalten Zeilen. Daher wars ein bischen durcheinander. Habe ein bischen probiert und siehe da, eine Matrix kriegt man ja einfacher in ein Array als gedacht.
Hier der überarbeitete Code, mit Deinen Wünschen. Habe auch dazugeschrieben, wie ich darauf gekommen bin, natürlich über die Excel- Formeln. Erst in Excel probieren, ob was vernünftiges rauskommt, dann in VBA umschreiben.
Nun bleibt Zeile Zeile und Spalte bleibt Spalte ;o)


      
Option Explicit
Option Base 1
Private Sub CommandButton1_Click()
Dim arr()
Dim tmp()
Dim s%, z%, d%
Dim maxZeilen%, maxSpalten%
With Application.WorksheetFunction
'2-D-Datenfeld aus Matrix bauen
arr = Range("e1:a9")
'1. Dimension=Zeilen
maxZeilen = UBound(arr, 1)
'2. Dimension=Spalten
maxSpalten = UBound(arr, 2)
'Diff der 2 kleinsten Werte der 4. Zeile
'Excel- Formel: =KKLEINSTE(INDEX(A1:E9;4;0);1)
MsgBox "Diff der 2 kleinsten Werte der 4. Zeile: " & _
       .Small(.Index(arr, 4, 0), 2) - .Small(.Index(arr, 4, 0), 1)
'Diff der 2 kleinsten Werte der 4. Spalte
'Excel- Formel: =KKLEINSTE(INDEX(A1:E9;0;4);1)
MsgBox "Diff der 2 kleinsten Werte der 4. Spalte: " & _
       .Small(.Index(arr, 0, 4), 2) - .Small(.Index(arr, 0, 4), 1)
'Pos des kleinsten Elements in Zeile 4
'Excel- Formel: =VERGLEICH(KKLEINSTE(INDEX(A1:E9;4;0);1);INDEX(A1:E9;4;0);0)
MsgBox "Pos des kleinsten Elements in Zeile 4: " & _
       .Match(.Small(.Index(arr, 4, 0), 1), .Index(arr, 4, 0), 0)
'Array Spalte 4
'Excel- Formel: {=INDEX(A1:E9;4;0)} (mit F2 - F9 auswerten)
MsgBox "2. Element des ""Array Zeile 4"": " & .Index(arr, 4, 0)(2)
'4. Spalte löschen
maxSpalten = maxSpalten - 1
ReDim tmp(maxZeilen, maxSpalten)
For s = 1 To maxSpalten + 1 '!!!
  If Not s = 4 Then
    
For z = 1 To maxZeilen
      tmp(z, s - d) = arr(z, s)
    
Next
  
Else
    d = 1
  
End If
Next
'oder

'4. Zeile löschen

'maxZeilen = maxZeilen - 1
'ReDim tmp(maxZeilen, maxSpalten)
'For z = 1 To maxZeilen + 1 '!!!!
'  If Not z = 4 Then
'    For s = 1 To maxSpalten
'      tmp(z - d, s) = arr(z, s)
'    Next
'  Else
'    d = 1
'  End If
'Next

'Feld neu erstellen
Erase arr
ReDim arr(maxZeilen, maxSpalten)
arr = tmp
'Ausgabe
Range(Cells(20, 1), Cells(19 + UBound(arr, 1), UBound(arr, 2))) = arr
End With
End Sub 
PS: Rückmeldung wäre nett.
Anzeige
AW: Datenfelder
06.06.2005 20:26:24
Arnd
Hi Micha,
auf das Transpose hätte ich aber auch selber kommen können :-(.
Danke für deine Mühe, du hast mir sehr geholfen. Ich hätte so eine ausführliche Lösung gar nicht erwartet
Vielen Dank nochmal
Arnd
AW: Datenfelder
06.06.2005 21:54:07
MichaV
Hi Arnd,
ich habe zu danken für die herausfordernde und interessante Aufgabenstellung. Habe mich bis gestern noch nie damit beschäftigt, daher wurde es auch etwas ausführlicher, weil ich es einen großen Teil auch für mich getan habe ;o)
Gruß und Frohes Schaffen noch- Micha

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige