Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1348to1352
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
Formel in VBA
24.02.2014 09:47:20
maik
Hallo,
es soll eine .csv eingelesen werden, diese dann nach einem string durchsucht werden, und alle ergebnisse zeilenweise, nach datum sortiert anzeigen.
also in tabelle 1 ist die .csv bereits importiert. (muss nicht in vba geschehen)
die tabelle ist wie folgt aufgebaut (tabelle1)
datum;Tageslicht;Raum;Nähere Raumbezeichnung;Einheit;Beschreibung;Größe
in tabelle 2 sollen nun alle zeilen ausgegeben werden, nach denen gesucht wurde.
z.b. ich such nach raum 1 sollen alle ergbnisse aus tabelle 1 in tabelle 2 dargestellt werden.
ich habe das zuerst mit einer formel probiert, leider dauert das suchen bei nur 4 räumen schon 30 sec (4 kern rechner) es sollen jedoch etwa 600 räume dazukommen.
daher dachte ich mir, es lohnt sich eher in vba zu machen, statt mit einer formel.
hier die formel:

={WENN(ZEILE('tabelle1'!1:1)>ZÄHLENWENN('tabelle1'!$C:$C;$I$1);"";INDEX('tabelle1'!A:A;  KKLEINSTE(WENN('tabelle1'!$C$1:$C$99999=$I$1;ZEILE('tabelle1'!$1:$99999));ZEILE(I1))))  }

ich gebe also den suchbegriff in I1 ein und in tabelle 1 wird gesucht.
wie gesagt, das wird bei 600 räumen vermutlich zu lange dauern, daher vielelicht besser in vba. kann mir jemand dabei helfen?

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formel in VBA
24.02.2014 09:55:14
Rudi
Hallo,
warum filterst du Tabelle1 nicht einfach?
Gruß
Rudi

...weil Excel UND VBA gut!! ;-) (owT)
24.02.2014 10:13:18
EtoPHG

AW: ...weil Excel UND VBA gut!! ;-) (owT)
24.02.2014 10:22:27
maik
das ding ist, ein anderes programm soll auf tabelle 2 zugreifen. tabelle 1 (die importierte .csv) ändert sich mit jedem import.
das programm kann nur aus einer bestimmten zeile spalte und tabelle einen wert nutzen.
wenn sich jetzt aber die importierte .csv immer ändert, kann ich keinen statischen eintrag setzen, da sich der immer ändert.
es muss eine form geschaffen werden, wo z.b. immer raum 1 an einer bestimmten stelle steht, selbst wenn der wert 0 ist.

Code
24.02.2014 10:19:29
Rudi
Hallo,
Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For i = 2 To UBound(arrTmp)
If arrTmp(i, 2) = Sheets(2).Cells(1, 9) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
ReDim arrDaten(1 To oDaten.Count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
With Sheets(2)
.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
End Sub

Gruß
Rudi

Anzeige
AW: Code
24.02.2014 11:05:31
maik
hab deinen code als makro eingegeben. mein zu suchender parameter in i1 tabelle2
ich bekomme nach ausführen des makros "nur" die aller erste zeile der tabelle 1 ausgegeben
(datum;Tageslicht;Raum;Nähere Raumbezeichnung;Einheit;Beschreibung;Größe)
keine weiteren ausgaben
ist nicht ganz so, wie ich mir das vorgestellt habe, dennoch vielen dank für deine mühe

Code von Rudi angepasst-probiers mal... Gruß
24.02.2014 12:16:01
Rudi

Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(2).Cells(1, 9) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
Next x
ReDim arrDaten(1 To oDaten.Count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
With Sheets(2)
.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
End Sub

Anzeige
AW: Code von Rudi angepasst-probiers mal... Gruß
24.02.2014 12:47:02
Rudi
super klasse, das klappt.
vielen dank!!!
mein weiteres vorhaben wäre, dass ich jetzt raum1 tabelle 2 zuordne. ( geht ja mit deinem makro)
ich möchte aber auch, dass raum 2 in tabelle 3 dargestellt wird, wie bei tabelle 2 (also suchmuster etc.)
das geht solange weiter, bis ich bei raum 600 bin, welcher auf tabelle 601 dargestellt wird.
wie müsste ich den code anpassen, damit der für jede tabelle die suche ausführt?

jedem Raum auf ein Blatt
24.02.2014 14:59:38
Rudi
Hallo,
Sub aaa()
Dim oDaten As Object, oRaum As Object, oItem
Dim arrTmp, arrDaten(), arrItems
Dim i As Long, j As Integer, n As Long
Dim wksRaum As Worksheet
Set oDaten = CreateObject("scripting.Dictionary")
Set oRaum = CreateObject("scripting.Dictionary")
Application.ScreenUpdating = False
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
For i = 2 To UBound(arrTmp)
oRaum(arrTmp(i, 3)) = 0
Next i
For Each oItem In oRaum
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For i = 2 To UBound(arrTmp)
If arrTmp(i, 3) = oItem Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
ReDim arrDaten(1 To oDaten.Count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
On Error Resume Next
Set wksRaum = Worksheets("Raum " & CStr(oItem))
On Error GoTo 0
If wksRaum Is Nothing Then
Set wksRaum = Worksheets.Add(after:=Sheets(Sheets.Count))
wksRaum.Name = "Raum " & oItem
End If
With wksRaum
.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
oDaten.RemoveAll
n = 0
Set wksRaum = Nothing
Next oItem
End Sub

Gruß
Rudi

Anzeige
AW: jedem Raum auf ein Blatt
24.02.2014 15:25:57
maik
ich muss sagen geile shice gefällt mir richtig gut.
ist aber leider nen tick zu doll für mein vorhaben.
mein problem an deinem hammer script ist, sollte ein neuer raum irgendwann mal dazukommen, verschiebt sich das ganze.
das script vor dem hier war etwas näher an meiner lösung dran.
ich brauche nur eine möglichkeit, dass ich angeben kann, wieviele tabellen (sheets) der mir vollschreiben soll, wenn ein suchbegriff in i1 steht.
Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(2).Cells(1, 9) Then     2)   
das script ist perfekt, wenn die fett geschriebenen zahlen variablen wären.
der soll nur jedes nachfolgende sheet nach tabelle1 schreiben, also 2,3,4,5,...601
wenn du noch lust haben solltest, wäre ich dir sehr dankbar.
ich habs nen paar mal mit for schleifen probiert, jedoch jedesmal nen "ausser bereich" fehler(9) bekommen :(

Anzeige
AW: jedem Raum auf ein Blatt
24.02.2014 16:39:23
Rudi
Hallo,
sowas?
Sub aaa()
Dim oDaten As Object, oRaum As Object
Dim arrTmp, arrDaten(), arrItems, strMatch As String, arrMatch
Dim i As Long, j As Integer, k As Integer, n As Long
Dim wksRaum As Worksheet
Set oDaten = CreateObject("scripting.Dictionary")
Application.ScreenUpdating = False
strMatch = Application.InputBox("Räume (mit ; getrennt) ?")
If Len(strMatch) > 0 And strMatch  "Falsch" Then
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
arrMatch = Split(strMatch, ";")
For k = 0 To UBound(arrMatch)
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For i = 2 To UBound(arrTmp)
If CStr(arrTmp(i, 3)) = arrMatch(k) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
ReDim arrDaten(1 To oDaten.Count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
On Error Resume Next
Set wksRaum = Worksheets("Raum " & arrMatch(k))
On Error GoTo 0
If wksRaum Is Nothing Then
Set wksRaum = Worksheets.Add(after:=Sheets(Sheets.Count))
wksRaum.Name = "Raum " & arrMatch(k)
End If
With wksRaum
.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
oDaten.RemoveAll
n = 0
Set wksRaum = Nothing
Next k
End If
End Sub

Gruß
Rudi

Anzeige
kleine Verbesserung
24.02.2014 16:45:33
Rudi

Sub aaa()
Dim oDaten As Object, oRaum As Object
Dim arrTmp, arrDaten(), arrItems, strMatch As String, arrMatch
Dim i As Long, j As Integer, k As Integer, n As Long
Dim wksRaum As Worksheet
Set oDaten = CreateObject("scripting.Dictionary")
Application.ScreenUpdating = False
strMatch = Application.InputBox("Räume (mit ; getrennt) ?")
If Len(strMatch) > 0 And strMatch  "Falsch" Then
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
arrMatch = Split(strMatch, ";")
For k = 0 To UBound(arrMatch)
arrMatch(k) = Trim(arrMatch(k))
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For i = 2 To UBound(arrTmp)
If CStr(arrTmp(i, 3)) = arrMatch(k) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
If oDaten.Count > 1 Then
ReDim arrDaten(1 To oDaten.Count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
For j = 1 To 7
arrDaten(i + 1, j) = arrItems(i)(j)
Next
Next
On Error Resume Next
Set wksRaum = Worksheets("Raum " & arrMatch(k))
On Error GoTo 0
If wksRaum Is Nothing Then
Set wksRaum = Worksheets.Add(after:=Sheets(Sheets.Count))
wksRaum.Name = "Raum " & arrMatch(k)
End If
With wksRaum
.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
End If
oDaten.RemoveAll
Set wksRaum = Nothing
Next k
End If
End Sub

Anzeige
AW: kleine Verbesserung
24.02.2014 19:31:13
maik
hm ne das ist nicht das, was ich brauchen kann.
dennoch danke für deine bemühung!!!
der code, den ich zuvor schonmal gepostet habe war für mein vorhaben absolut perfekt. ich möchte keine abfrage o.ä. lediglich, dass ich die anzahl der tabellen in der vba umgebung einmal angebe.
das soll weitestgehend im hintergrund laufen, daher sind so abfragen eher kontraproduktiv in meinem fall.
Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(2).Cells(1, 9) Then     
kann man keine möglichkeit einbauen, wie ich dem compiler sagen kann 2-601. ohne abfrage, die man anklicken muss, einfach nur in der vba umgebung

Anzeige
Beispieldatei ?
24.02.2014 19:43:10
robert
Hi,
kannst Du nicht eine Beispieldate hier hochladen,
in der Du zeigst, wie das Ergebnis ausschauen soll.
Ich persönlich komme mit deinen Aussagen so nicht klar-sorry.
Gruß
robert

AW: Beispieldatei ?
24.02.2014 21:58:19
maik

Die Datei https://www.herber.de/bbs/user/89411.xlsm wurde aus Datenschutzgründen gelöscht


beispiel datei
so jetzt möchte ich auf tabelle 3 klicken, in zeile 1 spalte i z.b. raum 3 eingeben und nur dessen ergebnisse bekommen.
das marko ist das makro ist zur zeit perfekt, bis auf die tatsache, dass ich immer die zahlen ändern muss
Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(2).Cells(1, 9) Then     
die aufgabe wäre erledigt, wenn ich statt der 2 einen bereich angeben könnte, z.b. 2-601

Anzeige
Probier mal.....
25.02.2014 09:00:29
robert
https://www.herber.de/bbs/user/89413.xlsm
Hi,
die Ausgabe erfolgt immer im Aktiven Arbeitsblatt, in dem Du
in Zelle I1 eine Zahl eingibst.
Ausprobieren...
Gruß
robert

AW: Probier mal.....
25.02.2014 10:01:00
maik

Sub Makro1()
Sheets("Tabelle2").Select
Call aaa
Sheets("Tabelle3").Select
Call aaa
Sheets("Tabelle4").Select
Call aaa
Sheets("Tabelle601").Select
Call aaa
End Sub

Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Dim mysht As String
mysht = ActiveSheet.Range("I1")
Sheets(1).Cells(1, 9) = mysht
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(1).Cells(1, 9) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
Next x
ReDim arrDaten(1 To oDaten.count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
With ActiveSheet 'Sheets(mysht)
.Range(.Cells(1, 1), .Cells(Rows.count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
End Sub
sehr unelegand aber es würde funktionieren...
wenn noch einer das schöner machen kann, wäre ich sehr erfreut und eine funktion einbauen, dass tabelle1 davon ausgenommen ist. wenn da irgend einer mal drangeht, will ich nicht, dass meine "datenbank" üerschrieben wird

Anzeige
halbwegs fertig
25.02.2014 10:10:54
maik
nicht schön, funktioniert aber

Sub Makro1()
Dim a As Integer
For a = 2 To 6
Sheets(a).Select
Call aaa
Next a
End Sub
Sub aaa()
Dim oDaten As Object, arrTmp, arrDaten(), i As Long, j As Integer, n As Long, arrItems
Dim x As Long
Dim mysht As String
mysht = ActiveSheet.Range("I1")
Sheets(1).Cells(1, 9) = mysht
Set oDaten = CreateObject("scripting.Dictionary")
arrTmp = Sheets(1).Cells(1, 1).CurrentRegion
oDaten(1) = WorksheetFunction.Index(arrTmp, 1)
For x = 1 To 7 'durchläuft Spalte 1-7
For i = 2 To UBound(arrTmp)
If arrTmp(i, x) = Sheets(1).Cells(1, 9) Then
oDaten(i) = WorksheetFunction.Index(arrTmp, i)
End If
Next i
Next x
ReDim arrDaten(1 To oDaten.count, 1 To 7)
arrItems = oDaten.items
For i = 0 To UBound(arrItems)
n = n + 1
For j = 1 To 7
arrDaten(n, j) = arrItems(i)(j)
Next
Next
With ActiveSheet 'Sheets(mysht)
.Range(.Cells(1, 1), .Cells(Rows.count, 1).End(xlUp)).Resize(, 7).ClearContents
.Cells(1, 1).Resize(UBound(arrDaten), 7) = arrDaten
End With
End Sub
wenn tabelle 1 jetzt noch davon ausgenommen werden würde, bin ich endlich fertig :)

grober schnitzer
25.02.2014 10:46:08
maik
ohhh ich hab noch nen groben schnitzer gefunden.
sollte der string in I1 nicht gefunden werden,w ird leider die gesamt liste ausgegeben, das darf nicht sein.
wenn der ausdruck in i1 nicht gefunden wird, darf nichts ausgegeben werden.
könnte mir das noch einer anpassen?
grüße

AW: grober schnitzer
25.02.2014 10:50:22
maik
passt schon, war nur zu blöd die richtige zeile + spalte anzuklicken.
gibt es in dem board keine edit funktion?
bin mit dem projekt durch, ist jetzt nicht grade sauber geschrieben, aber es funktioniert, das ist die hauptsache. danke an alle, die dabei mitgewirkt haben :)

316 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige