Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何连接到另一个Excel实例中打开的工作簿_Excel_Vba_Ipc - Fatal编程技术网

如何连接到另一个Excel实例中打开的工作簿

如何连接到另一个Excel实例中打开的工作簿,excel,vba,ipc,Excel,Vba,Ipc,目前,我可以在1台PC上的2个单独Excel实例中同时运行2个Excel VBA进程 我的目标是每分钟将数据从Excel实例2导入Excel实例1 很遗憾,无法从Excel实例1中的“我的工作簿”连接到Excel实例2中打开的工作簿 因为我可以连接到保存的工作簿,所以解决方案可以是每分钟将工作簿保存在实例2中,并从保存的工作簿中检索新数据 虽然这是一个相当沉重的方法。是否有更好的解决方案连接到另一个Excel实例中打开的工作簿 (在同一个实例中打开工作簿不是解决方案,因为在这种情况下,我无法再同

目前,我可以在1台PC上的2个单独Excel实例中同时运行2个Excel VBA进程

我的目标是每分钟将数据从Excel实例2导入Excel实例1

很遗憾,无法从Excel实例1中的“我的工作簿”连接到Excel实例2中打开的工作簿

因为我可以连接到保存的工作簿,所以解决方案可以是每分钟将工作簿保存在实例2中,并从保存的工作簿中检索新数据

虽然这是一个相当沉重的方法。是否有更好的解决方案连接到另一个Excel实例中打开的工作簿


(在同一个实例中打开工作簿不是解决方案,因为在这种情况下,我无法再同时运行两个VBA进程。)

不确定同时使用两个Excel VBA进程是什么意思,但如果在Excel的第二个实例中打开工作簿,则可以使用
GetObject
访问:

Sub ConnectToWB()

Const FILENAME = "Full File Name"
Dim wb As Workbook
Dim wks As Worksheet

    Set wb = GetObject(FILENAME)
    Set wks = wb.Worksheets(1)
    Debug.Print wks.Cells(1, 1)

End Sub
短版



使用API调用的长版本(来自
GetObject()
的Excel帮助文件)



好的,在进程(实例)之间交换数据的经典VB方法是使用临时文件、套接字或(最硬的imho)管道`谢谢,你说的临时文件是什么意思?我可以从另一个Excel实例访问此文件吗?非常感谢Paul和Storax!
Option Explicit

Public Sub GetDataFromExternalXLInstance()
    Dim instanceFile As Object, ur As Variant, lr As Long

    'if not already open, GetObject() will open it in a new instance

    Set instanceFile = GetObject("C:\Tmp\TestData2.xlsx")  '(code running from TestData1)
    ur = instanceFile.Worksheets(2).UsedRange              'get used range from 2nd Worksheet

    With ActiveSheet
        lr = .Cells(.Rows.Count, "A").End(xlUp).Row + 1    'last row on active sheet
        .Range(.Cells(lr, "A"), .Cells(UBound(ur) + lr - 1, UBound(ur, 2))) = ur
    End With

    'instanceFile.Close
    'Set instanceFile = Nothing
End Sub
Option Explicit

#If VBA7 Then   'or: #If Win64 Then  'Win64=true, Win32=true, Win16= false
    Private Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName as String, ByVal lpWindowName As Long) As Long
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam As Long) As Long
#End If

Public Sub GetDataFromExternalXLInstanceAPI()
    Dim xlApp As Object
    Dim xlNotRunning As Boolean 'Flag for final reference release

    On Error Resume Next        'Check if Excel is already running; defer error trapping
        Set xlApp = GetObject(, "Excel.Application")    'If it's not running an error occurs
        xlNotRunning = (Err.Number <> 0)
        Err.Clear               'Clear Err object in case of error
    On Error GoTo 0             'Reset error trapping

    DetectExcel                 'If Excel is running enter it into the Running Object table
    Set xlApp = GetObject("C:\Tmp\TestData2.xlsx")      'Set object reference to the file

    'Show Excel through its Application property
    xlApp.Application.Visible = True
    'Show the actual window of the file using the Windows collection of the xlApp object ref
    xlApp.Parent.Windows(1).Visible = True

    '... Process file

    'If Excel was not running when this started, close it using the App's Quit method
    If xlNotRunning = True Then xlApp.Application.Quit
    Set xlApp = Nothing    'Release reference to the application and spreadsheet
End Sub
Public Sub DetectExcel()    'This procedure detects a running Excel app and registers it
    Const WM_USER = 1024
    Dim hwnd As Long

    hwnd = FindWindow("XLMAIN", 0)  'If Excel is running this API call returns its handle
    If hwnd = 0 Then Exit Sub       '0 means Excel not running

    'Else Excel is running so use the SendMessage API function
    'to enter it in the Running Object Table

    SendMessage hwnd, WM_USER + 18, 0, 0
End Sub