Excel 2003 VBA Tabellenblatt Select wirkungslos?

Hallo zusammen,

ich arbeite in einem großen Konzern, bei dem ich keinen Einfluss auf die Konfiguration habe.
Wir arbeiten mit Windows XP und und Excel 2003.

Ich habe nun folgendes Problem:
Ich wollte über VBA in Arbeitsblätter schreiben.
Die Anwendung ist dazu gedacht, ausgelernte Azubis den Zielabteilungen zuzuordnen. In ein Arbeitsblatt, in dem eine Matrix aufgebaut wird, werden jeweils die Rankings eingetragen - der Abteilungen, die die Auszubildenden bewerten und der Auszubildenden, die die Abteilungen bewerten, so dass ein pairing stattfinden kann.

Das Source-Arbeitsblatt ist folgendermaßen strukturiert:

Überschrift
Abteilungen
Abteilung 1
Abteilung 2
Abteilung 3

Auszubildende
Name 1
Name 2
Name 3

Die Idee ist, aus einem vorbereiteten Arbeitsblatt die Werte in eine Tabelle zu lesen und in ein anderes Arbeitsblatt zu schreiben:

Hier mein VBA-Coding:

Option Explicit

' Systemwerte
Type SysVal
' Das Arbeitsblatt, in dem die Ausgelernten und die Abteilungen stehen
 Source As String
' Arbeitsblatt der Matrix
 Matrix As String
' Arbeitsblatt, in das das Ergebnis geschrieben wird
 Resultat As String
' Tabellen-Limit der zu verteilenden Ausgelernten
 Ausgelernte\_Lim As Integer
' Tabellen-Limit Anzahl der Abteilungen
 Abteilungen\_Lim As Integer
End Type

' Struktur für die Auszubildenden
Type Azubi
' Markieren, wenn einer schon vergeben ist
 Mark As Boolean
' Name
 Name As String
End Type

Public SysValues As SysVal

' Tabelle für Abteilungen
Type TabsAbt
' Counter
 Counter As Integer
' Abteilungen
 Abt(20) As String
End Type

Public TabsAbteilung As TabsAbt

' Tabelle für die Auszubildenden
Type Azubis
' Counter
 Counter As Integer
' Abteilungen
 Azubis(20) As Azubi
End Type

Public TabsAzubis As Azubis

Private Sub Matrix()
SystemValues
FillTabs
End Sub

Private Sub SystemValues()
SysValues.Source = "Abteilungen-Auszubildende"
SysValues.Matrix = "Matrix"
SysValues.Resultat = "Bewertet"
SysValues.Ausgelernte\_Lim = 20
SysValues.Abteilungen\_Lim = 20
End Sub

Private Sub FillTabs()
Dim i1 As Integer
Dim i2 As Integer
Dim Line As Integer
Dim Modus As Integer
Dim SWModus As String
Dim BStop As Boolean
Sheets(SysValues.Source).Select
Line = 2
While Len(LTrim(RTrim(Cells(Line, 1)))) Or BStop
 If UCase(Cells(Line, 1)) = "ABTEILUNGEN" Or \_
 UCase(Cells(Line, 1)) = "AUSZUBILDENDE" Then
 SWModus = UCase(Cells(Line, 1))
 Select Case SWModus
 Case "ABTEILUNGEN"
 Modus = 1
 Case "AUSZUBILDENDE"
 Modus = 2
 End Select
 Else
 Select Case Modus
 Case 1
 TabsAbteilung.Counter = TabsAbteilung.Counter + 1
 If TabsAbteilung.Counter \> SysValues.Abteilungen\_Lim Then
 MsgBox "Zu viele Abteilungen"
 Else
 TabsAbteilung.Abt(TabsAbteilung.Counter) = Trim(Cells(Line, 1))
 End If

 Case 2
 TabsAzubis.Counter = TabsAzubis.Counter + 1
 If TabsAzubis.Counter \> SysValues.Ausgelernte\_Lim Then
 MsgBox "Zu viele Auszubildende"
 Else
 TabsAzubis.Azubis(TabsAzubis.Counter).Name = Trim(Cells(Line, 1))
 End If
 End Select
 End If
 Line = Line + 1
Wend

' Da ich mit dem Select scheiterte, versuchte ich, das Blatt neu anzulegen.

For i1 = 1 To Application.Sheets.Count
 If Application.Sheets(i1).Name = SysValues.Matrix Then
 Application.Sheets(i1).Delete
 i1 = Application.Sheets.Count + 1
 End If
Next
Set NewSheet = Application.Sheets.Add(Type:=xlWorksheet, After:=Worksheets(Worksheets.Count))
NewSheet.Name = SysValues.Matrix




**Worksheets(SysValues.Matrix).Select**

i2 = 1
Cells(i2, 1) = "Zuordnungen"
For i1 = 1 To TabsAbteilung.Counter
 i2 = i2 + 1
 Cells(i2, 1) = TabsAbteilung.Abt(i1)
Next i1

i2 = i2 + 1
Cells(i2, 1) = "Azubis"
For i1 = 1 To TabsAzubis.Counter
 i2 = i2 + 1
 Cells(i2, 1) = TabsAzubis.Azubis(i1).Name
Next i1

End Sub

Das markierte Select bringt es nicht, das Arbeitsblatt aus dem gelesen wurde, wird überschrieben. Ich bin schier am Verzweifeln?

Excel 2003 VBA Tabellenblatt Select wirkungslos
Habe leider die Netiquette vergessen,
sorry dafür!

Thomas

Guten Tag,

dann lass doch das Selecten und verwende den eh schon angelegten Objektpointer Newsheet - arbeite mit vollständigen Objektpfaden …

Hallo Thomas,

RTrim(LTrim(… Wieso nicht Trim?
BStop wird nie True.
ungetestet:

Option Explicit

' Systemwerte
Type SysVal
' Das Arbeitsblatt, in dem die Ausgelernten und die Abteilungen stehen
 Source As String
' Arbeitsblatt der Matrix
 Matrix As String
' Arbeitsblatt, in das das Ergebnis geschrieben wird
 Resultat As String
' Tabellen-Limit der zu verteilenden Ausgelernten
 Ausgelernte\_Lim As Integer
' Tabellen-Limit Anzahl der Abteilungen
 Abteilungen\_Lim As Integer
End Type

' Struktur für die Auszubildenden
Type Azubi
' Markieren, wenn einer schon vergeben ist
 Mark As Boolean
' Name
 Name As String
End Type

' Tabelle für Abteilungen
Type TabsAbt
' Counter
 Counter As Integer
' Abteilungen
 Abt(20) As String
End Type

' Tabelle für die Auszubildenden
Type Azubis
' Counter
 Counter As Integer
' Abteilungen
 Azubis(20) As Azubi
End Type

Public TabsAbteilung As TabsAbt
Public SysValues As SysVal
Public TabsAzubis As Azubis

Private Sub Matrix()
SystemValues
FillTabs
End Sub

Private Sub SystemValues()
SysValues.Source = "Abteilungen-Auszubildende"
SysValues.Matrix = "Matrix"
SysValues.Resultat = "Bewertet"
SysValues.Ausgelernte\_Lim = 20
SysValues.Abteilungen\_Lim = 20
End Sub

Private Sub FillTabs()
Dim i1 As Integer
Dim i2 As Integer
Dim Line As Integer
Dim BStop As Boolean
With Worksheets(SysValues.Source)
 Line = 3
 While Len(LTrim(RTrim(.Cells(Line, 1)))) Or BStop
 Select Case UCase(Cells(2, 1))
 Case "ABTEILUNGEN"
 TabsAbteilung.Counter = TabsAbteilung.Counter + 1
 If TabsAbteilung.Counter \> SysValues.Abteilungen\_Lim Then
 MsgBox "Zu viele Abteilungen"
 Else
 TabsAbteilung.Abt(TabsAbteilung.Counter) = Trim(.Cells(Line, 1))
 End If
 Case "AUSZUBILDENDE"
 TabsAzubis.Counter = TabsAzubis.Counter + 1
 If TabsAzubis.Counter \> SysValues.Ausgelernte\_Lim Then
 MsgBox "Zu viele Auszubildende"
 Else
 TabsAzubis.Azubis(TabsAzubis.Counter).Name = Trim(.Cells(Line, 1))
 End If
 End Select
 Line = Line + 1
 Wend
End With
For i1 = Worksheets.Count To 1 Step -1
 If Application.Sheets(i1).Name = SysValues.Matrix Then
 Application.DisplayAlerts = False
 Worksheets(i1).Delete
 Application.DisplayAlerts = True
 Exit For
 End If
Next i1
Set NewSheet = Application.Sheets.Add(Type:=xlWorksheet, After:=Worksheets(Worksheets.Count))
NewSheet.Name = SysValues.Matrix
With Worksheets(SysValues.Matrix)
 .Cells(1, 1) = "Zuordnungen"
 For i1 = 1 To TabsAbteilung.Counter
 .Cells(i1 + 1, 1) = TabsAbteilung.Abt(i1)
 Next i1
 i2 = i1
 .Cells(i2, 1) = "Azubis"
 For i1 = 1 To TabsAzubis.Counter
 .Cells(i2 + i1, 1) = TabsAzubis.Azubis(i1).Name
 Next i1
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

das ist ein Erbe aus der Vergangenheit, ich verwende in aktuellen Codings stets Trim!

BStop wird nie True. Das liegt daran, dass ich den Algorithmus, der BStop bedient, nicht in den Code-Snippet eingebaut habe, um es einfach zu halten.

Gruß
Thomas

RTrim(LTrim(… Wieso nicht Trim?
BStop wird nie True.
ungetestet:

Gruß
Reinhard

Excel 2003 VBA Tabellenblatt Select wirkungslos
Hallo zusammen,

ich musste feststellen, dass ich vergessen habe, die Tabellenzähler zurückzusetzen.

Gruß
Thomas

Hallo Thomas,

kann es sein daß du meinen Code gar nicht gelesen/getestet hat?

Gruß
Reinhard

Hallo Reinhard,

ich habe den Code nicht bemerkt! Du müsstest das Ergänzte schon kenntlich machen, damit es auch auffällt!

Gruß
Thomas

kann es sein daß du meinen Code gar nicht gelesen/getestet hat?

Hallo Reinhard,

kaum habe ich Deinen Code entdeckt, schon funktioniert es! Bleibt die Frage, warum das Worksheet-Select nicht funktioniert.

Vielen Dank und Gruß
Thomas

kann es sein daß du meinen Code gar nicht gelesen/getestet hat?

kann es sein daß du meinen Code gar nicht gelesen/getestet hat?

Hallo Thomas,

ich habe den Code nicht bemerkt!

Oh Schreck oh Graus, welch schlimmes Ungemach für euch Meister :frowning:

Du müsstest das Ergänzte
schon kenntlich machen, damit es auch auffällt!

Wie wahr, wie wahr, ich Unwürdiger bereue zutiefst.

So, jetzt mal Ende mit lustigen Antworten aus dem Morgenland.
Ich übersetze die mal so wie ich das sehe:

Bist du panne? Du fragst hier für Hilfe an, ich opfer Zeit, mühe
und biete dir einen Code als Lösungsansatz und du nimmst den nicht
mal wahr?
Okay, wenn da in einer Zeile steht
ungetestet:

Und darunter beginnt dann der Code so muß ja nicht jeder verstehen
daß da ein Zusammenhang besteht.

Und ich habe da einiges abgeändert, da hätte ich ja einen 20 zeiler
an Kommentaren schreiben müssen.
Da so viel geändert wurde MUß das dem Ursprungscodeerstellert
ins Auge hüpfen.
Dann ist es natürlich in seinem Eigenintersses a) meinen Code auszuprobieren und zu berichten, b) seinen und meinen Code vergleichen.

Gruß
Reinhard

Hallo Thomas,

kaum habe ich Deinen Code entdeckt, schon funktioniert es!

? was bitte? mein Code, dein Code?
Wenn dein Code auf einmal funktioniert ohne Codeänderung so mutmaße
ich er hat andere Startbedingungen.
So ein Codeverhalten kann auftreten wenn bei Codestart mal das eine
Blatt aktiv ist oder beim nächsten Start ein anderes Blatt.
Je nach Code passiert es dann das er sich unterschiedlich verhält.

Bleibt die Frage, warum das Worksheet-Select nicht funktioniert.

Select ist zu 99% völlig unnötig und kontraproduktiv für Codelesbarkeit, Codeschnelligkeit u.v.m. Deshalb benutze ich es
ausnahmsweise nur dann wenn es wirklich notwendig ist.

Insofern müßte ich das Verhalten in deinem Fall explicit testen.
Was auch wie oben gesagt einschließt verschiedene Startbedingungen
nachzubauen.

Ich habe dir Alterntiven aufgezeigt, With-Schleifen.
Mache dich darüber schlau. Beachte dabei den Punkt vor z.B.
.Cells, der sit wichtig.

Du hast in einem Beitrag was von verzählt gesagt beim
Worksheet-Index o.ä.
Ich nehme an es betrifft die For-Schleife wo du alle
Blätter durchgehst um ein bestimmtes zu löschen.

Genauso wie beim Zellen/Zeilen-Löschen in Spalten geht man
da fast immer nicht von oben nach unten sondern von unten nach oben.
Beim Blattlöschen also von rechts nach links bezogen auf die Blattnamen die man unten sieht.

Wenn x die anzahl der Blätter ist dann
For N = x to 1 Step -1
und nicht
For N = 1 to x

Gruß
Reinhard

Ich bin Dir trotz Deiner Tiraden dankbar, dass die Lösung funktioniert,

  • wenn Du Deinen Code im Keller des Scroll-Bereiches versteckst, kannst Du nicht erwarten, dass ich das sehe.
    Du hättest statt eines 20-Zeiler-Kommentars auch schreiben können: Alternativ-Coding siehe unten.
    Ich weiß, ich bin undankbar, aber ich mag es nicht, wenn man mich verhöhnt!

Und darunter beginnt dann der Code so muß ja nicht jeder
verstehen
daß da ein Zusammenhang besteht.

Und ich habe da einiges abgeändert, da hätte ich ja einen 20
zeiler
an Kommentaren schreiben müssen.
Da so viel geändert wurde MUß das dem Ursprungscodeerstellert
ins Auge hüpfen.
Dann ist es natürlich in seinem Eigenintersses a) meinen Code
auszuprobieren und zu berichten, b) seinen und meinen Code
vergleichen.

Gruß
Reinhard

Hallo Thomas,

Ich bin Dir trotz Deiner Tiraden dankbar, dass die Lösung
funktioniert,

Dankeschön.

  • wenn Du Deinen Code im Keller des Scroll-Bereiches
    versteckst, kannst Du nicht erwarten, dass ich das sehe.

WANN habe ich meine „Tiraden“ geschrieben?
Erst NACHDEM ich sachlich nachgefragte ob du meinen Code überhaupt
wahrgenommen hast. Denn so ein nichwahrnehmbaren kann jedem passieren,
deshalb fragte ich nach.

Dann kam deine pampige Antwort, DANN folgten logo meine Tiraden.
Warum zum henker hast du nicht so wie ich im gleichen Fall reagiert?
Ich hätte geschrieben, Oh Mist, glatt übersehen, ich teste mal…
Oder irgendsowas.

Nein, du reagierst auf meine Nachfrage mit einem Nebenkriegsschauplatz
(dein Hauptplatz ist die Lösung deines Codeproblems) mit Angriff
auf mich der ich dir helfe.

Ich will dir mal sehr ehrlich etwas sagen, mal angenommen, dein
Konzern, du, hätten mich als Auftragsprogrammierer für da dieses
Problem engagiert.
Bis zu deiner gewissen Grenze mache ich dann so was auch mit,
aber sei sehr versichert, jede solche miese Reaktion findet sich
in meiner Rechnung an euch wieder. Logisch nicht sichtbar.

Lassen wir das unerquickliche Thema.
Nachdem ich meine Tiraden hier schrieb habe ich dir dann
auf deinen anderen Beitrag geantwortet und dir diverse Tipps gegeben.
Konzentriere dich darauf.

Gruß
Reinhard

Hallo Reinhard,

lass uns den Frieden schließen, immerhin bin ich Dir dankbar, dass es so gut ausgegangen ist. Ich bin bereit, Irrtümer zuzugeben, aber auch ich habe meinen Stolz!

Gruß und vielen Dank
Thomas

Hallo Thomas,

Dankeschön.

  • wenn Du Deinen Code im Keller des Scroll-Bereiches
    versteckst, kannst Du nicht erwarten, dass ich das sehe.

WANN habe ich meine „Tiraden“ geschrieben?
Erst NACHDEM ich sachlich nachgefragte ob du meinen Code
überhaupt
wahrgenommen hast. Denn so ein nichwahrnehmbaren kann jedem
passieren,
deshalb fragte ich nach.

Dann kam deine pampige Antwort, DANN folgten logo meine
Tiraden.
Warum zum henker hast du nicht so wie ich im gleichen Fall
reagiert?
Ich hätte geschrieben, Oh Mist, glatt übersehen, ich teste
mal…
Oder irgendsowas.

Nein, du reagierst auf meine Nachfrage mit einem
Nebenkriegsschauplatz
(dein Hauptplatz ist die Lösung deines Codeproblems) mit
Angriff
auf mich der ich dir helfe.

Lassen wir das unerquickliche Thema.
Nachdem ich meine Tiraden hier schrieb habe ich dir dann
auf deinen anderen Beitrag geantwortet und dir diverse Tipps
gegeben.
Konzentriere dich darauf.

Gruß
Reinhard