Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1044to1048
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Formatierung der Kopfzeilen per VBA langsam

Formatierung der Kopfzeilen per VBA langsam
02.02.2009 12:18:00
Michel
Hallo allerseits,
kann man die Bearbeitung der Kopfzeilen in Tabellenblättern per VBA beschleunigen.
Ich habe hier eine Schleife, die läuft beim öffnen der Datei über alle Tabellenblätter (4 St)
Das ganz dauert aber immehin 20 Sec für, wie gesagt 4 Blätter
Hier mal der Code:
For Each ws In Worksheets
Application.StatusBar = "Kopfdaten für Tabelle" & XXXXXXX & " anpassen"
With ws.PageSetup
.PrintTitleRows = "$1:$1"
.LeftHeader = "Ersteller: " & ersteller & Chr(10) & "Stand: &D"
.CenterHeader = _
"&""Arial,Fett"" &12Produktionsplan " & j & Chr(10) & "XXXXXXX-Betrieb " & Betrieb
End With
Betrieb = Betrieb + 1
Next
Was mache ich falsch? oder gibt es eine Möglichkeit das schneller zu machen. Ich änder in einem anderen Teil meine Programms auch noch verschiedene Einstelllungern der Seiten (Seitenumbrüche etc). das dauert auch ewig bis er da durch gelaufen ist. Es scheinen alle ZUgriffe auf den Seiten direkt, Ränder, Kopfzeilen sind sehr langsam.
Gruß
Michael

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formatierung der Kopfzeilen per VBA langsam
02.02.2009 12:26:00
Tino
Hallo,
Dein Code braucht bei mir unter xl2007 für 12 Tabellenblätter 2 Sekunden.
Gruß Tino
AW: Formatierung der Kopfzeilen per VBA langsam
02.02.2009 12:43:00
Josef
Hallo Mic hael,
das häng mit dem Druckertreiber zusammen. Befindet sich der Drucker vielleicht im Netzwerk?
Gruß Sepp

AW: Formatierung der Kopfzeilen per VBA langsam
02.02.2009 14:18:00
Michel
Ja, der Drucketreiber und die Tabelle befinden sich auf einem Netzwerklaufwerk.
Wieso? hat das was mit der Ausführung der Formatierung zu tun?
Da die Tabellen von verschiedenen Personen benutzt wird, muß sie auch da liegen bleiben.
Ich verstehe den zusammenhang mit dem Druckertreiber nicht. Gibt es evtl. eine Möglichkeit es zu verschnellern?
Danke und Gruß
Michel
Anzeige
AW: Formatierung der Kopfzeilen per VBA langsam
02.02.2009 14:55:00
Michel
Hallo nochmal,
das mit dem Druckertreiber hat mich doch stutzig gemacht und ich habe meinen Standarddrucker mal auf
"Microsoft Office Doument Image Writer geändert" und siehe da.
Meine Riesentabellen auf denen die Formatierung sonst 25 bis 30 Sekunden gedauert hat, laufen jetzt in 6 Sekunden durch.
Kann ich den Druckertreiber per VBA ändern? und für den Lauf den Lauf des VBA für einen Lokalen Drucker umbiegen und hinterher wieder zurück?
Gruß
Michael
AW: Formatierung der Kopfzeilen per VBA langsam
02.02.2009 15:06:00
Heinz
Hi,
umbiegen kannst du schon, nur könnte das Ergebnis verfälscht oder sogar unbrauchbar sein, wenn es nicht dieselben Drucker sind.
mfg Heinz
Anzeige
AW: Formatierung der Kopfzeilen per VBA langsam
03.02.2009 07:58:26
Michel
Da ich lokal keine Drucker installiert habe. Es gibt nur "Microsoft Ducument Image Writer" und "Microsoft XPS Doument Writer". Es muss ja auch ein Drucker sein der auf ALLEN Rechnern verfügbar ist.
Ich habe mal die Berechnung der Tabelle gestoppt, mit Netzwerkdrucker dauert es sogar 2 Min 15 Sec mit Lokaldrucker nur 10 Sec das ist schon ein gewaltiger Unterschied.
Wie kann ich denn den Drucker per VBA umstellen?
Gruß
Michael
vielleicht geht es so.
03.02.2009 14:45:00
Tino
Hallo,
versuche es mal hiermit,
ich kann aber Dir nicht sagen was passiert,
wenn der neue Drucker irgendwelche Optionen nicht unterstützt.
Musst Du mal testen.
Option Explicit

Private Declare Function lstrcpy Lib "kernel32.dll" Alias _
  "lstrcpyA" (ByVal lpString1 As String, _
  ByVal lpString2 As Long) As Long

Private Declare Function lstrlen Lib "kernel32.dll" Alias _
  "lstrlenA" (ByVal lpString As Long) As Long

Private Declare Function EnumPrinters Lib "winspool.drv" _
  Alias "EnumPrintersA" (ByVal flags As Long, _
  ByVal name As String, ByVal Level As Long, _
  pPrinterEnum As Long, ByVal cdBuf As Long, _
  pcbNeeded As Long, pcReturned As Long) As Long

Private Const PRINTER_ENUM_LOCAL = &H2
Private Const PRINTER_ENUM_NETWORK = &H40
Private Const PRINTER_ENUM_CONNECTIONS = &H4
Private Const PRINTER_ENUM_DEFAULT = &H1
Private Const PRINTER_ENUM_REMOTE = &H10
Private Const PRINTER_ENUM_SHARED = &H20


Private Declare Function RegEnumValue Lib "advapi32.dll" Alias _
  "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, _
  ByVal lpValueName As String, lpcbValueName As Long, ByVal _
  lpReserved As Long, lpType As Long, lpData As Byte, _
  lpcbData As Long) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
  Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal _
  lpValueName As String, ByVal lpReserved As Long, _
  lpType As Long, lpData As Any, lpcbData As Long) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" (ByVal hKey As Long, _
  ByVal lpSubKey As String, ByVal ulOptions As Long, _
  ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
  (ByVal hKey As Long) As Long

Private Declare Function GetVersionEx Lib "kernel32" _
  Alias "GetVersionExA" (lpVersionInformation As _
  OSVERSIONINFO) As Integer

Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type

Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_QUERY_VALUE = &H1
Private Const READ_CONTROL = &H20000
Private Const KEY_READ = (READ_CONTROL Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY)
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_CURRENT_CONFIG = &H80000005
Private Const HKEY_USERS = &H80000003
Private Const HKEY_PERFORMANCE_DATA = &H80000004
Private Const HKEY_DYN_DATA = &H80000006
Private Const Schlüsselname = "Software\Microsoft\Windows NT\CurrentVersion\Devices\"

Private Function FindDrucker(ByVal sDruckerName$) As String

Dim dummy, hwndSchlüssel&
Dim Länge&, lngIndex&
Dim strFeld As String, lngLänge As Long
Dim arrPuffer() As Byte, strPuffer As String
Dim lngArrLänge As Long, lngPortlänge As Long
Dim Drucker As String

  dummy = RegOpenKeyEx(HKEY_CURRENT_USER, _
    Schlüsselname, 0&, KEY_READ, hwndSchlüssel)
  If dummy <> 0 Then MsgBox "Falscher Schlüssel": Exit Function
  strFeld = String(1024, 0)
  lngLänge = 1023
  Redim arrPuffer(0 To 1000)
  
  Do While RegEnumValue(hwndSchlüssel, lngIndex, _
    strFeld, lngLänge, 0&, ByVal 0&, ByVal 0&, ByVal 0&) = 0
    
    Drucker = Left$(strFeld, lngLänge) & " auf "
    lngArrLänge = 1024
    
    RegEnumValue hwndSchlüssel, lngIndex, strFeld, _
      lngLänge, 0&, 0&, arrPuffer(0), lngArrLänge
    
    strPuffer = (StrConv(arrPuffer, vbUnicode))
    
    lngPortlänge = InStr(1, strPuffer, ":") - InStr(1, strPuffer, ",")
    
    strPuffer = Mid$(strPuffer, InStr(1, strPuffer, ":") - 4, lngPortlänge)
    
    Drucker = Drucker & strPuffer
    
    If Drucker Like sDruckerName Then FindDrucker = Drucker: Exit Do
    lngIndex = lngIndex + 1
    strFeld = String(1024, 0)
    
    lngLänge = 1023
  Loop

  dummy = RegCloseKey(hwndSchlüssel)
End Function


Sub TestDruckerUmstellen()
Dim sAktuellerDrucker As String

'aktuellen Drucker in einem String merken 
sAktuellerDrucker = Application.ActivePrinter

'Drucker Suchen, Platzhalter verwenden 
Application.ActivePrinter = FindDrucker("Microsoft XPS Document Writer*")

    'hier Dein Code für die Kopfzeile 
    '... 
    '... 

'Drucker wieder zurückstellen 
Application.ActivePrinter = sAktuellerDrucker

End Sub


Gruß Tino

Anzeige
etwas geändert
03.02.2009 17:57:00
Tino
Hallo,
habe den Code noch etwas ausgemistet und noch eine Abfrage eingebaut, sollte der Drucker nicht gefunden werden, wird ohne Umstellung weitergemacht.
Über eine Rückmeldung ob es funktioniert, würde ich mich freuen.
Option Explicit

Private Declare Function RegEnumValue Lib "advapi32.dll" Alias _
  "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, _
  ByVal lpValueName As String, lpcbValueName As Long, ByVal _
  lpReserved As Long, lpType As Long, lpData As Byte, _
  lpcbData As Long) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" (ByVal hKey As Long, _
  ByVal lpSubKey As String, ByVal ulOptions As Long, _
  ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
  (ByVal hKey As Long) As Long

Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_QUERY_VALUE = &H1
Private Const READ_CONTROL = &H20000
Private Const KEY_READ = (READ_CONTROL Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY)
Private Const HKEY_CURRENT_USER = &H80000001
Private Const Schlüsselname = "Software\Microsoft\Windows NT\CurrentVersion\Devices\"



Private Function FindDrucker(ByVal sDruckerName$) As String

Dim dummy, hwndSchlüssel&
Dim Länge&, lngIndex&
Dim strFeld As String, lngLänge As Long
Dim arrPuffer() As Byte, strPuffer As String
Dim lngArrLänge As Long, lngPortlänge As Long
Dim Drucker As String

  dummy = RegOpenKeyEx(HKEY_CURRENT_USER, _
    Schlüsselname, 0&, KEY_READ, hwndSchlüssel)
  If dummy <> 0 Then MsgBox "Falscher Schlüssel": Exit Function
  strFeld = String(1024, 0)
  lngLänge = 1023
  Redim arrPuffer(0 To 1000)
  
  Do While RegEnumValue(hwndSchlüssel, lngIndex, _
    strFeld, lngLänge, 0&, ByVal 0&, ByVal 0&, ByVal 0&) = 0
    
    Drucker = Left$(strFeld, lngLänge) & " auf "
    lngArrLänge = 1024
    
    RegEnumValue hwndSchlüssel, lngIndex, strFeld, _
      lngLänge, 0&, 0&, arrPuffer(0), lngArrLänge
    
    strPuffer = (StrConv(arrPuffer, vbUnicode))
    
    lngPortlänge = InStr(1, strPuffer, ":") - InStr(1, strPuffer, ",")
    
    strPuffer = Mid$(strPuffer, InStr(1, strPuffer, ":") - 4, lngPortlänge)
    
    Drucker = Drucker & strPuffer
    
    If Drucker Like sDruckerName Then FindDrucker = Drucker: Exit Do
    lngIndex = lngIndex + 1
    strFeld = String(1024, 0)
    
    lngLänge = 1023
  Loop

  dummy = RegCloseKey(hwndSchlüssel)
End Function


Sub TestDruckerUmstellen()
Dim sAktuellerDrucker As String
Dim sDrucker As String
'aktuellen Drucker in einem String merken 
sAktuellerDrucker = Application.ActivePrinter
'Drucker Suchen, Platzhalter verwenden 
sDrucker = FindDrucker("Microsoft XPS Document Writer*")

If sDrucker <> "" Then
    Application.ActivePrinter = sDrucker
End If
    
    
    'hier Dein Code für die Kopfzeile 
    '... 
    '... 


'Drucker wieder zurückstellen, sollte er umgestellt sein 
If sDrucker <> "" Then
 Application.ActivePrinter = sAktuellerDrucker
End If

End Sub


Gruß Tino

Anzeige
AW: etwas geändert
04.02.2009 07:32:00
Michel
Hallo Tino,
danke für den Code.
ich habe mir erstmal eine Kurze Version gebastelt. Da ich festegestellt habe, das der Aufruf
Application.ActivePrinter anscheinend NUR den Drucker im Ecxel ändert, der Standarddrucker vom Windows bleibt der gleiche.
Jetzt habe ich den ersten Code bei Workbook_open eingebaut und den zweiten bei Workbook_BeforeClose.
Mal sehen ob es richtig funktioniert. Was macht den Dein Code so alles? Diese vielen Declare Funktionen, so etwas habe ich noch nie benutzt. Wo muss Dein Code platziert werden?
Gruß
Michael

Sub aktDrucker_Ändern()
Dim aktiverDrucker As String
Sheets("Prod MZ 1").Cells(1.1) = ActivePrinter
Application.ActivePrinter = "Microsoft Office Document Image Writer auf Ne02:"
End Sub



Sub aktdrucker_Zurückändern()
Dim aktiverDrucker As String
Application.ActivePrinter = Sheets("Prod MZ 1").Cells(1.1)
End Sub


Anzeige
AW: etwas geändert
04.02.2009 13:05:32
Tino
Hallo,
da dieser Port bei jeder Anmeldung neu zugeordnet wird,
kann es passieren dass es auf einmal zum Error kommt,
daher suche ich nach dem Drucker inklusive des zugewiesenen Port.
Du enterst in Deinem Code nicht den Standartdrucker von Windows,
sondern nur wie ich, den in Excel in dieser Mappe verwendeten Drucker.
Gruß Tino
AW: etwas geändert
05.02.2009 10:02:40
Michel
Hallo Tino,
du hast Recht behalten. Der andere Benuter bekommt eine Fehlermeldung :-(
Dann werde ich es doch mal mit Deinem Code probieren.
Gruß
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige