2016-06-15 3 views
2

Zunächst bin ich ein Anfänger. Jeder Rat ist willkommen! Ich habe einfach versucht, bei der Arbeit zu programmieren, um später beim Verwalten von 100-er Dateien Zeit zu sparen.Mit GetObject bearbeiten andere Arbeitsmappen funktioniert 1 Mal aus x

ich ein Excel-Makro bin Gebäude und, ebenso wie viele andere Benutzer, Ich versuche, die folgendes zu tun:

  • Haben Sie das Makro „residieren“ in einer Arbeitsmappe „A“.
  • Auslöser der Makro-Tastenkombination aus einer Arbeitsmappe „B“
  • Haben Sie das Makro tun, um seine Magie in der Arbeitsmappe „B“ (welches ein Blatt aus einer Arbeitsmappe „C“ Kopieren)

Dies beinhaltet , zu einem bestimmten Zeitpunkt den Benutzer zur Arbeitsmappe "C" auffordern, eine Variable definieren und Arbeitsmappe C darin einfügen.

Der folgende Code ist ein Teil des Makros und funktioniert nur einmal aus x und "stürzt" scheinbar ohne Warnung oder Fehlercode ab oder lässt mich sogar wissen, dass es abgestürzt ist.

'All the following code is in workbook "A" 

Dim fd As FileDialog 
Dim ffs As FileDialogFilters 
Dim DestWkb As Workbook 
Dim SourceWkb As Workbook 
Dim SourceWkbPath As String 

'Set active workbook as destination workbook (this is workbook "B") 
Set DestWkb = ActiveWorkbook 

'Prompt user for source workbook (this will be workbook "C") 
Set fd = Application.FileDialog(msoFileDialogFilePicker) 
With fd 
    Set ffs = .Filters 
    With ffs 
     .Clear 
     .Add "Excel", "*.xlsx" 
    End With 
    .AllowMultiSelect = False 
    If .Show = False Then Exit Sub 
    SourceWkbPath = fd.SelectedItems(1) 
End With 

'Here is where it starts to go wrong.. 
'This message box will show up with correct data in it : 

MsgBox SourceWkbPath 

'This line seems to work, as I can see in VB the workbook specified by the user 
Set SourceWkb = GetObject(SourceWkbPath) 

'From here... it's like there was an Exit Sub. I will rarely see the following msgbox : 

MsgBox "Success" 

Hat schon jemand solche Probleme gehabt? Vielen Dank!

+0

-Code funktioniert gut für mich. Können Sie es abstürzen, während Sie durch den Code gehen? oder nur wenn Sie geradeaus laufen. Gibt es eine Fehlerbehandlung? – gtwebb

+4

Ich würde 'Workbooks.Open (SourceWkbPath)' stattdessen verwenden. –

+0

Guter Vorschlag von Doug. Arbeite direkt mit dem Buch – brettdj

Antwort

0

GetObject wird verwendet Verweis auf eine externe Anwendung setzen, die bereits geöffnet ist. Auf dieselbe Weise wird CreateObject verwendet. Legen Sie eine neue externe Anwendung erstellen fest.

  • Eine Überprüfung hinzugefügt, um festzustellen, ob ein WorkBook mit demselben Namen geöffnet ist.
  • Set entfernen DestWkb = Active
  • Verwenden statt
  • Thisworkbook
  • Added lustige Nachricht, so dass Sie es funktionierte wissen.

Dim fd As FileDialog 
 
    Dim ffs As FileDialogFilters 
 
    Dim SourceWkb As Workbook 
 
    Dim SourceWkbPath As String 
 
    Dim SourceWkbShortName As String 
 
    'Prompt user for source workbook (this will be workbook "C") 
 
    Set fd = Application.FileDialog(msoFileDialogFilePicker) 
 
    With fd 
 
     Set ffs = .Filters 
 
     With ffs 
 
      .Clear 
 
      .Add "Excel", "*.xlsx" 
 
     End With 
 
     .AllowMultiSelect = False 
 
     .Show 
 
     SourceWkbPath = fd.SelectedItems(1) 
 
     SourceWkbShortName = Mid(SourceWkbPath, InStrRev(SourceWkbPath, "\") + 1) 
 
    End With 
 

 
    On Error Resume Next 
 
    
 
    Set SourceWkb = Workbooks(SourceWkbShortName) 
 
    If Err.Number <> 0 Then 
 
     Set SourceWkb = Workbooks.Open(SourceWkbPath) 
 
    End If 
 
    On Error GoTo 0 
 
    
 
    MsgBox """Hello World!""", vbInformation, SourceWkb.Name & " Says:"

MSDN sagt: Thisworkbook immer die Arbeitsmappe zurückgibt, in dem der Code ausgeführt wird.

Die Frage lautet: „Wenn Work A ein Makro in der Arbeitsmappe B läuft, was zu
tut Thisworkbook verweisen

Workbook A

Sub RunExternalCode() 
    WorkBookAName= ThisWorkBook.Name 

    WorkBookBName = Application.Run "" 

End Sub 

Work B

Function GetThisWorkBooksName() 
    GetThisWorkBooksName = ThisworkBook.Name 
End Function 
?

Resu lt:

WorkBookAName = "WorkBookA"

WorkBookBName = "WorkBookB"

+0

Vielen Dank für diese detaillierte Antwort. Kann ich falsch sagen, dass die Verwendung von "ThisWorkbook" nicht ordnungsgemäß funktioniert, da Code von Arbeitsmappe A in Arbeitsmappe B ausgeführt wird? Da ich die Arbeitsmappe b in DestWkb speichern möchte, speichert Thisworkbook nicht stattdessen die Arbeitsmappe, in der sich das Makro befindet (in diesem Fall die Arbeitsmappe A?). – JGL

+0

ThisWorkBook wird immer die Arbeitsmappe sein, die den Code initiiert hat. Es ist unveränderlich. Aber ich werde überprüfen .. lol –

Verwandte Themen