Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

mal wieder Icon - diesmal Taskleiste

Forumthread: mal wieder Icon - diesmal Taskleiste

mal wieder Icon - diesmal Taskleiste
15.01.2009 20:56:00
Mike
Hallo Forum,
ich lese hier schon seit längerem, heute meine erste Frage :)
Ich habe ein Workbook soweit verpackt, dass es kaum mehr als Excel zu erkennen ist. Ich hätte jetzt gern eine Möglichkeit, das Icon in der Taskleiste zu ändern. In der Titelleiste hab ich das bereits gemacht (dank https://www.herber.de/mailing/158701h.htm).
Schön wäre jetzt aber noch (als letzter Schliff), dass in der Leiste auch mein Icon auftaucht. Mit API hab ich nicht so, wenn ich Code habe komm ich aber zurecht. Wäre toll, wenn jemand da eine Anregung hat.
Danke schon mal
Mike
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: mal wieder Icon - diesmal Taskleiste
15.01.2009 21:13:59
Mike
sorry, hab mich vertan: das Icon in der Titelleiste ändere ich wie auf http://www.wbrnet.info/db/0536.html beschrieben
AW: mal wieder Icon - diesmal Taskleiste
15.01.2009 23:40:00
Roland
Hallo Mike,
versuchs mal so:
Option Explicit
Private Declare

Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare 

Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Integer, _
ByVal lParam As Long) As Long
Private Declare 

Function ExtractIcon Lib "shell32.dll" _
Alias "ExtractIconA" ( _
ByVal hInst As Long, _
ByVal lpszExeFileName As String, _
ByVal nIconIndex As Long) As Long
Private Const WM_SETICON = &H80
Private Const ICON_BIG = 1
Private Const ICON_SMALL = 0


Sub IconChange()
Dim lngXLHwnd As Long, lngIcon As Long, strIconPath As String
strIconPath = "C:\Windows\JM\RaidLogo.ico" 'vollständiger Pfad zum Icon
lngXLHwnd = FindWindow("XLMAIN", Application.Caption)
lngIcon = ExtractIcon(0, strIconPath, 0)
SendMessage lngXLHwnd, WM_SETICON, ICON_SMALL, lngIcon
SendMessage lngXLHwnd, WM_SETICON, ICON_BIG, lngIcon
End Sub


Das Private Declare muss mit


Function natürlich in eine Zeile, ich blicke nicht durch, wie ich das hier darstellen kann.  _
Kommst Du damit klar?
Gruß von
Roland Hochhäuser

Anzeige
AW: mal wieder Icon - diesmal Taskleiste
16.01.2009 07:39:20
Mike
Hallo Roland,
klappt hervorragend, danke!!!
Kann ich das Icon auch im Workbook ablegen und wie ginge das dann? Die Datei wird von verschiedenen Clients gestartet. Auch wenn ich den Pfad mit IP angebe wäre das irgendwie eleganter.
Mike
AW: mal wieder Icon - diesmal Taskleiste
16.01.2009 10:12:00
Roland
Hallo Mike,
1. "Kann ich das Icon auch im Workbook ablegen": das geht bestimmt irgendwie über Objekt einbetten oder so, ich weiss es aber nicht. Der o.a. Code funktioniert aber nur, wenn Du den Speicherort des Icons als String ausdrücken kannst; außerdem unterstützt zumindest Office 2003 (ich nehme an auch Office 2000) nicht das ico-Format beim Einfügen einer Grafik.
2. "Die Datei wird von verschiedenen Clients gestartet": Dann leg das Icon doch genau 1 x auf das Netzlaufwerk und passe den Pfad an (funktioniert 100%ig), dann können auch mehrere Nutzer gleichzeitig darauf zugreifen.
3. "Pfad mit IP" ? Willst Du das Icon ins Intra-/Internet oder eine Oracle-Datenbank einparken?
Grüße von
Roland Hochhäuser
Anzeige
AW: mal wieder Icon - diesmal Taskleiste
16.01.2009 10:33:16
Mike
Hi Roland,
wenn ich den Pfad als z.B. "H:\Verzeichnis\ico.ico" angebe, dann gehe ich ja 1. davon aus, dass jeder User das Verzeichnis auch eingebunden hat und zwar 2. mit demselben Laufwerkbuchstaben. Ich gebe den Pfad also besser an als "\\172.24.0.10\Verzeichnis\ico.ico". Ich nutze dabei ein Verzeichnis, das die User nicht kennen und also da auch nichts kaputt machen können.
Danke für deine Hilfe
Mike
Anzeige
Wenn das so ist . . .
16.01.2009 10:47:00
Roland
musst Du die UNC-Laufwerksangabe erst "übersetzen". Ich nutze dazu folgende Routinen:

Private Function LogicalDrives() As Collection
Dim s  As String * 128
Dim i  As Long
GetLogicalDriveStringsA Len(s), s
i = InStr(s, vbNullChar & vbNullChar)    ' Länge
Set LogicalDrives = New Collection
For i = 1 To i Step 4
LogicalDrives.Add Mid$(s, i, 2)
Next i
End Function



Private Function DrivePath(ByVal Path As String, _
Optional IgnoreErrors As Boolean = True) As String
Dim Drive As Variant
Dim UNC As String
If Right$(Path, 1)  "\" Then Path = Path & "\"
For Each Drive In LogicalDrives()
UNC = UNCPath(Drive, True)
If InStr(1, Path, UNC, vbTextCompare) = 1 Then Exit For
Next Drive
If IsEmpty(Drive) Then
If IgnoreErrors Then
DrivePath = Path
Else
Err.Raise 5
End If
Else
DrivePath = Drive & Mid$(Path, Len(UNC))
End If
End Function



Private Function UNCPath(ByVal Path As String, _
Optional IgnoreErrors As Boolean = False) As String
Dim UNC As String * 512
If Len(Path) = 1 Then Path = Path & ":"
If Right$(Path, 1)  "\" Then Path = Path & "\"
If WNetGetConnectionA(Left$(Path, 2), UNC, Len(UNC)) Then
' API-Routine gibt Fehler zurück:
If IgnoreErrors Then
UNCPath = Path
Else
Err.Raise 5
End If
Else
UNCPath = Left$(UNC, InStr(UNC, vbNullChar) - 1) _
& Mid$(Path, 3)
End If
End Function



Private Sub Test()
Dim Bild as String
Bild = DrivePath(\\172.24.0.10\Verzeichnis\) & ico.ico
End Sub


Kommen wir der Sache jetzt näher?
Gruß von
Roland Hochhäuser

Anzeige
welchen Vorteil
16.01.2009 11:14:51
Mike
warum gehst du den Weg bzw. welchen Vorteil bringt das?
ist das Laufwerk überhaupt da?
16.01.2009 11:17:00
Mike
und gehst du nicht immer noch davon aus, dass der User das Verzeichnis verbunden hat?
AW: ist das Laufwerk überhaupt da?
16.01.2009 12:16:00
Roland
Hallo Mike,
ich hatte deine Beschreibung
"dann gehe ich ja 1. davon aus, dass jeder User das Verzeichnis auch eingebunden hat und zwar 2. mit demselben Laufwerkbuchstaben. Ich gebe den Pfad also besser an als "\\172.24.0.10\Verzeichnis\ico.ico"
in der Tat so verstanden, dass das Netzlaufwerk grundsätzlich verbunden ist, jedoch sich bei jedem User lokal anders darstellt. Nur für diesen Fall macht mein Vorschlag Sinn.
Gruß von
Roland Hochhäuser
Anzeige
AW: ist das Laufwerk überhaupt da?
16.01.2009 22:26:00
Nepumuk
Hi,
du kannst das Icon als Bild in einem Userform mit der Datei speichern. Der Zugriff erfolgt dann so:
Sub IconChange()
    Dim lngXLHwnd As Long, lngIcon As Long
    lngXLHwnd = FindWindow("XLMAIN", Application.Caption)
    lngIcon = UserForm1.Picture.Handle
    SendMessage lngXLHwnd, WM_SETICON, ICON_SMALL, lngIcon
    SendMessage lngXLHwnd, WM_SETICON, ICON_BIG, lngIcon
End Sub

Gruß
Nepumuk
Anzeige
AW: ist das Laufwerk überhaupt da?
16.01.2009 23:26:24
Roland
Hallo Nepumuk,
kennst Du vielleicht eine Möglichkeit, ein Bild im .ico-Format in einer Tabelle abzulegen und darauf auch wieder zuzugreifen? Über Einfügen / Grafik / Aus Datei wird dieses Format einfach nicht konvertiert; es gibt nur eine nichtssagende Fehlermeldung. Über Einfügen / Objekt / Reiter: Aus Datei erstellen und dann durchsuchen funktioniert es zwar und wird auch in der Tabelle korrekt angezeigt. Ich finde aber einfach den Dreh nicht, wie ich auf das eingebettete Objekt (liegt dann als Shape vor) zugreifen kann, Handle dürfte es wohl keins geben (?!)
Hast Du eine Idee für einen Lösungsweg?
Grüße von
Roland Hochhäuser
Anzeige
AW: ist das Laufwerk überhaupt da?
17.01.2009 00:22:00
Nepumuk
Hallo Roland,
das geht nur in einem Image-Control. Du kannst zwar ein Icon über die Zwischenablage in eine Tabelle einfügen, aber damit wird es zu einer Bitmap konvertiert. Damit ist es vom Format nicht mehr geeignet es als Icon in der Titelleiste zu benutzen.
Gruß
Nepumuk
Danke für die Hinweise, Nepumuk o.w.T.
17.01.2009 00:28:29
Roland
Userform
19.01.2009 17:30:13
Mike
Hallo zusammen,
klingt ja nach nem guten Ansatz, aber wie bekomme ich ein Bild in eine Userform?
Mike
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Icon in der Taskleiste von Excel ändern


Schritt-für-Schritt-Anleitung

Um das Icon in der Taskleiste von Excel zu ändern, kannst Du den folgenden VBA-Code verwenden. Dieser Code setzt voraus, dass Du es mit Excel 2003 oder neuer zu tun hast.

  1. Öffne Deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei.xlsx)" > "Einfügen" > "Modul".
  3. Kopiere den folgenden Code in das Modul:
Option Explicit

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Integer, _
ByVal lParam As Long) As Long

Private Declare Function ExtractIcon Lib "shell32.dll" _
Alias "ExtractIconA" ( _
ByVal hInst As Long, _
ByVal lpszExeFileName As String, _
ByVal nIconIndex As Long) As Long

Private Const WM_SETICON = &H80
Private Const ICON_BIG = 1
Private Const ICON_SMALL = 0

Sub IconChange()
    Dim lngXLHwnd As Long, lngIcon As Long, strIconPath As String
    strIconPath = "C:\Windows\JM\RaidLogo.ico" 'vollständiger Pfad zum Icon
    lngXLHwnd = FindWindow("XLMAIN", Application.Caption)
    lngIcon = ExtractIcon(0, strIconPath, 0)
    SendMessage lngXLHwnd, WM_SETICON, ICON_SMALL, lngIcon
    SendMessage lngXLHwnd, WM_SETICON, ICON_BIG, lngIcon
End Sub
  1. Ändere den Pfad in strIconPath zu dem Speicherort Deiner Icon-Datei.
  2. Führe das Makro IconChange aus, um das Icon in der Taskleiste zu ändern.

Häufige Fehler und Lösungen

  • Fehlender Zugriff auf die Icon-Datei: Stelle sicher, dass der Pfad zur Icon-Datei korrekt ist und die Datei im .ico-Format vorliegt.
  • Das Icon wird nicht aktualisiert: Schließe Excel und öffne es erneut, um sicherzustellen, dass die Änderungen wirksam werden.
  • Die Datei wird von verschiedenen Clients gestartet: Verwende UNC-Pfade (z. B. \\172.24.0.10\Verzeichnis\ico.ico), um sicherzustellen, dass alle Benutzer Zugriff haben, unabhängig von den Laufwerkbuchstaben.

Alternative Methoden

Eine Alternative zum direkten Setzen des Icons über VBA ist das Einfügen eines Bildes in ein UserForm. Das Bild kann dann als Icon verwendet werden, wenn das UserForm geladen wird. Hier ein Beispiel:

Sub IconChangeUserForm()
    Dim lngXLHwnd As Long, lngIcon As Long
    lngXLHwnd = FindWindow("XLMAIN", Application.Caption)
    lngIcon = UserForm1.Picture.Handle
    SendMessage lngXLHwnd, WM_SETICON, ICON_SMALL, lngIcon
    SendMessage lngXLHwnd, WM_SETICON, ICON_BIG, lngIcon
End Sub

Praktische Beispiele

  • Beispiel 1: Wenn Du das Excel-Icon von einem zentralen Speicherort ändern möchtest, speichere das Icon im Netzwerk und verwende den UNC-Pfad. So können alle Benutzer auf das gleiche Icon zugreifen.
  • Beispiel 2: Erstelle ein UserForm, das ein Bild (z. B. Dein Logo) enthält und benutze den oben genannten Code, um es in die Taskleiste zu setzen.

Tipps für Profis

  • Achte darauf, dass Icons im .ico-Format vorliegen, da andere Formate (wie .bmp oder .jpg) nicht als Icons verwendet werden können.
  • Teste den Code in verschiedenen Excel-Versionen, um sicherzustellen, dass er überall funktioniert.
  • Verwende für die Icons eine klare und einfache Gestaltung, damit sie in der Taskleiste gut sichtbar sind.

FAQ: Häufige Fragen

1. Kann ich das Excel-Datei Icon in der Taskleiste ändern?
Ja, das kannst Du mit dem oben beschriebenen VBA-Code tun.

2. Warum wird mein Icon nicht angezeigt?
Stelle sicher, dass der Pfad zur Icon-Datei korrekt ist und dass die Datei im .ico-Format vorliegt.

3. Ist es möglich, das Icon im Workbook selbst abzulegen?
Ja, Du kannst ein Bild in einem UserForm speichern und es dann verwenden, um die Taskleiste zu ändern.

4. Funktioniert das in allen Excel-Versionen?
Der Code sollte in Excel 2003 und neuer funktionieren. Ältere Versionen könnten Einschränkungen haben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige