Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1012to1016
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

API Funktion CopyMemory und andere Fkt.

API Funktion CopyMemory und andere Fkt.
11.10.2008 17:21:00
Reinhard
Hallo Wissende,
ich habe das Array a(1 to 45000, 1 to 3),
(ich bezeichne mal die 45000 als Zeilen, die 3 als Spalten)
jetzt möchte ich alle Zeilen durchlaufen und in Spalte 2 die Werte überprüfen, ob sie einen bestimmten Text beinhalten.
Gibt es eine API-Funktion, der ich den Namen des Arrays und den gesuchten Text übergebe und sie liefert mir zurück in welcher Zeile dieser Text enthalten ist?
Oder aber, eine API-Funktion die mir die Startadresse des im Speicher abgelegten Arrays zurückliefert und die Adresse wo danach der gesuchte Text auftaucht, so daß ich mir die Zeile berechnen könnte?
Problem ist, dieser Text taucht mehrfach in a(x,2) auf und ich bräuchte alle Zeilen wo er auftaucht.
Jetzt kommt das mit dem Copymemory. Angenommen ich ermittle, daß der gesuchte Text in Zeile 10000 auftaucht, also in a(10000,2).
Nun möchte ich daraufhin ein zweites Array dimensionieren, b(1 to 45001, 1 to 3), mittels Copymemory den Inhalt von a(1 to 10000, 1 to 3) nach b( 1 to 10000, 1 to 3) kopieren, dann per Code die Inhalte von b(10001,1), b(10001,2), b(10001,3) festlegen.
Dann soll wieder durch Copymemory der Inhalt von a(10001 to 45000,1 to 3) nach b(10002 to 45001, 1 to 3) kopiert werden.
Oder aber, ich könnte ja
Redim preserve a(1 to 45001,1 to 3)
durchführen, dann mittels Copymemory a(10001 to 45000, 1 to3) nach a(10002 to 45001, 1 to3) kopieren,
danach dann a(10001,1), a(10001,2), a(10001,3) festlegen.
Ich hoffe sehr ich konnte mich verständlich machen.
Wenn ich den Inhalt von a(1 to 45000,1 to 3) mal als zellen bezeichnen darf, so kann ich die Gesamtproblematik schon mit Vba lösen, aber das dauert halt lange, weil ich dann jede Zelle einzeln kopiere.
Danke ^ Gruß
Reinhard

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: API Funktion CopyMemory und andere Fkt.
11.10.2008 20:41:00
ransi
HAllo
Zu1)
Ob es da eine API gibt weiss ich nicht.
Aber die Exceleigenen Bordmittel sind auch recht fix:
Option Explicit


Public Sub machs()
Dim a() As Variant 'Dein Array
Dim strTxt As String 'Der Suchstring
Dim X As Long 'Ein Zähler
Dim Dic As Object 'Ein Dictionary
strTxt = "A"
Set Dic = CreateObject("Scripting.Dictionary")
a = Range("A1:C45000")
For X = 1 To UBound(a, 1)
    If a(X, 2) Like "*" & strTxt & "*" Then
        Dic(X) = a(X, 2)
    End If
Next
MsgBox Join(Dic.keys, vbCrLf)
MsgBox Join(Dic.items, vbCrLf)
End Sub

Den Rest habe ich leider nicht verstanden...
ransi
Anzeige
AW: API Funktion CopyMemory und andere Fkt.
11.10.2008 21:25:00
Reinhard
Hallo Rainer,
ich vereinfache es mal.
Option Base 1 ist gesetzt um jetzt die Erklärung zu vereinfachen
Ich habe ein Array a(10).
In dieses Array möchte ich einen zusätzlichen Wert einreihen und zwar nach dem 6ten Wert im Array.
Deshalb lege ich jetzt ein zweites Array an, b(11).
Und mache dann diese drei Schritte:
I) Kopiere dann a(1)-a(6) nach b(1)-b(6).
II) Füge in b(7) den neuen Wert ein.
III) Dann kopiere ich a(7)-a(10) nach b(8)-b(11)
Für I) und III) suche ich halt eine schnelle variante, die die Daten als Block kopiert, deshalb kam ich auf Copymemory, aber da kenne ich mich nicht aus, genausowenig wie mit rtlmovememory, da ich die Bytelängen ja nicht kenne .-(
Mit rtlmovememory meine ich z.B. das da:
http://www.activevb.de/cgi-bin/apiwiki/RtlMoveMemory
aber da fängts ja schon damit an daß strPtr nicht bekannt ist :-(
Gruß
Reinhard
Anzeige
Immer noch nicht...
12.10.2008 08:45:00
ransi
Hallo Reinhard
Noch etwas unklar.
Hier ein Beispiel:
Das ist dein Ausgangsarray:
a(1 to 10,1 to 3)
Tabelle1

 ABC
14L64Q022K
2B7I38ALHO
3D9HV5AQG6
40SIOSKW4R
5YG1C04BDC
60K8VAO47K
7OV9CITZH2
8M4AFA4BRM
9OPSWBXPPU
10A4WAFDPPG


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
In dem suchst du in der 2ten Spalten Nach "A".
Dein Zielarray soll dann so aussehen:
Tabelle1

 EFG
14L64Q022K
2B7I38ALHO
3Veränderte WerteVeränderte WerteVeränderte Werte
4D9HV5AQG6
5Veränderte WerteVeränderte WerteVeränderte Werte
60SIOSKW4R
7YG1C04BDC
80K8VAO47K
9Veränderte WerteVeränderte WerteVeränderte Werte
10OV9CITZH2
11M4AFA4BRM
12Veränderte WerteVeränderte WerteTreffer
13OPSWBXPPU
14A4WAFDPPG
15Veränderte WerteVeränderte WerteVeränderte Werte


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Nach jedem gefundenen "A" willst du veränderte Werte einfügen ?
Das Ganze soll nicht in Zellen passieren sondern in einem Array ?
ransi
Anzeige
AW: Immer noch nicht...
12.10.2008 09:15:56
ransi
HAllo Rheinhard
Teste mal diesen Code:
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub machs()
Dim T As Double
Dim a() As Variant 'Dein DatenArray
Dim X As Long 'Ein Zähler
Dim b() As Variant 'Dein AusgabeArray
Dim L As Long 'Ein Zähler
Dim strTxt As String 'Der Suchstring
Dim Dic As Object 'Ein Dictionary
T = Timer
strTxt = "A"
Set Dic = CreateObject("Scripting.Dictionary")
a = Range("A1:C45000")
For X = 1 To UBound(a, 1)
    If a(X, 2) Like "*" & strTxt & "*" Then '"...in Spalte 2 die Werte überprüfen, ob sie einen bestimmten Text beinhalten."
        Dic(X) = a(X, 2) 'Fundstellen Sammeln
    End If
Next
Redim b(1 To UBound(a, 1) + Dic.Count, 1 To 3) 'AusgabeArray dimensionieren.
L = 1
Do Until L >= UBound(b) 'b füllen
    For X = 1 To UBound(a)
        If Dic.exists(X) Then
            b(L, 1) = a(X, 1)
            b(L, 2) = a(X, 2)
            b(L, 3) = a(X, 3)
            L = L + 1
            b(L, 1) = "Veränderte Werte" '"...dann per Code die Inhalte von b(10001,1), b(10001,2), b(10001,3) festlegen."
            b(L, 2) = "Veränderte Werte"
            b(L, 3) = "Veränderte Werte"
            L = L + 1
            Else:
            b(L, 1) = a(X, 1)
            b(L, 2) = a(X, 2)
            b(L, 3) = a(X, 3)
            L = L + 1
        End If
    Next
Loop
'Ausgeben
Range("D1").Resize(UBound(b, 1), UBound(b, 2)) = b
MsgBox Timer - T
End Sub

3 sekunden bei 45000 Datensätzen.
ransi
Anzeige
AW: Immer noch nicht...
12.10.2008 15:48:00
Reinhard
Hallo Rainer,
ja, genauso. Zellen/Zeilen einfügen ist einfach zu langsam, deshalb das Einfügen in einem Array.
Dein letzter Code den du mir geschrieben hast sieht besser aus als meiner :-),den benutze ich erstmal.
Nur, so wie ich, klapperst du auch alle Einträge in einem Array einzeln ab.
nehmen wir mal ein eindimensionales Array a(10000) an, das mit Werten gefüllt ist und ein noch leeres Array b(10001), das noch leer ist.
Nun will ich hinter a(5000), also zwischen a(5000) und a(5001) einen Wert dazufügen.
Mit den vorhanden Codes kopiere ich dann von a(1) bis a(5000) alle Werte einzeln nach b(1) bis b(5000).
Dann füge ich den Wert von b(5001) ein.
Anschließende kopiere ich wieder einzeln die Werte von a(5001) bis a(10000) nach b(5002) bis b(10001)
Das klappt ja, ist aber nicht schnell.
Wenn denn nun alle Werte in den Arrays die Länge von einem Byte hätten und ich die API Funktion Copymemory richtig verstanden hätte, so könnte ich das Ganze beschleunigen, durch:
copymemory(a,b,5000)
b(5001)=neuer Wert
copymemory(a(5001),b(5002),5000)
Es tut mir leid, besser beschreiben was ich möchte, kann ich nicht :-((
Eine Lösung für diese Copymemory-variante würde mir schon sehr weiterhelfen.
Leider gibt es dann da noch mehr heftige Probleme, denn die Einträge haben eine unbekannte Anzahl an Bytes (sind Strings) und das Array hat 3 Dimensionen :-(
Gruß
Reinhard
Anzeige
Nicht schnell ?
12.10.2008 16:06:32
ransi
HAllo Rheinhard
Das klappt ja, ist aber nicht schnell.
Hm...
Setz die Msgbox mal hier hin:
'Ausgeben
MsgBox Timer - T
Range("D1").Resize(UBound(b, 1), UBound(b, 2)) = b
Bei 45000 Datensätzen bekomme ich da 0,3 sekunden ausgegeben.
Für das Auslesen und neu Erstellen.
Wenn das nicht schnell ist...
Ich kann mir nicht vorstellen das dieses ominöse CopyMemory da schneller ist.
Die Bremse liegt in der Ausgabe des Zielarrays in eine Tabelle.
ransi

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige