Excel VBA: Arrays auslesen

Hallo Experten,
ein frohes neues Jahr wünsche ich Euch, ich hoffe Ihr seit alle gesund und munter reingekommen. Ruhig und beschaulich oder laut und krachend, ganz wie ihr es wolltet.

mit

Dim arOhneNamen (5,1) as String 
Dim strTest as String, i 

habe ich mir ein Array definiert.
Kann ich das automatisch durchsuchen? Ohne mit einer Schleife alle Felder „manuel“ zu durchsuchen

For i = 0 to 5 
 If arOhneName = strTest Then
 douselessstuff
 EndIf
Next i

Gibt es einen Befehl mit dem ich den Index (oder gar die Indizes) rauslesen kann bei Übereinstimmung?

Hintergrund:
Ich habe Eine Tabelle die sieht so aus:

wert4 4,96
wert2 3,80
wert3 0,69
wert1 0,75
wert2 3,45
wert3 0,76
wert4 4,86
wert2 1,50
wert1 3,23
wert1 3,97
wert5 0,31

unsortiert und mit unterschiedlicher Häufigkeit. Ich würde gerne die Summer aller Wert1, Wert2, …, Wert5 bilden, also
wert1 = 7,94
wert2 = 8,74
wert3 = 1,44
wert4 = 9,82
wert5 = 0,31

Ich will die Tabelle in ein Array einlesen und bearbeiten. Momentan mache ich es noch umständlich:

 For i = 2 To intBondCalls + 1
 Range("a1").Select
 Cells.Find(What:=strBond).Select
 ActiveCell.Offset(0, 3).Select
 dbBondMinP = dbBondMinP + ActiveCell
 ActiveCell.Offset(0, 1).Select
 dbBondMaxP = dbBondMaxP + ActiveCell
**ActiveCell.EntireRow.Delete**
 Next i

Bin für vorschläge offen

Danke für`s lesen.
Grüße
Winter

Hallo, Winter!

ein frohes neues Jahr wünsche ich Euch, ich hoffe Ihr seit
alle gesund und munter reingekommen. Ruhig und beschaulich
oder laut und krachend, ganz wie ihr es wolltet.

Jepp, ebenso.

Frage: Musst Du noch was unter VBA machen. oder willst Du nur die Summen haben? Dann würde ich das am schnellsten mit einer Pivottabelle machen. Nach ungefähren 10 Mausklicks bist Du fertig. Und ein aktualisieren gibt’s für maximal zwei weitere Klicks…

Für einzelne Werte gäbe es dann noch die Excel-Funktion SUMMEWENN. Näheres siehe dort…

Ansonsten: Ein Array musst Du schon selbst durchsuchen. In einer Collection kannst Du über die Vergabe von Keys direkt suchen. Aber wie der Name schon verrät: Keys sollten eindeutig sein.

Gruß, Manfred

Hallo Manfred
Danle für deine Superfixe Antwort.

Jepp, ebenso.

danke

Frage: Musst Du noch was unter VBA machen. oder willst Du nur
die Summen haben? Dann würde ich das am schnellsten mit einer
Pivottabelle machen. Nach ungefähren 10 Mausklicks bist Du
fertig. Und ein aktualisieren gibt’s für maximal zwei weitere
Klicks…

da ich mich Pivot Tabelle GAR NCIHT auskenne und VBA immerhin so was bin wie ein Anfänger, gehe ich lieber mit VBA
SUMMEWENN hilft mir leider nicht, da ich die Werte regelmäßig neu Summieren muss.

Ansonsten: Ein Array musst Du schon selbst durchsuchen. In

Hatte ich mir schon gedacht, habe es auch schon gechrieben, geht ja fix. Aber man darf ja hoffen.

einer Collection kannst Du über die Vergabe von Keys direkt
suchen. Aber wie der Name schon verrät: Keys sollten eindeutig
sein.

Hä?
oder höllicher formuliert:
Wie bitte? - Sagte doch bin Anfänger.
So etwas schlauer, dank F1
Ein Collection-Objekt ist eine geordnete Folge von Elementen, auf die als Einheit Bezug genommen werden kann.
Sagt die MS-Excel Hilfe, werde mir das mal reinziehen und wenn ich dann konkrete Fragen habe wieder melden.
Danke
Winter

Hi Winter,

Kann ich das automatisch durchsuchen? Ohne mit einer Schleife
alle Felder „manuell“ zu durchsuchen
Gibt es einen Befehl mit dem ich den Index (oder gar die
Indizes) rauslesen kann bei Übereinstimmung?

Mir ist da nichts bekannt.
Angenommen du hast deine Werte in spalte A und B, dann erhhälst du die Auswertung in C und D durch das nachfolgende Makro.
Vielleicht wären wie gesagt Pivottabellen besser für dich, oder Daten–Teilsummen aber so ganz genau habe ich nicht herauslesen können was du da eigentlich so treiben willst mit der Tabelle :smile:

Tabelle:
[Mappe2]!Tabelle1

 │ A │ B │ C │ D │ 
───┼───────┼────┼───────┼────┤
 1 │ Wert1 │ 1 │ Wert1 │ 20 │ 
 2 │ Wert2 │ 2 │ Wert2 │ 21 │ 
 3 │ Wert3 │ 3 │ Wert3 │ 25 │ 
 4 │ Wert1 │ 4 │ │ │ 
 5 │ Wert1 │ 5 │ │ │ 
 6 │ Wert3 │ 6 │ │ │ 
 7 │ Wert3 │ 7 │ │ │ 
 8 │ Wert2 │ 8 │ │ │ 
 9 │ Wert3 │ 9 │ │ │ 
10 │ Wert1 │ 10 │ │ │ 
11 │ Wert2 │ 11 │ │ │ 
───┴───────┴────┴───────┴────┘

Benutzte Formeln:
D1 : =SUMMEWENN(A:A;"Wert" & ZEILE();B:B)
D2 : =SUMMEWENN(A:A;"Wert" & ZEILE();B:B)
D3 : =SUMMEWENN(A:A;"Wert" & ZEILE();B:B)

Tabellendarstellung erreicht mit dem Code in [FAQ:2363](/t/faq/9292363)

Ich will die Tabelle in ein Array einlesen und bearbeiten.
Momentan mache ich es noch umständlich:

For i = 2 To intBondCalls + 1
Range(„a1“).Select
Cells.Find(What:=strBond).Select
ActiveCell.Offset(0, 3).Select
dbBondMinP = dbBondMinP + ActiveCell
ActiveCell.Offset(0, 1).Select
dbBondMaxP = dbBondMaxP + ActiveCell
ActiveCell.EntireRow.Delete
Next i

Bin für vorschläge offen

So ist es übersichtlicher:

Sub tt2()
Dim i, Zelle
For i = 2 To intBondCalls + 1
 Zelle = Cells.Find(What:=strBond)
 dbBondMinP = dbBondMinP + Zelle.Offset(0, 3)
 dbBondMaxP = dbBondMaxP + Zelle.Offset(0, 1)
 Zelle.EntireRow.Delete
Next i
End Sub

Gruß
Reinhard

Sub tt()
Dim B As New Collection, Zei As Long, Anz
On Error Resume Next
For Zei = 1 To Range("A" & Rows.Count).End(xlUp).Row
 B.Add Item:=Cells(Zei, 1), key:=Cells(Zei, 1)
Next Zei
For Zei = 1 To B.Count
 Cells(Zei, 3) = B(Zei)
 Cells(Zei, 4).FormulaLocal = "=SummeWenn(A:A;""Wert"" & Zeile();B:B)"
Next Zei
End Sub

Grüezi Winter

Ich habe Eine Tabelle die sieht so aus:

wert4 4,96
wert2 3,80
wert3 0,69
wert1 0,75
wert2 3,45
wert3 0,76
wert4 4,86
wert2 1,50
wert1 3,23
wert1 3,97
wert5 0,31

unsortiert und mit unterschiedlicher Häufigkeit. Ich würde
gerne die Summer aller Wert1, Wert2, …, Wert5 bilden, also
wert1 = 7,94
wert2 = 8,74
wert3 = 1,44
wert4 = 9,82
wert5 = 0,31

Ich will die Tabelle in ein Array einlesen und bearbeiten.

Hmmm, warum sollte das notwendig sein… ? :wink:

Mit dem Spezialfilter kannst du die Unikate aus der ersten Spalte an eine andere Stelle kopieren (und gegebenenfalls der ersten Eintrag löschen, wenn keine Spaltenüberschriften vorhanden sind).
Zwischendrin dann das Ganze noch sortieren.
Mit einer Schleife und SUMMEWENN() in VBA kannst Du dann die einzelnen Einträge durchgehen und die Beträge summieren.

Das alles kann im Grossen und Ganzen so aussehen:

Public Sub UniqueAdd()
Dim rngWert As Range

 Range("D1").CurrentRegion.ClearContents

 Range("A:A").AdvancedFilter Action:=xlFilterCopy, \_
 CopyToRange:=Range("D1"), \_
 Unique:=True

 If Application.WorksheetFunction.CountIf( \_
 Range("D:smiley:"), Range("D1")) \> 1 Then
 Range("D1").Delete
 End If

 Range("D1").CurrentRegion.Sort Range("D1"), xlAscending

 For Each rngWert In Range("D1").CurrentRegion
 rngWert.Offset(0, 1).Value = \_
 Application.WorksheetFunction.SumIf(Range("A:A"), \_
 rngWert.Value, \_
 Range("B:B"))
 Next rngWert
End Sub

Ansonsten ist eine Pivot-Tabelle wirklich nur auf den ersten Blick eine Hexerei, auf den zweiten mutet es bloss noch unglaublich an :wink:


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Servus,
Danke erstmal für Eure Antworten

Hmmm, warum sollte das notwendig sein… ? :wink:

Warum einfach, wenn es umständlich geht.
Gezählt habe ich die einzelnen werte schon, (mit countif) aber auf sumif bin ich Trottel nicht gekommen.

Mit dem Spezialfilter kannst du die Unikate aus der ersten
Das alles kann im Grossen und Ganzen so aussehen:

Public Sub UniqueAdd()
Dim rngWert As Range

Range(„D1“).CurrentRegion.ClearContents

Range(„A:A“).AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Range(„D1“), _
Unique:=True

If Application.WorksheetFunction.CountIf( _
Range(„D:smiley:“), Range(„D1“)) > 1 Then
Range(„D1“).Delete
End If

Range(„D1“).CurrentRegion.Sort Range(„D1“), xlAscending

For Each rngWert In Range(„D1“).CurrentRegion
rngWert.Offset(0, 1).Value = _
Application.WorksheetFunction.SumIf(Range(„A:A“), _
rngWert.Value, _
Range(„B:B“))
Next rngWert
End Sub

Ich hatte das bisher so gemacht :
in Mappe2:A2…An stehen die schon mit Spezialfilter gefilterten Werte

 letzteZeile = Worksheets("Mappe2").Cells(65536, 1).End(xlUp).Row
**For i = 2 To letzteZeile  
 Worksheets("Mappe2").Cells(i, 2).Value = \_  
 Application.WorksheetFunction.CountIf(Worksheets("Mappe1").Range("U:U"), Cells(i, 1))**  
 Worksheets("Mappe2").Cells(i, 3).Value = \_
 Application.WorksheetFunction.SumIf(Worksheets("Mappe1").Range("U:Y"), Cells(i, 1), Range("X:X"))
 Worksheets("Mappe2").Cells(i, 4).Value = \_
 Application.WorksheetFunction.SumIf(Worksheets("Mappe1").Range("U:Y"), Cells(i, 1), Range("Y:Y"))  
 **Next i**  

Das Fettgedruckte habe ich selber hingekreigt, das war mein Startpunkt, dann habe ich das tatsächlich in ein Array geschrieben und ausgelesen und dann eingefügt.
Umständlich, aber es hat funktioniert.
Nn habe ich mirt gedacht nimm dir das zu herzen, was die netten Experten schreiben un verwende auch Application.WorksheetFunction.SumIf
Nur bei funktioniert das nicht.
Un ich weiß nicht warum.

Mit Eurer Hilfe habe ich auch die Schleife verkürzt (For each) :

Worksheets("Mappe2").Range("a:a").CurrentRegion
For Each rngWert In Worksheets("Mappe2").Range("a1").CurrentRegion
 rngWert.Offset(0, 6).Value = \_
 Application.WorksheetFunction.SumIf(Worksheets("Mappe1").Range("U:Y"), rngWert.Value, Range("Y:Y"))
 rngWert.Offset(0, 5).Value = \_
 Application.WorksheetFunction.CountIf(Worksheets("Mappe1").Range("U:Y"), rngWert.Value)
 Next rngWert

Aber auch da funktioniert das sumif nicht.
Wo liegt den mein Fehler?

Ansonsten ist eine Pivot-Tabelle wirklich nur auf den ersten
Blick eine Hexerei, auf den zweiten mutet es bloss noch
unglaublich an :wink:

Da man Makros mit aufzeichnen und dann ein wenig Programmierkenntnissen und VIEL eurer Zeit gut hinkriegt, belibe ich erstmal bei Makros.
Grüße
Winter
P.S.
@Reinhard ist es möglich ein Link unter dein FAQ-Hinweis zu legen? Da es nicht so einfach ist einen FAQ-Artikel nach der Nummer zu finden. (Nicht einfach, aber möglich!)

Grüezi Winter

Ich hatte das bisher so gemacht :
in Mappe2:A2…An stehen die schon mit Spezialfilter
gefilterten Werte

Nn habe ich mirt gedacht nimm dir das zu herzen, was die
netten Experten schreiben un verwende auch
Application.WorksheetFunction.SumIf
Nur bei funktioniert das nicht.
Un ich weiß nicht warum.

Worksheets(„Mappe2“).Range(„a:a“).CurrentRegion

Wozu dient diese Zeile - IMO ist sie nicht notwendig und ohne besondere Bedeutung (eigentlich müsste auch der VBA-Editor die Zeile anmeckern…)?

Welche Mappe und welches Tabellenblatt ist aktiv während Du den Code ablaufen lässt?

Ich vermute mal es sein Mappe2 mit den gefilterten Daten?

For Each rngWert In
Worksheets(„Mappe2“).Range(„a1“).CurrentRegion
rngWert.Offset(0, 6).Value = _

Application.WorksheetFunction.SumIf(Worksheets(„Mappe1“).Range(„U:Y“),
rngWert.Value, Range(„Y:Y“))

Wo stehen denn die Werte, die Du summieren willst?
In Spalte Y von Mappe1?
Dann musst Du dies auch korrekt referenzieren:

Application.WorksheetFunction.SumIf(Worksheets(„Mappe1“).Range(„U:Y“),
rngWert.Value, Worksheets(„Mappe1“).Range(„Y:Y“))

rngWert.Offset(0, 5).Value = _

Application.WorksheetFunction.CountIf(Worksheets(„Mappe1“).Range(„U:Y“),
rngWert.Value)
Next rngWert

Aber auch da funktioniert das sumif nicht.
Wo liegt den mein Fehler?

In der (zu) ungenauen Referenzierung :wink:

Ansonsten ist eine Pivot-Tabelle wirklich nur auf den ersten
Blick eine Hexerei, auf den zweiten mutet es bloss noch
unglaublich an :wink:

Da man Makros mit aufzeichnen und dann ein wenig
Programmierkenntnissen und VIEL eurer Zeit gut hinkriegt,
belibe ich erstmal bei Makros.

Hmm, du erlaubst dass ich dich zitiere: :wink:

Warum einfach, wenn es umständlich geht.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -
1 Like

OT Test für FAQ-Link

@Reinhard ist es möglich ein Link unter dein FAQ-Hinweis zu
legen? Da es nicht so einfach ist einen FAQ-Artikel nach der
Nummer zu finden. (Nicht einfach, aber möglich!)

Hallo Winter,

vielleicht klappt es jetzt besser durch diesen Test :smile:

[FAQ:2363](/t/faq/9292363)

FAQ:2363

Gruß
Reinhard

Guten Morgen,

Wozu dient diese Zeile - IMO ist sie nicht notwendig und ohne
besondere Bedeutung (eigentlich müsste auch der VBA-Editor die
Zeile anmeckern…)?

Das kommt davon, wenn man Ohne Sinn und Verstand drauf hackt und nur Lösungen aus W-w-w cut und pastet. :wink:

In Spalte Y von Mappe1?
In der (zu) ungenauen Referenzierung :wink:

Habe ich dann auch selber rausgefunden, da ich Deine Antwort leider nicht gesehen hatte:
wksmap2.Cells(i, 3).Value = Application.WorksheetFunction. _
SumIf(wksmap1.Range(„U:U“), wksmap2.Cells(i, 1), wksmap1.Range(„X:X“))

war aber ein langer harter Kampf.
Wenn ich deine tolle Antwort früher gelesen hätte, hätte ich paar graue Haare weniger.

Hmm, du erlaubst dass ich dich zitiere: :wink:

Warum einfach, wenn es umständlich geht.

Niemand will seine eigenen Worte hören oder lesen :wink:
Grummel :wink:

Danke für Deine Antwort.
Winter

Grüezi Winter

Wozu dient diese Zeile - IMO ist sie nicht notwendig und ohne
besondere Bedeutung (eigentlich müsste auch der VBA-Editor die
Zeile anmeckern…)?

Das kommt davon, wenn man Ohne Sinn und Verstand drauf hackt
und nur Lösungen aus W-w-w cut und pastet. :wink:

Fein, es freut mich, dass dem so ist - damit hängt mein Excel-Weltbild wieder gerade :wink:

In Spalte Y von Mappe1?
In der (zu) ungenauen Referenzierung :wink:

Habe ich dann auch selber rausgefunden, da ich Deine Antwort
leider nicht gesehen hatte:
wksmap2.Cells(i, 3).Value = Application.WorksheetFunction. _
SumIf(wksmap1.Range(„U:U“),
wksmap2.Cells(i, 1), wksmap1.Range(„X:X“))

war aber ein langer harter Kampf.
Wenn ich deine tolle Antwort früher gelesen hätte, hätte ich
paar graue Haare weniger.

…und dabei hatte ich mich bemüht, sehr zeitnah zu antworten.

Hast Du keine Mail vom Board erhalten, dass auf deinen Beitrag eine Antwort eingegangen ist?
Das kannst Du ganz unten jeweils anhaken, wenn Du eine Antwort schreibst - ich mach das standardmässig (mit FireFox sogar automatisidet), dann bin ich immer auf dem Laufenden und verpasse nichts, das mir wichtig ist.

BTW:
Willkommen im Club der ‚grauen Panther‘ :wink:

Hmm, du erlaubst dass ich dich zitiere: :wink:

Warum einfach, wenn es umständlich geht.

Niemand will seine eigenen Worte hören oder lesen :wink:
Grummel :wink:

Hi hi, ja das kenne ich gut :wink:

…versuchs dennoch mal mit der Pivot-Tabelle, ja!

Danke für Deine Antwort.

Aber immer gerne doch :smile:


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -