< návrat zpět

MS Excel


Téma: Řízení zobrazení formsů na různých monitorech. rss

Zaslal/a 6.1.2021 18:15

Dobrý den.

Rád bych poprosil o radu, jak řídit zobrazení na různých monitorech.

Pracuji na 3 monitorech. Jedná se jen o jeden sešit-list "X". Přes klávesové zkratky spouštím makro. Z makra/listu se kontrolují doplňky a pokud existují, pak se zavolá vstupní funkce, která vybere a spustí/otevře formulář. Formulářů je více a jsou v doplňcích. Problém který se mi nedaří vyřešit je, jak ovlivnit na kterém monitoru se zobrazí formulář.

Příklad: List "X" je na monitoru 3. Formulář A se zobrazí na monitoru 1. Přes WIN+SHIFT+šipka přehodím formulář na monitor 3. Pracuji s formulářem - a zavřu. Pokud jej znovu otevřu, pak je na monitoru 3 ... na listu X a jsem spokojen.

Druhý formulář je stále při zobrazení na monitoru 1 - můžu jej přehodit na monitor 3, ale po otevření je stále na monitoru 1.

Zkontroloval jsem parametry přes F4 v IDE VBA a jsou stejné parametry pro oba formuláře. Spouštění je také identické. Přesto jeden se zobrazuje na monitoru 3 a druhý nejde přemluvit, aby se zobrazoval na monitoru 3 ... stále je na monitoru 1.

Předpokládám, že by mohla pomoci nějaká fce z API DLL z W10 a předání hWnd + nějaký parametr.

Nevíte, jak vyřešit tento problém, případně na co se podívat nebo nakopnout co vyguglit. Je to obtěžující.

R.

Zaslat odpověď >

#049390
avatar
dobry den,

asi nikto tu nema 2 a viac monitorov a ani ja nemam takze som nemohol tieto kody co som nasiel u seba odskusat takze skuste tieto dva kody u seba.

1. je na hybanie s oknom mozno ked nastavite spravnu poziciu tak vam to dobre zobrazi: (mozno pri zmene rozlisenia to nebude dobre fungovat ... nemam odskusane)
https://www.thespreadsheetguru.com/the-code-vault/launch-vba-userforms-in-correct-window-with-dual-monitors

2. je uz presne zadefinovanie screenu:
https://stackoverflow.com/questions/31592823/move-form-if-second-monitor-screen-exists

vyskusajte mozno pomoze.

pekny novy rokcitovat
#049399
avatar
Ahoj Palooo

Děkuji za odkazy. Dostal jsem se přes hWnd a volání SetParent a FindWindow z user32.dll na různé výsledky. Všechny ale měly jednu vadu. Neznaly odkaz na monitory. Scereen z VB.NET jsem nenašel v běžných ani skrytých funkcích Excelu VBA. V které W10 API DLL je, a pod jakým jménem, jsem nezjistil. Předpokládal jsem, že když použijí rozměr a napočítám jsi kde začíná a končí který monitor, tak se snad dostanu na střed a pak jen vystředím běžnou funkcí. Když jsem Screen nenašel, bylo mi to k ničemu.

Nakonec jsem to po 3 létech vyřešil a pomohl mi Excel. Blbec chcípnul a vzal 4 soubory a jejich část práce. Jeden z nich jsem měl temp na ploše 3 monitoru a spustil jsem jej. V makru byla chyba a při otvírání zařval VBA. IDE VBA byl na 3 monitoru. No a jako obvykle jsem jej nehodil na 1 monitor. Spustil jsem ostatní a začal dělat co jsem potřeboval a najednou dialogy jsou na správném místě - na 3 monitoru. Tak jsem uvažoval a uvědomil jsem jsi, že formsy mají parent IDE VBA a to bylo na 1 monitoru. Tak se zobrazovaly na 1 monitoru. Nyní mám IDE na 3 monitoru a otvírá se vše správně. Jen když budu programovat, tak jsi to hodím na 2 nebo 1 monitor. Sice to stálo několik hodin, ale kodovaní je efektivní ... 0 řádků ;-)

Také Ti přejí vše nejlepší do nového roku.
Romancitovat
icon #049407
eLCHa
Zdravím
Kdysi jsem programoval doplněk pro excel pro 2 monitory (ještě v době, kdy jsem měl excel, který neuměl SDI)
ke stažení zde https://elcha-en.blogspot.com/2014/12/excel-and-dual-monitor.html
Tam mám vyřešenu i identifikaci monitoru. Nemám teď chuť to hledat, ale je to jedna z následujících API funkcí:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As modCommon.typeRectangle) As Long
Private Declare PtrSafe Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As LongPtr, ByVal dwData As Long) As Boolean
Private Declare PtrSafe Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As modCommon.typeMonitorInfo) As Boolean
Private Declare PtrSafe Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal dwFlags As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long
Private Declare PtrSafe Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare PtrSafe Function GetClientRect Lib "user32" (ByVal hwnd As Long, ByRef lpRect As modCommon.typeDimensions) As Long
Private Declare PtrSafe Sub ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As modCommon.typeCoordinates)
Private Declare PtrSafe Sub OffsetRect Lib "user32" (lpRect As typeDimensions, ByVal X As Long, ByVal Y As Long)
Public Declare PtrSafe Sub ClipCursor Lib "user32" (lpRect As Any)
citovat
#049408
avatar
Zdravím.

Děkuji Vám za deklarace. Odkaz na Váš doplněk můj problém sice neřeší, ale docela rád bych se podíval jak to máte napsané. Je možné poprosit o heslo k doplňkům ?citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje