Fehler im Code aber wo?

Hallo
habe folgendes Problem:
Habe einen Code zur Verschiebung mit bedingung von Textfeldern in einem Makro erstellt das startet wenn ich auf den Button drücke. Dann braucht er sehr lange bis ein Ergebnis kommt bei 10 Zeilen zu 256 Spalten schafft er es sobald ich mehr als 10 Zeilen einstelle kommt er nicht weiter…

Ich hoffe ihr könnt mir helfen…

Freundliche Grüße

hier noch der Code:

Sub Schaltfläche1084_BeiKlick()
Dim lngSpalte As Long
Dim lngLetzteSpalte As Long
Dim lngZeile As Long
Dim lngLetzteZeile As Long

lngLetzteZeile = 50 //eingabe der zeilen
lngLetzteSpalte = 256 //eingabe der spalten
For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „“
If Trim(Cells(lngZeile, lngSpalte).Text) „“ Then
Select Case LCase(Cells(lngZeile, lngSpalte).Text)
Case Is = „u“
Case Is = „k“
Case Is = „ÜA“
Case Else
If Cells(lngZeile, lngSpalte).Font.Italic Then
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „geplant“
Else
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „fest“
End If
End Select
End If
Next
Next
End Sub

Probiers mit:

If Trim(Cells(lngZeile, lngSpalte).Value) „“ Then
Select Case LCase(Cells(lngZeile, lngSpalte).Value)

oder gleich:

If Trim(Cells(lngZeile, lngSpalte)) „“ Then
Select Case LCase(Cells(lngZeile, lngSpalte))

Warum Dein Code allerdings so lange läuft kann ich bei dem reduzierten Zustand nicht beantworten. Ich vermute mal, je nach case wird eine andere sub aufgerufen?

Hallo,

die Informations-Email über diese Nachricht hat mich erstmal wieder daran erinnert, das ich hier noch angemeldet bin. „Leider“ arbeite ich jetzt schon einige Jahre nicht mehr mit VB(A), aber ich versuche mit meinem „Restwissen“ zu helfen.

Zunächstmal kann ich in dem Code keinen offensichtlichen Grund entdecken, wieso die Funktion „nicht fertig wird“.
Dies könnte ich mir eigetnlich nur durch eine Endlosschleife oder falsch/nicht beendete Rekursion erklären, danach sieht es aber nicht aus.
Vielleicht liegt diese Einschränkung aber tatsächlich in der Speicherzusicherung des VBA-Compilers.

Folgende Dinge sind mir jedoch aufgefallen:

  1. Innerhalb des Select Statements ist der Fall „Is = ÜA“ aufgeführt, welcher nie getroffen werden kann, da die Funktion „LCase“ angewendet wird
  2. Muss man bei VB die einzelnen Cases nicht mit einem Schlüsselwort beenden wie zum Beispiel in Java oder PHP mit „break“? Leider nur noch halbwissen

Hallo
habe folgendes Problem:
Habe einen Code zur Verschiebung mit bedingung von Textfeldern
in einem Makro erstellt das startet wenn ich auf den Button
drücke. Dann braucht er sehr lange bis ein Ergebnis kommt bei
10 Zeilen zu 256 Spalten schafft er es sobald ich mehr als 10
Zeilen einstelle kommt er nicht weiter…

Ich hoffe ihr könnt mir helfen…

Freundliche Grüße

Hallo dr.fagott12345,
zunächst ein paar tips:
a) bitte genauere Angaben zur Programmumgebung (Excel-Version, etc.)
b) bitte genaue Beschreibung, was das Makro eigentlich tun soll (hier sehe ich nur 2 verschachtelte Schleifen)
c) um Laufzeiten zu ermitteln, 2 Variablen z. B. startzeit, endzeit as date hinzufügen und diese vor bzw. nach dem kritischen Programmcode auf now() setzen. Dann sieht man auch, wie lange die Schleifen laufen (bei mir unter Excel2003 nicht mal eine Sekunde)

Es ist für mich nicht nachvollziehbar, welche Aufgabe die beiden Schleifen haben, ausser dass sie einen Bereich von 255 Spalten x 46 Zeilen = 11730 Zellen abdecken.
Der SELECT kann m. E. ganz entfallen, da nur der CASE ELSE einen relevanten Code enthält.
Die Aussage, mehr als 10 Zeilen schafft er nicht, kann ich mit diesem Code nicht nachvollziehen, da von 6 bis 50 gezählt wird und dies definitiv mehr als 10 Zeilen sind.

Also: Um sinnvoll helfen zu können benötige ich eine komplette Beispieldatei und/oder eine hinreichende Erklärung, welche Texte wo stehen und wie behandelt werden müssen.

Gruß
Harry

Hallo Dr.Fagott,

ist meine erste Anfrage. Hab ein Weilchen gebraucht, um den Code aus der von W-W-W übermittelten Form in eine für mich lesbare Form zu überführen.
Konnte erst mal nichts finden. Werde in den nächsten Tagen nochmal drüber nachgrübeln.

Gruß

Markus

Hallo,

  1. würde ich „Cells()“ nicht ohne Parent-Referenzierung angeben. Besser ActiveSheet.Cells() …

  2. statt Cells().Text sollte wohl Cells().Value benutzt werden, nehme ich an …

… wenn ich beide Änderungen im Code vornehme, dann funktioniert er bei mir.

LG

oke habe ihn nun zum laufen gebracht…

Das Problem ist wenn ich den Button zum Starten auf das Datenblatt setze funktioniert er…
aber sobald ich ihn auf die Auswerttabelle setzte schreibt er in die hilfstabelle immer fest rein auch wenn sie nach der Datentabelle geplant seien müssten…

wo liegt da das problem?

so sieht er nun aus:

Sub Schaltfläche21_BeiKlick() 'bei klick startet mein programm
Dim lngSpalte As Long
Dim lngLetzteSpalte As Long
Dim lngZeile As Long
Dim lngLetzteZeile As Long
Dim wksQuelle As Worksheet 'hilfsarbeitsblatt

Set wksQuelle = ThisWorkbook.Worksheets(„Jun 09 bis Feb 10“) 'Tabelle mit den Daten.

lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, 1).End(xlUp).Row 'länge meiner zeile

lngLetzteSpalte = IIf(IsEmpty(wksQuelle.Cells(1, wksQuelle.Columns.Count)), wksQuelle.Cells(1, wksQuelle.Columns.Count).End(xlToLeft).Column, wksQuelle.Columns.Count)
'länge meiner spalte

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Worksheets(„hilfstabelle“).UsedRange.ClearContents
For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile

If Trim(wksQuelle.Cells(lngZeile, lngSpalte).Text) „“ Then
Select Case LCase(wksQuelle.Cells(lngZeile, lngSpalte).Text)
Case Is = „u“
Case Is = „k“
Case Is = „üa“ 'kleinbuchstaben
Case Else
If Cells(lngZeile, lngSpalte).Font.Italic Then
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „geplant“
Else
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „fest“
End If
End Select
End If
Next
Next

Worksheets(„hilfstabelle“).Visible = True 'sichtbar true, unsichtbar false

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

oke habe ihn nun zum laufen gebracht…

Das Problem ist wenn ich den Button zum Starten auf das Datenblatt setze funktioniert er…
aber sobald ich ihn auf die Auswerttabelle setzte schreibt er in die hilfstabelle immer fest rein auch wenn sie nach der Datentabelle geplant seien müssten…

wo liegt da das problem?

so sieht er nun aus:

Sub Schaltfläche21_BeiKlick() 'bei klick startet mein programm
Dim lngSpalte As Long
Dim lngLetzteSpalte As Long
Dim lngZeile As Long
Dim lngLetzteZeile As Long
Dim wksQuelle As Worksheet 'hilfsarbeitsblatt

Set wksQuelle = ThisWorkbook.Worksheets(„Jun 09 bis Feb 10“) 'Tabelle mit den Daten.

lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, 1).End(xlUp).Row 'länge meiner zeile

lngLetzteSpalte = IIf(IsEmpty(wksQuelle.Cells(1, wksQuelle.Columns.Count)), wksQuelle.Cells(1, wksQuelle.Columns.Count).End(xlToLeft).Column, wksQuelle.Columns.Count)
'länge meiner spalte

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Worksheets(„hilfstabelle“).UsedRange.ClearContents
For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile

If Trim(wksQuelle.Cells(lngZeile, lngSpalte).Text) „“ Then
Select Case LCase(wksQuelle.Cells(lngZeile, lngSpalte).Text)
Case Is = „u“
Case Is = „k“
Case Is = „üa“ 'kleinbuchstaben
Case Else
If Cells(lngZeile, lngSpalte).Font.Italic Then
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „geplant“
Else
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „fest“
End If
End Select
End If
Next
Next

Worksheets(„hilfstabelle“).Visible = True 'sichtbar true, unsichtbar false

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

oke habe ihn nun zum laufen gebracht…

Das Problem ist wenn ich den Button zum Starten auf das Datenblatt setze funktioniert er…
aber sobald ich ihn auf die Auswerttabelle setzte schreibt er in die hilfstabelle immer fest rein auch wenn sie nach der Datentabelle geplant seien müssten…

wo liegt da das problem?

so sieht er nun aus:

Sub Schaltfläche21_BeiKlick() 'bei klick startet mein programm
Dim lngSpalte As Long
Dim lngLetzteSpalte As Long
Dim lngZeile As Long
Dim lngLetzteZeile As Long
Dim wksQuelle As Worksheet 'hilfsarbeitsblatt

Set wksQuelle = ThisWorkbook.Worksheets(„Jun 09 bis Feb 10“) 'Tabelle mit den Daten.

lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, 1).End(xlUp).Row 'länge meiner zeile

lngLetzteSpalte = IIf(IsEmpty(wksQuelle.Cells(1, wksQuelle.Columns.Count)), wksQuelle.Cells(1, wksQuelle.Columns.Count).End(xlToLeft).Column, wksQuelle.Columns.Count)
'länge meiner spalte

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Worksheets(„hilfstabelle“).UsedRange.ClearContents
For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile

If Trim(wksQuelle.Cells(lngZeile, lngSpalte).Text) „“ Then
Select Case LCase(wksQuelle.Cells(lngZeile, lngSpalte).Text)
Case Is = „u“
Case Is = „k“
Case Is = „üa“ 'kleinbuchstaben
Case Else
If Cells(lngZeile, lngSpalte).Font.Italic Then
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „geplant“
Else
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „fest“
End If
End Select
End If
Next
Next

Worksheets(„hilfstabelle“).Visible = True 'sichtbar true, unsichtbar false

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

.

oke habe ihn nun zum laufen gebracht…

Das Problem ist wenn ich den Button zum Starten auf das Datenblatt setze funktioniert er…
aber sobald ich ihn auf die Auswerttabelle setzte schreibt er in die hilfstabelle immer fest rein auch wenn sie nach der Datentabelle geplant seien müssten…

wo liegt da das problem?

so sieht er nun aus:

Sub Schaltfläche21_BeiKlick() 'bei klick startet mein programm
Dim lngSpalte As Long
Dim lngLetzteSpalte As Long
Dim lngZeile As Long
Dim lngLetzteZeile As Long
Dim wksQuelle As Worksheet 'hilfsarbeitsblatt

Set wksQuelle = ThisWorkbook.Worksheets(„Jun 09 bis Feb 10“) 'Tabelle mit den Daten.

lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, 1).End(xlUp).Row 'länge meiner zeile

lngLetzteSpalte = IIf(IsEmpty(wksQuelle.Cells(1, wksQuelle.Columns.Count)), wksQuelle.Cells(1, wksQuelle.Columns.Count).End(xlToLeft).Column, wksQuelle.Columns.Count)
'länge meiner spalte

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Worksheets(„hilfstabelle“).UsedRange.ClearContents
For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile

If Trim(wksQuelle.Cells(lngZeile, lngSpalte).Text) „“ Then
Select Case LCase(wksQuelle.Cells(lngZeile, lngSpalte).Text)
Case Is = „u“
Case Is = „k“
Case Is = „üa“ 'kleinbuchstaben
Case Else
If Cells(lngZeile, lngSpalte).Font.Italic Then
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „geplant“
Else
Worksheets(„hilfstabelle“).Cells(lngZeile, lngSpalte).Value = „fest“
End If
End Select
End If
Next
Next

Worksheets(„hilfstabelle“).Visible = True 'sichtbar true, unsichtbar false

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
.

also, ich würde immer, wenn ich „cells()“ benutze, das richtige datenblatt davorsetzen, also thisworkbook.sheets(„Jun 09 bis Feb 10“).cells(…) bzw thisworkbook.sheets(„hilfstabelle“).cells(…)

dann ist es egal, in welchem modul sich der code befindet, er schreibt immer in die richtigen blätter.

ja in die richtigen blätter schreibt er ja nur das falsche…

nun, um das zu beurteilen, müsste ich schon wissen, wie es denn funktionieren soll. könnten sie ein beispiel geben bzw. die funktionsweise erläutern?

soll ich ihnen die datei mal zuschicken?

das ist nicht nötig - bitte beschreiben sie einfach kurz, was passieren soll, zb so:

wenn im blatt „hilfstabelle“ in zelle D8 der wert „x“ steh, dann soll im blatt „Jun 09 bis Feb 10“ in der gleichen zelle (also auch in D8) der wert „hallo“ geschrieben werden. nach dem schema dann wie folgt:
x -> hallo
y -> test
z -> erledigt

dann ist die gewünschte logik klar und dann werden wir den fehler auch finden :smile:

okay alles klar

Also die in der Tabele jun 09 bis feb 10 stehen die daten… z.b. in kursiver schrift und die sollen wenn sie kursiv sind als geplant ins hilfsblatt geschrieben werden…

wenn sie normal geschrieben sind soll fest in hilfsblatt geschrieben werden…

bei u, k, und üa soll nicht geschehen

also wenn in jun09bisfeb10 / b8 arbeit(kursiv) steht soll er in hilfstabelle / b8 geplant reinschreiben

gruß dr.fagott

ok, das habe ich wie folgt gelöst:

Sub DataTransfer()
Dim lngSpalte As Long, lngLetzteSpalte As Long
Dim lngZeile As Long, lngLetzteZeile As Long
Dim wksQuelle As Worksheet, wksZiel As Worksheet
Dim LastCell As Range

Set wksQuelle = Sheets(„Jun 09 bis Feb 10“)
Set wksZiel = Sheets(„Hilfstabelle“)

'lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, 1).End(xlUp).Row
'lngLetzteSpalte = IIf(IsEmpty(wksQuelle.Cells(1, wksQuelle.Columns.Count)), wksQuelle.Cells(1, wksQuelle.Columns.Count).End(xlToLeft).Column, wksQuelle.Columns.Count)
Set LastCell = wksQuelle.Range(„A1“).SpecialCells(xlLastCell)
lngLetzteZeile = LastCell.Row
lngLetzteSpalte = LastCell.Column

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

wksZiel.UsedRange.ClearContents
wksZiel.UsedRange.ClearFormats

For lngSpalte = 2 To lngLetzteSpalte
For lngZeile = 6 To lngLetzteZeile
If Trim(wksQuelle.Cells(lngZeile, lngSpalte)) „“ Then
Select Case LCase(Trim(wksQuelle.Cells(lngZeile, lngSpalte)))
Case „u“, „k“, „üa“:
Case Else
If wksQuelle.Cells(lngZeile, lngSpalte).Font.Italic Then
wksZiel.Cells(lngZeile, lngSpalte) = „geplant“
wksZiel.Cells(lngZeile, lngSpalte).Font.Italic = True
Else
wksZiel.Cells(lngZeile, lngSpalte).Value = „fest“
wksZiel.Cells(lngZeile, lngSpalte).Font.Italic = False
End If
End Select
End If
Next
Next

wksZiel.Visible = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

bei mir gab es ein problem beim ermitteln der letzten zeile/spalte (mag daran liegen, daß ich nicht weiß, wie die zeilen 1-5 und die spalte a aussehen ), weswegen ich die entsprechenden zeilen umgestellt habe.

oke vielen dank jetzt funktioniert es…

kommt mir alles etwas umständlich vor… das umwandeln mache ich ja nur um dann zählen zu können nach fest und geplant…

ist das nicht einfach zu realisieren?

das geht sicherlich auch einfacher - was genau wollen sie denn zählen? nur „wieviele insgesamt sind fest, wieviele sind geplant“? oder die anzahl pro zeile bzw. pro spalte? wenn sie den wunsch genauer beschreiben, bekommen sie von mir eine genauere antwort :smile:

oke

also ich habe eine Datentabelle(Jun 09 bis Feb 10) da stehen
Namen von A4:A50
Datum B3:IV3

Und ihre Tätigkeit B2:IV50 wie z.B. k(Krank), u (Urlaub), üa(Überstundenausgleich) Parkhaus(bedeutet dann fest eingeplant), Parkhaus[kursiv](bedeutet geplant).

in der Auswertungstabelle ist dann der Button zum starten.

  • wieder eine Namensliste A4:A50
  • Eingabe des Zeitraums
  • und oben eine zeile mit krank, urlaub, überstundenausgleich, fest , eingeplant,
  • nun soll eine tabelle entstehen bei der für jeden mitarbeiter die daten für den variablen zeitraum aktualisiert werden.

das wärs

gruß

in der