Работа с несколькими экземплярами приложения Excell - VB

Узнай цену своей работы

Формулировка задачи:

Есть приложение на VB, взаимодействующее с Excell. Оно (приложение) открывает в уже запущеном экземпляре файлы и читает из них информацию. Проблемы возникают, когда запущено несколько экземпляров Excel - приложение хватается за какой-то один (последний активный).
Как сделать возможность выбора к какому экземпляру цепляться?

Решение задачи: «Работа с несколькими экземплярами приложения Excell»

textual
Листинг программы
<font color="blue">Option</font> <font color="blue">Explicit</font>

<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> GetWindowThreadProcessId Lib <font color="teal">"user32"</font> (<font color="blue">ByVal</font> hwnd <font color="blue">As</font> <font color="blue">Long</font>, lpdwProcessId <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> Module32First Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, uProcess <font color="blue">As</font> MODULEENTRY32) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> Module32Next Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, uProcess <font color="blue">As</font> MODULEENTRY32) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Declare</font> <font color="blue">Function</font> EnumWindows Lib <font color="teal">"user32"</font> (<font color="blue">ByVal</font> lpEnumFunc <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> lParam <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Boolean</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> OpenProcess Lib <font color="teal">"Kernel32.dll"</font> (<font color="blue">ByVal</font> dwDesiredAccessas <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> bInheritHandle <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> dwProcId <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> CreateToolhelp32Snapshot Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> dwFlags <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> th32ProcessID <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>

<font color="blue">Private</font> <font color="blue">Type</font> MODULEENTRY32
  dwSize <font color="blue">As</font> <font color="blue">Long</font>
  th32ModuleID <font color="blue">As</font> <font color="blue">Long</font>
  th32ProcessID <font color="blue">As</font> <font color="blue">Long</font>
  GlblcntUsage <font color="blue">As</font> <font color="blue">Long</font>
  ProccntUsage <font color="blue">As</font> <font color="blue">Long</font>
  modBaseAddr <font color="blue">As</font> <font color="blue">Long</font>
  modBaseSize <font color="blue">As</font> <font color="blue">Long</font>
  hModule <font color="blue">As</font> <font color="blue">Long</font>
  szModule <font color="blue">As</font> <font color="blue">String</font> * <font color="darkblue"><b>256</b></font>
  szExePath <font color="blue">As</font> <font color="blue">String</font> * <font color="darkblue"><b>260</b></font>
<font color="blue">End</font> <font color="blue">Type</font>

<font color="blue">Private</font> <font color="blue">Const</font> PROCESS_ALL_ACCESS = &H1F0FFF

<font color="blue">Sub</font> Main()
    EnumWindows <font color="blue">AddressOf</font> EnumWindowsProc, <font color="blue">ByVal</font> <font color="darkblue"><b>0</b></font>&
<font color="blue">End</font> <font color="blue">Sub</font>

<font color="blue">Public</font> <font color="blue">Function</font> EnumWindowsProc(<font color="blue">ByVal</font> hwnd <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> lParam <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Boolean</font>
    <font color="blue">Dim</font> uProcess <font color="blue">As</font> MODULEENTRY32, hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, n  <font color="blue">As</font> <font color="blue">Long</font>
    <font color="blue">Dim</font> lngHwndProcess <font color="blue">As</font> <font color="blue">Long</font>, strProcessName  <font color="blue">As</font> <font color="blue">String</font>

    GetWindowThreadProcessId hwnd, lngHwndProcess 
    
    hSnapshot = CreateToolhelp32Snapshot(<font color="darkblue"><b>8</b></font>, lngHwndProcess)
    uProcess.dwSize = Len(uProcess)
    n = Module32First(hSnapshot, uProcess)

    <font color="blue">Do</font> <font color="blue">While</font> n
        strProcessName = UCase$(Left(uProcess.szModule, InStr(uProcess.szModule, Chr(<font color="darkblue"><b>0</b></font>)) - <font color="darkblue"><b>1</b></font>))
        
        <font color="blue">If</font> strProcessName Like <font color="teal">"*.EXE*"</font> <font color="blue">Then</font>
            
           Debug.<font color="blue">Print</font> strProcessName
        
        <font color="blue">End</font> <font color="blue">If</font>
        n = Module32Next(hSnapshot, uProcess)
    <font color="blue">Loop</font>
    
    EnumWindowsProc = True
<font color="blue">End</font> <font color="blue">Function</font>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы