如何在另一个Excel实例中连接到OPEN工作簿 [英] How to connect to OPEN workbook in another instance of Excel

查看:91
本文介绍了如何在另一个Excel实例中连接到OPEN工作簿的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Currently I can run 2 Excel VBA processes simultaneously within 2 separate Excel instances on 1 PC.

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

My goal is to import the data from Excel instance 2 into Excel instance 1 every minute.

不幸的是,无法从Excel实例1中的工作簿连接到Excel实例2中的打开的工作簿.

Unfortunately it is not possible to connect from my workbook in Excel instance 1 to the open workbook in Excel instance 2.

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

Since I can connect to a saved workbook, a solution could be to save the workbook in instance 2 every minute and retrieve the new data from the saved workbook.

尽管这是一个相当繁重的方法.是否有更好的解决方案连接到另一个Excel实例中的另一个打开的工作簿?

Although this is a rather heavy method. Is there a better solution to connect to another open workbook in another instance of Excel?

(在同一实例中打开工作簿不是解决方案,因为在那种情况下,我不能再同时运行2个VBA进程.)

(To open the workbook in the same instance is no solution since in that case I can no longer run 2 VBA processes simultaneously.)

推荐答案

简短版本

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


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


Long version using API calls (from Excel Help file for GetObject())

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

这篇关于如何在另一个Excel实例中连接到OPEN工作簿的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆