Office: vba shellexecute - nur .xls geht nicht...

Helfe beim Thema vba shellexecute - nur .xls geht nicht... in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Moinsens, allerseits! Hat hier schon mal jemand mit ShellExecute unter Excel-VBA versucht, eine Excel-Datei zu öffnen? Ich habe für einen... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von miriki, 1. September 2010.

  1. miriki Erfahrener User

    vba shellexecute - nur .xls geht nicht...


    Moinsens, allerseits!

    Hat hier schon mal jemand mit ShellExecute unter Excel-VBA versucht, eine Excel-Datei zu öffnen?

    Ich habe für einen Kollegen meine Access-VBA-Routine "LaunchDocument" versucht, für Excel-VBA zu adaptieren. Er möchte über einen Button Dateien öffnen, wobei passend zur Dateiendung dann eben automatisch die passende Anwendung gestartet werden soll.

    Unter Access hat diese Routine ganz wunderbar funktioniert, auch beim Öffnen von Excel-Dateien. Aber unter Excel selbst hängt sich das Ding auf, wenn man eine Excel-Mappe öffnen will. Alle anderen bislang ausprobierten Dateien klappten anstandslos.

    Ich habe jetzt "quick and dirty" eine Umgehung eingebaut, bei der worksbooks.open benutzt wird, wenn der Dateiname auf .xls endet. Aber ich müßte eigentlich schon ganz gerne das ShellExecute zum Laufen kriegen, u.a. um nicht alle weiteren Endungen (.xlsx, ...) alle Nase lang nachpflegen zu müssen.

    Jemand eine Idee dazu?

    Gruß, Michael
     
  2. miriki Erfahrener User
    Die wollte ich eigentlich auch gleich mit angehängt haben, glatt vergessen...
    Code:
    Option Explicit
    
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    
    Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" ( _
       ByVal lpFile As String, _
       ByVal lpDirectory As String, _
       ByVal lpResult As String _
       ) As Long
    
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hWnd As Long, _
        ByVal Operation As String, _
        ByVal Filename As String, _
        Optional ByVal Parameters As String, _
        Optional ByVal Directory As String, _
        Optional ByVal WindowsStyle As Long = vbMaximizedFocus _
        ) As Long
    
    Private Function IsAssociated(ByVal sFilename As String) As Boolean
    
        Dim sBuffer As String * 256
    
        FindExecutable sFilename, "", sBuffer
    
        If Trim(sBuffer) = "" Then
            IsAssociated = False
          Else
            IsAssociated = True
        End If
    
    End Function
    
    Public Function LaunchDocument( _
        ByRef Filename As String, _
        Optional ByVal ParentForm As Object, _
        Optional ByVal ShowOpenWithDialog As Boolean = False, _
        Optional ByVal WindowStyle As VBA.VbAppWinStyle = vbMaximizedFocus _
        ) As Boolean
    
        Dim bAssociated As Boolean
        Dim lSuccess As Long
    
        bAssociated = IsAssociated(Filename)
        If (Not bAssociated) Then
            'MsgBox "not associated"
            Shell "rundll32 shell32.dll,openas_rundll " & Filename
            LaunchDocument = True
          Else
            'MsgBox "associated with a valid application"
            If LCase(Right$(Filename, 4)) = ".xls" Then
                Workbooks.Open Filename
                ActiveWorkbook.RunAutoMacros xlAutoOpen
                lSuccess = 33
              Else
                lSuccess = ShellExecute(GetDesktopWindow(), "open", Filename, vbNullString, vbNullString, vbNormalFocus)
                Select Case lSuccess
                    Case Is > 32
                        LaunchDocument = True
                    Case 31
                        If ShowOpenWithDialog Then
                            Shell "rundll32 shell32.dll,openas_rundll " & Filename
                            LaunchDocument = True
                        End If
                    Case Else
                        LaunchDocument = False
                End Select
            End If
        End If
    
    End Function
    Das ist zwar nicht mehr ganz die Routine, die ich in Access-VBA verwende, aber prinzipiell schon noch das Gleiche. Die "IsAssociated"-Routine ist erst in Excel zu Debug-Zwecken dazugekommen (und war vorher eigentlich schon durch "Case 31" abgedeckt).

    Gruß, Michael
     
  3. Exl121150 Erfahrener User
    Hallo Michael,

    das Problem dürfte in einem falschen Handle für die ShellExecute-Funktion liegen, das noch dazu Excel-Versions-abhängig sein dürfte:

    1) Füge zuerst folgende API-Deklaration am Anfang ein:

    Code:
    Private Declare Function FindWindow& Lib "user32.dll" Alias "FindWindowA" _
        (ByVal lpClassName As String, _
        ByVal lpWindowName As String)
    Vor dem Aufruf der ShellExecute-Funktion füge folgenden Code ein, der in "lHwnd" ein Handle ermittelt:
    Code:
    Dim lHwnd As Long
    'Find the handle to this excel window
    If Val(Application.Version) >= 10 Then
        lHwnd = Application.hwnd
    Else
        lHwnd = FindWindow("XLMAIN", vbNullString)
    End If 
    das dann anstelle der GetDesktopWindow()-Funktion das Handle der Applikation liefert:
    Code:
    lSuccess = ShellExecute(lHwnd, "open", Filename, vbNullString, vbNullString, vbNormalFocus) 
    Siehe dazu folgenden Link: http://www.vbforums.com/archive/index.php/t-371416.html
    (gegen Ende des Threads wird von JustinLabenne eine ausführliche Lösung angeboten)
     
    Exl121150, 1. September 2010
    #3
  4. miriki Erfahrener User

    vba shellexecute - nur .xls geht nicht...

    Sehr schön! Mit dem anderen Handle (Application statt Desktop) funktioniert es tatsächlich, soweit ich das bislang ausprobieren konnte.

    Ich werd Montag die Routine mal an den Kollegen weitergeben und er soll dann das Bierchen in Deine Richtung diffundieren lassen.

    Vielen Dank für die Hilfe, aber auch für den Link, den ich gestern bei etlichem googeln nicht gefunden habe.

    Gruß, Michael
     
Thema:

vba shellexecute - nur .xls geht nicht...

Die Seite wird geladen...
  1. vba shellexecute - nur .xls geht nicht... - Similar Threads - vba shellexecute xls

  2. VBA in einer Zeile zu lang

    in Microsoft Excel Hilfe
    VBA in einer Zeile zu lang: Moin, mein VBA Code ist für eine Zeile zu lang. Kann mir einer helfen wie ich den auf 2 Zeilen aufteilen Kann? arrSchuhDaten = Array(Range("A6"), Range("F6"), Range("J6"), Range("A7"),...
  3. Listbox wird nicht breiter, Schriftgrösse ändert sich

    in Microsoft Excel Hilfe
    Listbox wird nicht breiter, Schriftgrösse ändert sich: Hallo, ich habe ein Formular dessen Breite ich mit der Maus ändern kann. Im Formular habe ich einen Rahmen und darin eine Listbox deren Breite an die Formularbreite angepasst wird....
  4. Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch

    in Microsoft Excel Hilfe
    Kontrollkästchen aktivieren ohne VBA - wenn KK1 angekreuzt dann KK2 auch: Hallo zusammen, erstmal danke für all die Tipps und Kniffe, die ich ohne eigenen Thread gefunden und gelernt habe. Leider finde ich mein Thema nirgendwo... Aktuell habe ich zwei Spalten mit...
  5. Per Hyperlink ausgeblendetes Blatt einblenden

    in Microsoft Excel Hilfe
    Per Hyperlink ausgeblendetes Blatt einblenden: Hola ins Forum, ich bräuchte mal wieder eure Hilfe. Ich habe ein Tabellenblatt das mir als Register dient und wo Hyperlinks eingefügt sind um auf das dazugehörige Blatt zu springen. Diese Blätter...
  6. Bilder über VBA Größe und DPI ändern für Webshop

    in Microsoft Excel Hilfe
    Bilder über VBA Größe und DPI ändern für Webshop: Hallo Excel Spezialisten, Ich habe mir eine recht aufwendige Tabelle gebastelt, aus der ich Daten für meinen Webshop generiere und in einer .csv bereitstelle. Es werden neue Preislisten...
  7. VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen

    in Microsoft Word Hilfe
    VBA: Platzhalter ersetzen und evtl. leere Zeile einfügen: Hallo zusammen, ich habe eine Word-Vorlage mit Platzhaltern, in die ich mit VBA Daten aus einer Excel-Datei einfüge (in eine Excel-Zeile schreibe ich alle Daten für ein neues Word-Dokument). So...
  8. Erstellung eines Dynamischen Kalenders (ggf. VBA)

    in Microsoft Word Hilfe
    Erstellung eines Dynamischen Kalenders (ggf. VBA): Guten Morgen an Alle, ich hoffe, es geht euch soweit gut :) Ich wende mich heute an euch, weil ich gerade vollkommen verzweifle und irgendwie so ganz und garnicht weiterkomme und irgendwie...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden