paescu
Goto Top

VBA - Tabellenname im Excel übergeben, dann damit weiterarbeiten

Guten Morgen miteinander

Ich stehe wieder einmal an beim VBA programmieren... face-sad
Und zwar sollte ich folgendes machen: Da ich jetzt ziemlich langen Code habe, der recht unübersichtlich ist, will ich einen Vorgang, der vier Mal ausgeführt wird und immer separat in einer Funktion ist, in eine einzige solche packen. Dazu muss ich natürlich Variabeln übergeben, dass das geht. Unter Anderem auch die Tabelle, in der der Code ausgeführt werden soll, also zum Beispiel "Tabelle2" damit ich in der Funktion dann "Tabelle2.Activate" oder so erhalte, aber das Tabelle2 muss Variabel sein. Ich habe es schon mit einigen Datentypen probiert, es ging auch ein paar Mal, aber dan blieb es hier hängen: "If Tabelle2.Cells(zahl, 1) = "" Then ..."
Was soll das? Ich weiss echt nicht mehr, was ich tun soll, möchte diesen Code endlich übersichtlicher und wenn dies in einer Funktion ist, muss ich nicht an vier Stellen was ändern, sondern nur an einer (weniger Arbeitsaufwand).

Hoffe ihr versteht mich

Gruss
Pascal

Content-ID: 38567

Url: https://administrator.de/contentid/38567

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

Stefan764
Stefan764 24.08.2006 um 19:08:04 Uhr
Goto Top
Den Namen der Zieltabelle als Parameter zu übergeben geht z.B. so:

Public Sub test(TabStr As String)

Dim TabObj As Worksheet
Set TabObj = Application.Worksheets(TabStr)

TabObj.Cells(1, 1) = "Hallo, ich bin " & TabStr  

Set TabObj = Nothing

End Sub



Public Sub t1()

test ("Tabelle1")  
test ("Tabelle2")  
test ("Tabelle3")  

End Sub
Paescu
Paescu 24.08.2006 um 20:53:30 Uhr
Goto Top
Danke, sieht recht logisch aus, werde es gleich am Montag testen, morgen habe ich (leider) Schule, da kann ich nicht an diesem Auftrag weiterarbeiten...

Pascal
Paescu
Paescu 28.08.2006 um 09:31:01 Uhr
Goto Top
@Stefan764
Hat super funktioniert, danke!

Nun aber noch ne andere Frage... Weisst du auch, wie man dasselbe mit einem global deklarierten Array macht? Also, so dass ich nur den Namen übergebe und den Rest in der Funktion ist, damit ich mehrere Array nutzen kann in einer Funktion (pro Aufruf ein Array)... Hoffe du kommst draus

Pascal
Stefan764
Stefan764 28.08.2006 um 15:54:12 Uhr
Goto Top
Tut mir leid, aber ich verstehe nicht ganz, was du meinst.

Was willst du in den globalen Arrays speichern ? Die Tab-Namen oder Was ?
Paescu
Paescu 28.08.2006 um 19:37:21 Uhr
Goto Top
Ne nicht die Tabellennamen, die habe ich nur übergeben, dass die Funktion weiss, in welcher Tabelle was kopiert werden muss. Und da kommt das Array ins Spiel, von jeder Tabelle werden Einträge in Arrays gespeichert (insgesamt 4 Tabellen -> 4 Arrays) und wenn ich zum Beispiel Tabelle2 übergebe, muss ich die Daten in das arrayHardware speichern, wenn ich aber Tabelle3 übergebe, muss arraySoftware genommen werden... die Arrays sind global deklariert, weil sie später noch in einer anderen Funktion gebraucht werden...
Hoffe, du verstehst mich nun besser und wenn nicht, einfach fragen face-wink

Pascal
Stefan764
Stefan764 28.08.2006 um 21:20:23 Uhr
Goto Top
Wie währe es mit mehrdimensionalen Arrays ?

Dim Alles(0 To 3, 0 To 100) As String

Alles(0,0) = "Hardware1"  
Alles(0,1) = "Hardware2"  

Alles(1,0) = "Software1"  
Alles(1,1) = "Software2"  

Alles(2,0) = "Firmware1"  
Alles(2,1) = "Firmware2"  

Alles(3,0) = "Freeware1"  
Alles(3,1) = "Freeware2"  
....

Diese Methode ist leider sehr unflexiebel, was die Größe des Arrays angeht.

In anderen Sprachen würde ich dynamische Objekte und Zeiger verwenden.
z.B. TStringList und TList in Delphi

Mit VBA geht das vielleicht auch - aber ich weiß nicht, wie.
Paescu
Paescu 28.08.2006 um 21:49:47 Uhr
Goto Top
Ne das ist nicht ne gute Lösung, denn ich weiss nie, wieviele Datensätze es in dem Array werden, also, zum Beispiel könnte es so aussehen:

ArrayHardware(0,0) = Anzahl
ArrayHardware(1,0) = Artikel-Nr.
ArrayHardware(2,0) = Option

Und das bei allen vier Tabellen so...
Dann kann es schlussendlich so aussehen:

ArrayHardware(0,21) = "5"
ArrayHardware(1,21) = "D5GW3"
ArrayHardware(2,21) = "53S"

Also geht deine Methode irgendwie nicht... face-sad
Könnte es unter Umständen schon mit einem einzigen Array machen, was aber ziemlich aufwendig ist... Aber ich könnte es morgen einmal probieren, da mir sowieso nichts anderes übrig bleiben wird... face-sad

Pascal
Stefan764
Stefan764 28.08.2006 um 22:24:39 Uhr
Goto Top
Vielleicht ist es das, was du suchst :

Dim A1(0 To 10, 0 To 5) As String
Dim A2(0 To 2, 0 To 2, 0 To 2) As String
Dim A3(0 To 5, 0 To 8) As String

Dim Alles(0 To 2) As Variant

Alles(0) = A1
Alles(1) = A2
Alles(2) = A3

Alles(0)(0, 0) = "Hardware1"  
Alles(0)(1, 0) = "Hardware2"  
Alles(0)(2, 0) = "Hardware3"  
Alles(0)(3, 0) = "Hardware4"  
Alles(0)(4, 0) = "Hardware5"  
Alles(0)(5, 0) = "Hardware6"  

Alles(1)(0, 0, 0) = "Software1"  
Alles(1)(1, 0, 0) = "Software2"  

Alles(2)(0, 0) = "Freeware1"  
Alles(2)(1, 0) = "Freeware2"  
Alles(2)(2, 0) = "Freeware3"  
Alles(2)(3, 0) = "Freeware4"  
Alles(2)(4, 0) = "Freeware5"  


MsgBox (Alles(0)(0, 0))
MsgBox (Alles(1)(0, 0, 0))
MsgBox (Alles(2)(0, 0))

<klug###>

Solche Programmtechniken haben ein hohes Fehlerrisiko !
Man gerät sehr schnell aus den Arraygrenzen heraus.

</klug###>
Paescu
Paescu 29.08.2006 um 08:27:24 Uhr
Goto Top
Wusste ich gar nicht, dass sowas geht... Aber wäre auch ne Lösung... Ich muss schauen, welche dass ich nehme, werde es dann hier bekannt geben...

Nochmal danke an alle, die sich Mühe gegeben haben!

Pascal
Paescu
Paescu 30.08.2006 um 16:01:19 Uhr
Goto Top
Habe nun ein einziges Array genommen, ist leicht und funktioniert so wie es soll!

Somit habe ich diesen Schritt nun (endlich) fertig =)

Ich denke, in den nächsten Tagen werden wieder ein paar fragen von mir auftauchen face-wink

Gruss Pascal