VBA feststehender Hinweis am Schirm bei Zeilen- u. Spaltensprüngen

Hallo

ich habe unter Office 2010 eine Exceldatei, in der pro Zeile in max 50 Zellen Namen stehen.
Es sind derzeit ca. 40 Zeilen vorhanden, optisch also ein Wald voller Namen. Um hier doppelte Namen zu entdecken, habe ich eine kleine Routine geschrieben, die problemlos funktioniert.
Wenn nun ein doppelter Name entdeckt und farbig gekennzeichnet wird, spring der Inhalt des Bildschirms so, daß die Zelle mit dem Namen in den Sichtbereich des Bildschirms kommt.
Da die Namensfindung kreuzweise durcheinander läuft, ist auch die Anzeige am Bildschirm mächtig am springen.
Um das abzuschalten, habe ich „application.screenupdating=false“ gesetzt. Damit ist Ruhe.

Nun aber könnte ein Benutzer denken, der Rechner arbeite überhaupt nicht. Also möchte ich einen Text zur Anzeige bringen, der aussagt, daß das Programm arbeitet.

Verwende ich dazu eine Userform, stoppt das Makro nach dem Aufruf und läuft erst weiter, wenn ich die Userform per Maus schließe.
Verwende ich ein Textfeld (Label) und schalte dieses  v o r  „…screenupdating=false“ auf „visible =true“, wird es nicht angezeigt!
Warum das so ist, weiß ich nicht, da das visible=true zuerst kommt und dann erst das Sperren des Updating.

Weiß jemand, warum das nicht geht? Der Code ist wie folgt:

Private Sub CommandButton3\_Click()
  Label1.Visible = True
  Label2.Visible = True
  Anz = Anszeilen                                  'Anzahl genutzter Zeilen ermitteln
  Application.ScreenUpdating = False
  For i = 3 To Anz                                 'Schleife über alle Zeilen
     j = 2
     While Not IsEmpty(Cells(i, j))          'Schleife über alle Namen einer Zeile
       Call Gefunden(i, j)                        'Namenssuche in Routine "Gefunden"
       j = j + 1
     Wend
  Next i
  Application.ScreenUpdating = True
  Label1.Visible = False
  Label2.Visible = False
End Sub

Gruß
Pauli

Hallo Pauli,

warum das mit dem Textfeld und ScreenUpdating = False bei dir nicht geht, hab ich auf die Schnelle auch nicht rausgefunden.
Du kannst aber eine Userform mit

UserForm1.Show vbModeless

starten. Dann läuft der Code unabhängig von der UserForm weiter.

Gruß, Andreas

Hallo Andreas,

danke für Deinen Tipp mit dem vbModeless. Das klappt zwar im Prinzip, aber das „Modeless“ wirft den Text aus der Userform raus und zeigt nur den Rahmen.

Ich habe mal, da ich das Nichtfunktionieren des Labels nicht verstand, eine Verzögerung von 1sec hinter die Anweisung „Label1.visible=true“ eingebaut. Das funktioniert, dann ist alles so, wie ich es wünsche.

Gruß
Pauli

Hallo Andreas,

Hi Pauli,

danke für Deinen Tipp mit dem vbModeless. Das klappt zwar im
Prinzip, aber das „Modeless“ wirft den Text aus der Userform
raus und zeigt nur den Rahmen.

Das verstehe ich nicht. Kannst du evtl. mal einen Screenshot hochladen?

Ich habe mal, da ich das Nichtfunktionieren des Labels nicht
verstand, eine Verzögerung von 1sec hinter die Anweisung
„Label1.visible=true“ eingebaut. Das funktioniert, dann ist
alles so, wie ich es wünsche.

Ich weiß, ich bin immer penetrant und möchte „verstehen“. Kannst du mal den genauen Code zeigen?

Gruß
Pauli

Gruß, Andreas

… für solche Anzeigen nutze ich dann immer die Statuszeile.

LG

Hallo Andreas,

unter http://www.file-upload.net/download-9117427/Darstell…
habe ich 2 Screenshots, eines ohne vbmodeless und eines mit vbmodeless.

der Code dieser Routine ist:

Private Sub CommandButton3_Click()
Label1.Visible = True
Label2.Visible = True
Start = Timer ’ Anfangszeit setzen.
Do While Timer

…danke für den Hinweis. Dort ist mir die Info aber etwas zu unauffällig.

Gruß
Pauli

http://www.file-upload.net/download-9117427/Darstell…
habe ich 2 Screenshots, eines ohne vbmodeless und eines mit
vbmodeless.

Hallo Pauli,

magst du die Mappe hochladen?

Gruß
Reinhard

Hallo Reinhard,

ich habe die Namen in der Datei durch Phantasienamen ersetzt. Im Code der Taste „Doppeleinträge suchen“ steht alles drin. Ich habe einige Optionen als Text markiert, so z.B. die Verzögerung.
Interessant ist (bei meinem Rechner), daß ohne Verzögerung aber mit „vbModeless“ sich UserForm1 (Info 1) so verhält, wie in meinem Beitrag beschrieben, also ohne Inhalt bzw. Formatierung, mit Verzögerung aber alles ok ist.

Ohne „vbModeless“ stoppt wie zu erwarten dasProgramm nach Öffnen der UserForm.

Hier der Link zu der Datei:
http://www.file-upload.net/download-9120659/Probedat…

Gruß
Pauli

Hallo pauli,

ich habe deinen Code mal laufen lassen. Du hast Recht, bei mir passierte das gleiche: Die Form Info1 ist leer. Allerdings braucht es bei mir keine Warteschleife, um das zu ändern. Es genügt ein Do Events nach dem Show. Probier’s mal aus.

Gruß, Andreas

1 Like

Hallo Andreas,

ja, bei mir ist das genauso, DoEvents reicht.
Herzlichen Dank für die Hinweise.

Gruß
Pauli

ja, bei mir ist das genauso, DoEvents reicht.

Hallo Volker,

du hast doch DoEvents im Code, so dachte ich du hättest das schon probiert gehabt. Na, gut, um deine eigentliche Anfrage hab ich mich (noch) gar nicht gekümmert. Mir fiel anderes in deinem Code auf.

Du hattest mir zuviel Variablen, noch dazu paar globale. Ich habe die drastisch reduziert, daß ich mit keiner einzigen Variablen auskomme hätte ich auch nicht vorher gedacht :smile:

Hier die Mappe:
http://www.file-upload.net/download-9129378/kwPauly…
Nachstehend stehen die Codes in TabelleR, Modul3, UF „Suchname“.

Es ist nur ein anderer Ansatz, soll nicht bedeuten daß du so programmieren sollst. Es geht ja um deine Codes. Deshalb, lade nochmal die Beispielmappe hoch so wie du sie jetzt fertig gestellt hast. In der Mappe die ich sah sind noch paar Kleinigkeiten bei dir zu verbessern, auch und grad für deine nächsten Codierereien.

Gruß
Reinhard

In TabelleR:

Option Explicit

Private Sub cmdbNamenSuchen\_Click()
Call cmdbMarkAus\_Click
Suchname.Show
End Sub

Private Sub cmdbDoppelSuchen\_Click()
Call cmdbMarkAus\_Click
Call DoppelSuchen
End Sub

Private Sub cmdbMarkAus\_Click()
Cells.FormatConditions.Delete
End Sub

in Modul3:

Option Explicit

Private Sub cmdbNamenSuchen\_Click()
Call cmdbMarkAus\_Click
Suchname.Show
End Sub

Private Sub cmdbDoppelSuchen\_Click()
Call cmdbMarkAus\_Click
Call DoppelSuchen
End Sub

Private Sub cmdbMarkAus\_Click()
Cells.FormatConditions.Delete
End Sub

In UF Suchname:

Option Explicit

Private Sub cmdbOk\_Click()
Unload Me
If tbName.Text "" Then Call NamenSuchen(tbName.Text)
End Sub
1 Like

Codekorrektur in Modul3
sorry :frowning:

In Modul3:

Option Explicit

Sub NamenSuchen(ByVal Namen As String)
Application.ScreenUpdating = False
With Worksheets("TabelleR")
 .Range("B3").Select
 .Range("$B$3:blush:AX$60").FormatConditions.Add Type:=xlExpression, \_
 Formula1:="=LINKS(B3;LÄNGE(""" & Namen & """))=""" & Namen & """"
 With .Range("$B$3:blush:AX$60").FormatConditions(1).Interior
 .PatternColorIndex = xlAutomatic
 .Color = 65535
 .TintAndShade = 0
 End With
End With
Application.ScreenUpdating = True
End Sub

Sub DoppelSuchen()
Application.ScreenUpdating = False
With Worksheets("TabelleR")
 .Range("B3").Select
 .Range("$B$3:blush:AX$60").FormatConditions.Add Type:=xlExpression, \_
 Formula1:="=ZÄHLENWENN($B$3:blush:AX$60;B3)\>1"
 With .Range("$B$3:blush:AX$60").FormatConditions(1).Interior
 .PatternColorIndex = xlAutomatic
 .Color = 65535
 .TintAndShade = 0
 End With
End With
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

1 Like

Hallo Reinhard,

erst mal ganz herzlichen Dank für Deine Mühe. Ich werde eine Weile brauchen, um Deine Codierung zu verstehen. Die ist aber um Längen eleganter, als mein Code und vor allem wesentlich schneller.
Ich werde mich damit also erst mal auseinandersetzen.

beste Grüße
Pauli

Hallo Pauli,

erst mal ganz herzlichen Dank für Deine Mühe. Ich werde eine
Weile brauchen, um Deine Codierung zu verstehen. Die ist aber
um Längen eleganter, als mein Code und vor allem wesentlich
schneller.

fast jeder andere Code muß schneller sein als deiner (Trag diese Äußerung bitte wie eine Glühbirne, also mit Fassung *lächel*).
In einem, gar großen, Zellenbereich alle Zellen einzeln abklappern, noch dazu mit Select markieren ist so ziemlich das langsamste in Vba was es gibt.

Teste mal deinen Code für 60000 Zeilen und 60 Spalten oder gar 1 Mio Zeilen in XL 2007, Das ist in keinster Weise ein Vorwurf, du kannst es halt noch nicht besser.
Woher das „Select“ stammt ist auch klar, es kommt vom Makrorekorder in XL. Der zeichnet so auf, ich glaube auch er kann gar nicht anderst aber spielt hier keinerlei Rolle.

Ich hatte ja geschrieben, poste bitte deine „fertige“ Mappe. Also ohne meinen Code sondern mit deinem Code, die zufriedenstellend läuft.
Auf diese Datenbasis wollte ich näher eingehen um dir für die Zukunft zu helfen, das ist wichtiger *find* als dieses eine Problem. Lade bitte hoch.

Ich werde mich damit also erst mal auseinandersetzen.

Ja, nur so lernt man.

Schönes WE
Reinhard

Hallo Reinhard

Hallo Pauli,

erst mal ganz herzlichen Dank für Deine Mühe. Ich werde eine
Weile brauchen, um Deine Codierung zu verstehen. Die ist aber
um Längen eleganter, als mein Code und vor allem wesentlich
schneller.

fast jeder andere Code muß schneller sein als deiner (Trag
diese Äußerung bitte wie eine Glühbirne, also mit Fassung
*lächel*).
In einem, gar großen, Zellenbereich alle Zellen einzeln
abklappern, noch dazu mit Select markieren ist so ziemlich das
langsamste in Vba was es gibt.

Teste mal deinen Code für 60000 Zeilen und 60 Spalten oder gar
1 Mio Zeilen in XL 2007, Das ist in keinster Weise ein
Vorwurf, du kannst es halt noch nicht besser.
Woher das „Select“ stammt ist auch klar, es kommt vom
Makrorekorder in XL. Der zeichnet so auf, ich glaube auch er
kann gar nicht anderst aber spielt hier keinerlei Rolle.

Du hast völlig Recht. Wenn allerdings der Rechner schnell genug ist und das Makro das tut, was es soll, ist das für mich ok. In diesem Fall allerdings zeigt es sich, daß es lohnt, andere Formulierungen zu wählen.

Ich hatte ja geschrieben, poste bitte deine „fertige“ Mappe.
Also ohne meinen Code sondern mit deinem Code, die
zufriedenstellend läuft.
Auf diese Datenbasis wollte ich näher eingehen um dir für die
Zukunft zu helfen, das ist wichtiger *find* als dieses eine
Problem. Lade bitte hoch.

Das habe ich jetzt nicht verstanden. „Meinen“ Code hatte ich ja hochgeladen, das funktionierte im Prinzip ja auch. Eine „fertige“ Mappe nach meiner Programmierung werde ich so nicht machen, denn Dein Code ist derart genial, daß ich mich da erstmal reinarbeiten muß. Daß ich Nachholbedarf habe, sehe ich an „Sub NamenSuchen“ aus Deiner Feder. Ich muß erst mal verstehen, wie hier aus einem Zellbereich mit einem einzelnen Code eine bestimmter Zellinhalt gefunden wird.
Laß mir bitte etwas Zeit.

Ich werde mich damit also erst mal auseinandersetzen.

Ja, nur so lernt man.

Schönes WE
Reinhard