![]()  | 
    ![]()  | 
    |
		
			
  | 
	|||||||
| Programmierung Rat & Tat für Programmierer | 
![]()  | 
	
	
| 
		 | 
	Themen-Optionen | Ansicht | 
| 		
			
			 | 
		#1 | 
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 Wie haben einen Public Type am Anfang der Funktion deklariert - in dem Typ befindet sich auch ein Array der Form str(x, y) as string. Nur wissen wir am Anfang beim Start des Programms noch nicht wie groß x und y werden soll. 
		
	
		
		
		
		
		
		
		
		
		
	
	Man könnte natürlich auch einen hohen x und y Wert am Anfang nehmen der sich sicher ausgeht - nur nimmt sich das Programm dann nicht gleich "zu viel" Speicherplatz um das Array im Speicher abzubilden. Außerdem ist das nicht wirklich elegant. Das ganze wird deshalb über ein Public Type gemacht da wir das ganze in einer ActiveX DLL deklarieren und dann aus Access verwenden wollen. Oder könnte ich auch eine öffentliche Variable (public dim - oder sowas halt??) machen weil dann gehts ja über Redim. Nur wie geht des? ![]() Vielleicht habts ja eine Idee wie man das lösen könnte. ![]()  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#2 | 
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 Frage neu (weil ich keinen Typ mit einem String(300, 300) deklarieren kann, da das ganze für VB anscheinend zu gruß wird. 
		
	
		
		
		
		
		
		
		
		
		
	
	Aber nur eine Variable mit string(300, 300) geht - nur wie kann ich die zwischen DLL und VBA wo diese eingebunden ist übergeben?  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#3 | 
| 
			
			
			
			 Schwarzfußfrettchen 
			![]() Registriert seit: 28.01.2001 
				
				
				
					Beiträge: 2.071
				 
				
				
				
 | 
	
	
	
		
		
			
			 Probier mal keine Werte anzugeben sondern nur 
		
	
		
		
		
		
		
		
			Dim X() as String und dann im code mit ReDim X(a,b) das Array dynamisch zu reservieren. Sollen die alten Werte im Array erhalten bleiben (erweiterung des Arrays) verwende ReDim Preserve X(a,b) 
				____________________________________ 
		
		
		
		
		
		
	
	Wann die kan Almdudler ham... \"Es gibt nur einen Weg zur Lunge, und der muss geteert werden, damit der Krebs nicht stolpert!\" http://www.dream.at/gizmo/bunny.gif Image is © 2001 Merle Sterndalsäg.. ähh... jäger  
			 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#4 | 
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 Leider is das Problem net so einfach - redim kenn ich eh.  
		
	
		
		
		
		
		
		
		
		
		
	
	![]() Die Daten müssen nicht erhalten bleiben, weil am Anfang wo ich das "redim" brauch noch nix im Array steht. So aber ich schreib mal die Problematik, dann wirds besser verständlich warum ich das so machen will: Projekt in VBA, soll eine Matrix aus einer Textdatei einlesen - "Datensätze" durch ";" getrennt. Die Testmatrix die wir derzeit haben ist 373*373 (=139129) Felder groß. VBA dapackt das net (nich einmal in einer Stunde war er fertig) - drum wird das Einlesen der Matrix in einer DLL gemacht - zumindest stellen wir uns das so vor. Die Werte die gespeichert werden sind Strings. Weil in VB dauerts nicht mal 2 Minuten mit dem gleichen Code auf der gleichen Maschine. Jetzt haben wir uns mal mit ActiveX Dlls gespielt wie das ungefähr funktioniert. Um den Wert bzw. die Matrix zu übergeben haben wir ein Code: 
	 Public Type test
     array(10, 10) as string
 end Type
In Access die DLL dann über Verweise eingebunden und eine Variable vom Typ test definiert.(array) Von VBA rufen wir eine Funktion in der DLL auf prozedur(byref array). Die DLL speichert dann nur zum Test mal irgendeinen String rein und den geb ich in VBA aus. Das Problem ist, dass im Typ test das array von der Größe limitiert ist (auf 64kB) - wenn ich jetzt ein array mit (373, 373) definier bekomm ich einen Fehler und kann nicht kompilieren. Und wenn ich das ganze über eine Variable lösen würde - meiner Meinung nach die einzige Möglichkeit wie binde ich diese dann in VBA ein, damit ich darauf zu greifen kann? Das ist das was ich wissen will und brauch. Ich hoff das war jetzt nicht zu kompliziert... ![]()  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#5 | 
| 
			
			
			
			 Schwarzfußfrettchen 
			![]() Registriert seit: 28.01.2001 
				
				
				
					Beiträge: 2.071
				 
				
				
				
 | 
	
	
	
		
		
			
			 die dll kann doch Methoden bereitstellen, die einen beliebigen Wert aus dem Array (der Datei) zurückgeben, oder? 
		
	
		
		
		
		
		
		
			Also hab ich dann... X = dllfile.GetValue(X,Y) und in der dll dann die Funktion definiert. 
				____________________________________ 
		
		
		
		
		
		
	
	Wann die kan Almdudler ham... \"Es gibt nur einen Weg zur Lunge, und der muss geteert werden, damit der Krebs nicht stolpert!\" http://www.dream.at/gizmo/bunny.gif Image is © 2001 Merle Sterndalsäg.. ähh... jäger  
			 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#6 | |
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 Zitat: 
	
 ![]() sowas ähnliches (nur net so einfach) is mir auch schon in den Sinn gekommen.... Ich muss halt dann die Werte von der DLL einzeln nach VBA schaufeln - und da weiß ich nicht wie schnell VBA da is - aber probieren kann man es ja mal, wenn nicht kann ich mir immer noch was überlegen. ![]() Angeblich (?) kann man Variablen aus der DLL als Objekte bzw. Klassen in einem anderen Projekt bzw. halt in VBA verwenden. Nur bin ich noch net drauf gekommen wie das funktioniert. Wir haben mit dem schon mal mit Public Property ..... in der DLL herum probiert: Code: 
	Public Property Let (od. get?) zahl1(zahl1 as integer) z1 = zahl1 End Property Dann kann man zwar mittels Class1.zahl1 (zahl1 wird einem sogar "vorgeschlagen" wenn man Class1. tippt) mit = auf irgendeinen Wert Setzen - nur den bekommt die DLL nicht. Und umgekehrt kann ich auch keinen Wert aus der DLL so lesen. Die Möglichkeit stammt von unserem Professor - der da aber nicht so 100%ig Sattelfest ist, sonst hätten wirs ja schon. ![]() Er meint, dass man so direkt auf Variablen in der DLL zugreifen könnte, wenn man die so irgendwie deklariert und dann erspart man sich das hin und herschaufeln der Werte. ![]() Naja, mal schaun. ![]()  | 
|
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#7 | 
| 
			
			
			
			 Veteran 
			![]() Registriert seit: 10.01.2001 
				
				
				
					Beiträge: 478
				 
				
				
				
 | 
	
	
	
		
		
			
			 Da habt ihr wohl einen etwas eigenartigen VBA-Code gehabt. 
		
	
		
		
		
		
		
		
		
		
		
	
	Ich habe die Sache gerade versucht und das File war praktisch sofort eingelesen. Im Anhang findet ihr mein Testmatrix-File. Hier mein Code: Sub Makro1() Const ForReading = 1, ForWriting = 2, ForAppending = 3 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Dim FileSys, File, TextStream, strLine Dim arrLines(372, 372) As String Dim SplitLine As Variant, Part As Variant Dim X As Long, Y As Long Set FileSys = CreateObject("Scripting.FileSystemObject") Set File = FileSys.GetFile("c:\Matrix.txt") Set TextStream = File.OpenAsTextStream(ForReading, TristateUseDefault) X = 0 Do While Not TextStream.AtEndOfStream strLine = TextStream.ReadLine SplitLine = Split(strLine, ",") Y = 0 For Each Part In SplitLine arrLines(X, Y) = Part Y = Y + 1 Next X = X + 1 Loop TextStream.Close Stop End Sub  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#8 | 
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 Danke.... 
		
	
		
		
		
		
		
		
		
		
		
	
	Naja, wer die eingebauten Funktionen (split) kennt ist klar im Vorteil.   Ich wusste bis jetzt nix von einer Funktion Split - ich hab mir eine selber geschrieben, die immer den String von bis rausholt.Die Funktioniert ja auch unter VB supa, nur dass der Unterschied zu VBA so groß wär hätt ich nicht gedacht. Das einzige is halt auch, meine Strings sind ein bissi länger (15-20 zeichen  )Außerdem: Warum machst du das File wie bei VBS über das Scripting-Object auf? Das is der Code der das File einliest.... (Trennzeichen ist ein vbLf) Code: 
	Open "h:\prpe\matrix" For Input As #1
    Line Input #1, strwerte
    Close #1
    Trim (strwerte)
    
    
    intdimension = intX - 1
    
    position = InStr(strwerte, vbLf)
    
    For intY = 1 To intdimension
        For intX = 1 To intdimension
            If intY = 1 And intX = 1 Then
            
                Matrix(intY, intX) = Mid(strwerte, 1, position - 1)
                
            Else
                If intY = intdimension And intX = intdimension Then
                
                    Matrix(intX, intY) = Mid(strwerte, position, Len(strwerte) - position)
    
                Else
                
                    position2 = position
                    position = InStr(position + 1, strwerte, vbLf)
                
                    Matrix(intX, intY) = Mid(strwerte, position2, position - position2)
                    
                End If
                
            End If
        
        Next
    Next
![]()  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#9 | 
| 
			
			
			
			 Inventar 
			![]() Registriert seit: 22.10.2000 
				
				Alter: 41 
				
					Beiträge: 5.552
				 
				
				
				
 | 
	
	
	
		
		
			
			 hab deinen Code gerade probiert - hui - split is schnell. 
		
	
		
		
		
		
		
		
		
		
		
	
	Muss ihn nur noch anpassen, dass er mir die Matrix so füllt wie sie dann sein soll, aber sonst passts.  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#10 | 
| 
			
			
			
			 Veteran 
			![]() Registriert seit: 10.01.2001 
				
				
				
					Beiträge: 478
				 
				
				
				
 | 
	
	
	
		
		
			
			 Bzgl. Warum machst du das File wie bei VBS über das Scripting-Object auf?  
		
	
		
		
		
		
		
		
		
		
		
	
	...Also jetzt wo du fragst weiss ich's eigentlich auch nicht so genau ![]() Für so kleine Code-Teile denke ich meistens nicht gross nach sondern schreibe nach Gefühl. Wirklich zu denken fang ich erst an wenn ich etwas schreiben muss, dass sich dann auch im Alltag beweisen muss. Was die Geschwindigkeit angeht, so sollte man immer versuchen rechenintensive Schritte in Schleifen so gut wie möglich zu optimieren. so long Seidl  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
		
		
		
	 | 
![]()  | 
	
	
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
		
  | 
	
		
  |