Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1156to1160
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

Matrixerzeugung aus einer abgelegten Liste

Matrixerzeugung aus einer abgelegten Liste
simo
moin die herr- und damschaften ;)
ich möchte aus einer liste eine matrix mit werten erstellen. ich habe dazu ein bisschen rumgeströbert und dabei diesen code gefunden:
https://www.herber.de/forum/ _
archiv/296to300/t298023.htm
Sub Rudiger() Dim i As Long, ii As Long, iii As Long Dim WS1 As Worksheet, WS2 As Worksheet Set WS1 = Worksheets("Tabelle1") Set WS2 = Worksheets("Tabelle2") WS2.Cells.ClearContents For i = 1 To WS1.Range("A65536").End(xlUp).Row If WorksheetFunction.CountIf(WS2.Range("A1:A" & WS2.Range("A65536").End(xlUp).Row), WS1. _ Cells(i, 1)) = 0 Then WS2.Cells(WS2.Range("A65536").End(xlUp).Row + 1, 1) = WS1.Cells(i, 1) If WorksheetFunction.CountIf(WS2.Range("B1", WS2.Cells(1, WS2.Range("IV1").End(xlToLeft) _ .Column)), WS1.Cells(i, 2)) = 0 Then WS2.Cells(1, WS2.Range("IV1").End(xlToLeft).Column + 1) = WS1.Cells(i, 2) WS2.Cells(WS2.Range("A65536").End(xlUp).Row, WS2.Range("IV1").End(xlToLeft).Column)= _ "x" Else For iii = 2 To WS2.Range("IV1").End(xlToLeft).Column If WS2.Cells(1, iii) = WS1.Cells(i, 2) Then Exit For Next iii WS2.Cells(WS2.Range("A65536").End(xlUp).Row, iii) = "x" End If Else For ii = 1 To WS2.Range("A65536").End(xlUp).Row If WS2.Cells(ii, 1) = WS1.Cells(i, 1) Then Exit For Next ii If WorksheetFunction.CountIf(WS2.Range("B1", WS2.Cells(1, WS2.Range("IV1").End(xlToLeft) _ .Column)), WS1.Cells(i, 2)) = 0 Then WS2.Cells(1, WS2.Range("IV1").End(xlToLeft).Column + 1) = WS1.Cells(i, 2) WS2.Cells(ii, WS2.Range("IV1").End(xlToLeft).Column) = "x" Else For iii = 2 To WS2.Range("IV1").End(xlToLeft).Column If WS2.Cells(1, iii) = WS1.Cells(i, 2) Then Exit For Next iii WS2.Cells(ii, iii) = "x" End If End If Next i End Sub
dieser bewirkt eine X-Setzung bei 2 parametern.
meine liste sieht wie folgt aus:
f01 f02
0 1
f01 f03
0 1
f01 f04
1 0
f02 f03
1 0
f04 ....
....
als ausgabe wäre eine matrix super, in der das über der "1" stehende Wort in die matrix geschrieben wird,
also
f02 f03 f04
----------------------
f01 f02 f03 ...
f02 f02
ich habe schon ein bisschen rumprobiert, allerdings kam nichts brauchbares raus. hat jemand rat ?
vielen dank im vorraus.
AW: Matrixerzeugung aus einer abgelegten Liste
25.05.2010 12:53:14
Erich
Hi Vorname(?),
deine Aufgabenstellung verstehe ich nicht. Vielleicht liegts an der Darstellung des Beispiels?
Ist das Folgende vielleicht die Aufgabe?
 ABCD
1Quelle:   
2f01f02  
301  
4f01f03  
501  
6f01f04  
710  
8f02f03  
910  
10    
11    
12Ziel:   
13f01f02f03 
14f04f01  
15f03f02  
16    
17oder so?   
18 f02f03f01
19f01f02f03 
20f04  f01
21f03f02  


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
(Die Farben sollen hier nur verdeutlichen, was woher stammt.)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.: Der Linke zur Jeanie unter der Tabelle ist seeeehr nütuzlich...
Anzeige
AW: Matrixerzeugung aus einer abgelegten Liste
25.05.2010 13:11:21
simo
hi Erich G.
dein "Oder so" Beispiel trifft es haargenau, ab A18 - D21! ist das schon gecoded oder hast du das nur zur verdeutlichung meiner aufgabenstellung händisch eingefügt ?
danke auch für den jeanie link, werde ich in zukunft nutzen ;)
Spezial-Matrix aus Liste (mit VBA)
25.05.2010 20:36:55
Erich
Hi Simo,
probier mal

Option Explicit
Sub Umorg()
Dim arrQ, myDicK, myDicW, lngZ As Long, lngC As Long, varKey As String
Dim arrL, arrO, arrM, arrW, ii As Long, jj As Long, kk As Long, arrE() As String
With ThisWorkbook.Worksheets("Tabelle1")     ' Quellblatt, evtl. anpassen
arrQ = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 2)
End With
Set myDicK = CreateObject("Scripting.Dictionary")
Set myDicW = CreateObject("Scripting.Dictionary")
For lngZ = 1 To UBound(arrQ) Step 2
lngC = 1 + arrQ(lngZ + 1, 1)        ' Spalte mit der 0
varKey = arrQ(lngZ, lngC)                                ' Eintrag über der 0
If myDicK.Exists(varKey) Then                            ' wenn schon da, dann
myDicK(varKey) = myDicK(varKey) & "|" & arrQ(lngZ, 3 - lngC)   ' anhängen
Else
myDicK.Add varKey, arrQ(lngZ, 3 - lngC)               ' sonst Neuanlage
End If
varKey = arrQ(lngZ, 3 - lngC)                            ' Eintrag über der 1
If Not myDicW.Exists(varKey) Then myDicW.Add varKey, 1   ' Neuanlage, wenn neu
Next lngZ
arrO = myDicW.keys
arrL = myDicK.keys
arrM = myDicK.items
ReDim arrE(0 To myDicK.Count, 0 To myDicW.Count)      ' Ausgabematrix
For kk = 0 To UBound(arrO)
arrE(0, kk + 1) = arrO(kk)                         ' 1. Zeile (Oben)
Next kk
For ii = 0 To myDicK.Count - 1
arrE(ii + 1, 0) = arrL(ii)                         ' 1. Spalte (Links)
arrW = Split(arrM(ii), "|")                        ' Erstellung des "Inneren"
For jj = 0 To UBound(arrW)
For kk = 0 To UBound(arrO)
If arrW(jj) = arrO(kk) Then arrE(ii + 1, kk + 1) = arrW(jj): Exit For
Next kk
Next jj
Next ii
Application.EnableEvents = False
With ThisWorkbook.Worksheets("Tabelle2").Cells(1, 1)         ' Ausgabezelle, anpassen
.Resize(, UBound(arrE, 2) + 2).EntireColumn.ClearContents ' Ausgabebereich leeren
.Resize(UBound(arrE) + 1, UBound(arrE, 2) + 1) = arrE     ' Ausgabe
End With
Application.EnableEvents = True
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.:
Ich heiße nicht "Erich G.", sondern Erich - "Erich G." ist hier nur mein "Unterscheidungs-Username" ;-)
Anzeige
AW: Spezial-Matrix aus Liste (mit VBA)
26.05.2010 11:20:26
simo
hi Erich :)
der code funktioniert super, erstmal tausend dank dafür !!
jetzt gibt es noch ein kleines problem:
wenn ich die inhaltstabelle bei A1 starten lasse funktioniert alles. wenn ich diese allerdings verschiebe, z.b. in H1 muss ich doch den startwert entsprechend ändern.
With ThisWorkbook.Worksheets("Tabelle1")     ' Quellblatt, evtl. anpassen
arrQ = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 2)
wenn ich dort allerdings die Cells-Werte ändere, schmiert er mit nem laufzeitfehler 9 , Index ausserhalb gültigen Bereiches ab.
Anzeige
Quelle ab Spalte H
26.05.2010 12:28:44
Erich
Hi Simo,
wenn die Zeile so aussieht, sollte es klappen:
arrQ = .Cells(1, 8).Resize(.Cells(.Rows.Count, 8).End(xlUp).Row, 2)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S.: Sorry, "Kamplindfort" war ja von Albrecht, nicht von Dir !
AW: Quelle ab Spalte H
26.05.2010 13:20:03
simo
hi Erich,
da bei mir viele sheets ertsellt werden, möchte ich auf das aktive sheet verweisen. das realisiere ich so:

Dim Arbeitsmappenname As String
Arbeitsmappenname = ActiveSheet.Name
Worksheets(Arbeitsmappenname).Activate
dann folgt dein code:
With ThisWorkbook.Worksheets(Arbeitsmappenname)
arrQ = .Cells(1, 8).Resize(.Cells(.Rows.Count, 8).End(xlUp).Row, 2)
führe ich es aus, mit meiner variable "arbeitsmappenname" bekomme ich den laufzeitfehler.
änder ich diese hingegen in "Tabelle1" in der bsp. die zu ordnende tabelle steht, führt er es einwandfrei aus ... komisch oder? ich benötige auf jedenfall diesen relativen verweis ohne "hardfact tabelle1" :)
Anzeige
Quelle immer ActiveSheet
26.05.2010 20:43:24
Erich
Hi Simo,
auch wenn du danach noch eine andere Lösung suchst, möchte ich dir auf diese Frage antworten.
"Dim Arbeitsmappenname As String"
Da vermutet man als Inhalt der Variablen den Namen der Arbeitsmappe, etwa "Beispiel.xls".
"Arbeitsmappenname = ActiveSheet.Name"
Hier wird der Variablen der Name des gerade aktiven Blattes zugewiesen, nicht einer Mappe.
Mit "Worksheets(Arbeitsmappenname).Activate"
wird das ohnehin gerade aktive Blatt noch einmal aktiviert. Wozu soll das denn gut sein?
Das Ganze ist jetzt nicht falsch, nur sehr umständlich. Woher der Fehler kommt, bleibt unklar.
Eine Möglichkeit:
Das aktive Blatt ist kein Tabellenblatt, sondern z. B. ein Diagramm.
Zweite eine Möglichkeit:
Es sind mindestens zwei Arbeitsmappen (=Excel-Dateien) beteiligt.
Wenn Mappe abc.xls aktiv ist und in Mappe abc.xls das Blatt "MeinBlatt" aktiv ist,
und ThisWorkbook ist eine andere Mappe, muss es in ThisWorkbook kein Blatt "MeinBlatt" geben.
(ThisWorkbook ist die Mappe, in der dieser Code steht, und hier gerade nicht die aktive Mappe.)
IMHO kannst du das Gedöns mit der Variablen weglassen und einfach statt
With ThisWorkbook.Worksheets("Tabelle1")
schreiben:
With ActiveSheet
Damit ist das aktive Blatt doch korrekt bezeichnet, oder?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Quelle immer ActiveSheet
27.05.2010 08:32:26
simo
guten morgen !
das problem mit

With ThisWorkbook.Worksheets("Tabelle1")
With ActiveSheet

ist, das der Sheetname aus einer Eingabe des Benutzers kommt. Auf dem ersten Formular gibt dieser einen Namen an, nach welchem das Sheet benannt wird - ich benötige also eine variable da drin.
das komische ist, das ein schreiben, also die ausgabe mit der variablen funktioniert, hier als "VARIABLE" gekennzeichnet.
With ThisWorkbook.Worksheets(VARIABLE).Cells(1, 1)         ' Ausgabezelle, anpassen
.Resize(, UBound(arrE, 2) + 2).EntireColumn.ClearContents ' Ausgabebereich leeren
.Resize(UBound(arrE) + 1, UBound(arrE, 2) + 1) = arrE     ' Ausgabe
Nur das Auslesen am Anfang funktioniert nicht.
Anzeige
AW: Quelle ab Spalte H
26.05.2010 13:43:33
simo
ich habe jetzt noch eine public variable im modul deklariert, welche durch die versch. _ formulare übergeben wird. im debugger wird dann der name bei der PUBLIC-VAR in

With ThisWorkbook.Worksheets(PUBLIC-VAR)
korrekt angezeigt. dennoch laufzeitfehler 9 , index ausserhalb bereich.
Rückfrage
26.05.2010 20:54:24
Erich
Hi Simo,
gehts etwas genauer?
"PUBLIC-VAR" ist sicher kein Variablenname - da sind Bindestriche einfach nicht erlaubt.
"welche durch die versch. _ formulare übergeben wird" - Was für Formulare? Wie wird "übergeben"?
Sind an der Geschichte vielleicht mehrere Arbeitsmappen (=Exceldateien) beteiligt?
Bisher ging der Code davon aus, dass alle vorkommenden Blätter zu der Mappe gehören,
in der der Code steht.
Schreib doch mal über die Zeile
With ThisWorkbook.Worksheets(PUBLIC-VAR)
die fünf Zeilen (mit deinem richtigen Variablennamen statt PUBLIC-VAR)
MsgBox "A:" & ActiveWorkbook.Name
MsgBox "B:" & ThisWorkbook.Name
MsgBox "C:" & PUBLIC-VAR
MsgBox "D:" & Sheets(PUBLIC-VAR).Name
MsgBox "E:" & ThisWorkbook.Sheets(PUBLIC-VAR).Name
und schreib mir dann mal, was bei A: bis E: angezeigt wird.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Rückfrage
27.05.2010 08:40:31
simo
A: HV.xls
B: HV.xls
C: testeingabe
D: testeingabe
E: testeingabe
testeingabe = vom benutzer vergebener name. so wird dann das sheet genannt. mehrere formulare schreiben dann daten in dieses sheet, was auch alles funktioniert.
Beispielmappe nötig
27.05.2010 10:39:20
Erich
Hi Simo, (dies ist eine Anrede - so viel Zeit sollte sein...)
es ist also wohl nur eine Mappe beteiligt, und die Existenz des Blattes scheint auch sicher.
Anhand deiner Angaben finde ich nicht heraus, wie der Fehler entsteht.
Ohne eine Beispielmappe - mit Beispieldaten - sehe ich jetzt keine Möglichkeit mehr, das herauszufinden.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Beispielmappe nötig
27.05.2010 10:51:52
simo
Hi Erich,
also, ich habe jetzt nochmal deinen grundcode genommen, mit tabelle1 und tabelle2 und diesen in ein neues formular mit einem button gepackt.
dann habe ich in tabelle1, die quelldatei folgendes geschrieben:

A         B
hallo	blub
1
hallo	wow
1	
-> funktioniert

A         B
hallo	blub
1
hallo	wow
1	
-> funktioniert nicht - laufzeitfehler
Spielregeln geändert
27.05.2010 11:56:18
Erich
Hi Simo,
war es bisher nicht so, dass in jeder zu betrachteten Zeile in Spalte A (teilweise Spalte H) etwas stand,
eine 1 oder eine 0?
Jetzt hast du das geändert - das sind neue Spielregeln.
Damit wird arrQ nicht mehr sicher richtig angelegt, denn arrQ geht bisher immer
von Zeile 1 bis zur letzten belegten Zeile in Spalte A (teilw. H).
In deinem richtigen Beispiel ist A4 der unterste Wert in Spalte A - richtig.
In deinem falschen Beispiel ist A3 der unterste Wert in Spalte A - das gibt dann Müll,
weil zu A3 nicht geprüft werden kann, ob darunter (in arrQ(4,1)) eine 1 steht oder nicht.
Wenn du im falschen Beispiel eine 0 in A4 schreibst, funzt es.
(Im Code gibt es eine Zeile
lngC = 1 + arrQ(lngZ + 1, 1) ' Spalte mit der 0
Da steht hinten "Spalte mit der 0 - das hat was zu bedeuten...
So läuft es auch ohne die 0 in A4:

kk = .Cells(.Rows.Count, 1).End(xlUp).Row
arrQ = .Cells(1, 1).Resize(kk + (kk Mod 2), 2)

statt der alten Zeile

arrQ = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 2)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort (so ein Gruß schadet auch nicht...)
Anzeige
AW: Spielregeln geändert
27.05.2010 15:06:31
simo
hallo Erich
läuft einwandfrei, vielen vielen dank!
AW: Rückfrage
27.05.2010 10:38:50
simo
ich habe jetzt eine neue entdeckung zum thema Laufzeitfehler 9 bekommen:
dieser tritt immer auf, wenn in der zu sortierenden tabelle das letzte feld eine "1" hat. ist das letzte feld leer funktioniert alles. *verwirrt*

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige