2012-11-07 54 views
1

我在我的VBA代碼中有一個簡單的輸入框。我想確定其起始位置。我知道參數[LEFT]和[TOP]應該這樣做,但它們不起作用。Application.Inputbox [LEFT]和[TOP]在Excel Vba中不起作用。爲什麼?

以下是我有:

x = Application.InputBox(MyPrompt, MyTitle, , 50, 50) 

這裏是函數的語法

InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type) 

(我離開第三個參數[DEFAULT]空白)。

無論我用什麼數字作爲左和頂,輸入框始終始於相同的地方。 那有什麼問題?

回答

2

InputBox("prompt","title","default", 10000,10000) 

其確實使用上/左參數,並

Application.InputBox("prompt","title","default", 10000,10000) 

這不之間的差異。

注意頂部/左是積分,所以你提供的值將需要更大的比你可用於...

http://msdn.microsoft.com/en-us/library/office/aa195768(v=office.11).aspx

「InputBox方法從不同的InputBox功能,因爲它允許選擇性驗證用戶的輸入,並且可以使用Microsoft Excel對象,錯誤值和公式。請注意,Application.InputBox調用InputBox方法; InputBox沒有對象限定符調用InputBox函數。

+0

非常感謝你添添 –

+0

,現在的問題是..如果我只用輸入框,而不是application.inputbox的,我無法設置我需要的輸入的類型(我需要它是類型8,單元格參考爲範圍) –

+0

如果您確實需要能夠設置pos ition然後你可以用包含refedit控件的自定義表單來模擬inputbox。 –

0

高,
這個線程想出了很多的搜索試圖解決類似問題,當我做了幾個星期前。
我現在有一個解決方案,所以認爲我會通過它的其他任何人同樣的問題這裏登陸的利益
問題已經給
的VBA輸入框功能幾個百分點的總結和澄清(和VBA MsgBox Box Function)都是Modal,換句話說,當電子表格啓動時你無法做任何事情。他們似乎運作良好。
當您選擇額外的最後一個類型:=選項它具有,類型:= 8應用程序輸入框方法應該允許您執行此電子表格選擇。 (事實上​​,電子表格選項可用於所有類型:=選項,但OP對於OP特別感興趣,但是類型:= 8(範圍)對於我來說,VBA輸入框功能只允許您輸入框輸入欄中的字符串信息)
應用程序輸入框方法允許您執行此操作類型:= 8(範圍)通過電子表格選擇,但有幾件事情被打破:
_定位彈出窗口(似乎自Excel 2007以來已損壞)
_微軟幫助功能在我看來不適用於Excel 2003 2007 2010。我不知道,如果它曾經工作過的應用程序的輸入框方法
我現在使用的
(這是專門溶液不與用戶窗體一個解決方案,我也考慮單獨爲我的工作比較)。這是一個彈出用戶僞輸入框與範圍選擇替代使用API​​程序
該解決方案克服了這些問題,這是我做到這一點的主要原因,尤其是因爲第一個問題,這是本主題的主要問題。它也有一些額外的東西可能是有用的:
_你可以選擇彈出的大小(寬度,高度)
_你可以調整「z」的東西......我不太清楚這些選項,但簡單地說,它意味着你按照你所看到的窗口的順序,你如何看待它以及在哪個窗口看到它,哪些窗口在「下面」或「上面」看到等,來安排它的顯示方式。
_ 調用函數的調用例程中的ByRef至的簡單變更允許您將範圍對象的值更改爲所選內容的值,但原始範圍對象不會更改,即說它的地址仍然是bef選擇。這可以爲您在電子表格中選擇和移動的方式提供額外的選項。

所有的代碼應該被複制到相同的代碼模塊。 (如果詳細的評論刺激,那麼你可以輕鬆地將它們全部通過幾次點擊 - 參見:mrexcel.com/forum/about- board/795476-comments-code.html#post3893448)

第一部分Rem 1 and Rem 2提供必要的API程序並聲明(Dim的)一些相關的球狀變量。本節將需要在代碼模塊的頂部。
Rem 1是直截了當,並提供一個僞非模態消息框。
Rem 2稍微複雜一些,並且提供了幾個API程序,當它們出現時需要與Windows混淆。

Option Explicit '                         「Window"s is a name for a programming idea which might result in something we 「see」 as what we conceive as Windows. Manipulating of the actual 「Windows」 seems the key to pseudo 「making my own」 InputBox with range selection.  Direct linked libraries (dll) are available to run as and when required, hence the wording of direct link: They are used as an efficient means to organise Microsoft’s software generally allowing different Applications to share smaller programs which are shipped as standard with the Microsoft Windows Operating system. They are however also available to programmers , programming the applications. They are usually contained in Folder with name similar to User 32. "API calls」: just means usually that you are using those things and related 「Windows」 concept-all gets gets bundled up in imprecise intimidating term API, for Application Programming interface 
    Rem 1 Pseudo Non Modal MsgBox, MessageBoxA   API Standard Non Standard Stuff, More Fundamentally complicated UnWRap it and.. "Pseudo Non Modal MsgBox"   --- A valid handle, hWnd, other than the Excel spreadsheet window ( Private Declare Function FindWndNumber Lib "user32" Alias "FindWindowA" (Optional ByVal lpClassName As String, Optional ByVal lpWindowName As String) As Long --- hWndParent = FindWndNumber(lpClassName:="XLMAIN", lpWindowName:=vbNullString) ), or even no (Null) hWnd results in a pseudo Non Modal MsgBox                    http://www.excelfox.com/forum/showthread.php/2227-VBA-Input-Pop-up-Boxes-Application-InputBox-Method-versus-VBA-InputBox-Function?p=10476#post10470  http://www.tek-tips.com/faqs.cfm?fid=4699 
    Private Declare Function APIssinUserDLL_MsgBox Lib "user32" Alias "MessageBoxA" (Optional ByVal hWnd As Long, Optional ByVal Prompt As String, Optional ByVal Title As String, Optional ByVal Buts As Long) As Long ' 
    '_- ==== The above is all I need to do so that writing APIssinUserDLL_MsgBox in any code in this code module will do something very similar to the VBA MsgBox. The main difference is that when it is up, I can still scroll up and down in my Excel Spreadsheet and also select a range. 
    Rem 2_b)(ii) == To set/change The positional arguments  "Sub Classing a "Window""  As is generally the case with 「Window」 Functions, A window belongs to a class. The Dynamic Linked Libraries concept allow the small programs in the with windows shipped typically in the User32 Folder programs to be called up/used at runtime, rather than a fixed set of instructions copied or and/ or used as such at some point. This allows for a modification of the class, known as Sub classing. This means that it is possible to modify/add to the 「Window」 Function and so pseudo create a customised ddl. It does not necessarily mean that a 「Window」 Function or a used User32 Folder program is directly Sub classes , but it just happens to be in our case as we are intending to mess about with the MessageBoxA (or MessageBoxTimeoutA) You can arrange that a used 「Window」 Function is modified as it is used. 
    ' The next four line will tie something on my chain for when you pull it.      Similar in the way that a Worksheet_change code is triggered as something happens, you must arrange that a VBA Function is triggered when a Windows 「event」 occurs. At this point the concept gets a bit vague and I doubt many people really understand anymore how it really works. A good name for the VBA Function might be Function WinSubWinCls_JerkBackOffHooKterd. This VBA Function will itself be a pseudo 「Window」 Function and 「hung」 or hooked on a chain of events. Because of the dynamic/volatile nature of the stuff, things will have a habit of going on forever if they not 「unhooked」 such that a procedure will have to be designed to unhook itself. 
    Private Declare Function SetWindowsHooksExample Lib "user32" Alias "SetWindowsHookExA" (ByVal Hooktype As Long, ByVal lokprocedureAddress As Long, Optional ByVal hmod As Long, Optional ByVal DaFredId As Long) As Long ' The effect of this will be: In some predetermined set of instructions or planned chain of events, a 「hook」 or 「marker」 or 「clap trap」 or 「page marker」 or 「trip trap」 was made. This was given an identifying number which was returned by that 「API Function」 and it was chosen to be placed in the main code in a globial variable hHookTrapCrapNumber. I do not think that this number identifies the 「page in the book」 where the bookmarker is. I think it just is listed somewhere in a list of any active/set up book marks. I guess there might be/could be a few, so you need to distinguish them. 
    Dim hHookTrapCrapNumber As Long ' "BookmarkClassNumber --- This makes pseudo Declare Sub() SetWindowsHooksExample Lib "user32" AliAs "SetWindowsHookExA" (ByVal hHookTrapCrapNumber As Long, ByVal Hooktype As Long, ByVal MyloksPROCedureFukAddress As Long, Optional ByVal RadioButton2Out As Long, Optional ByVal duhFredId As Long) As Long  It was also disgust that possibly the number refers to set instances of a Bookmark class: there may be a few , but they are all effectively connected/activated by the number hHookTrapCrapNumber existing in some register. The bookmarker has a particular type, (5). The type will be responsible for catching the Message box code line to call the MessageBoxA, (like APIssinUserDLL_MsgBox &H0, "Select Range", "working ApplicationPromptToRangeInputBox", vbYesNoCancel). That fires my hook PROCedure Function, WinSubWinCls_JerkBackOffHooKterd. Other things may also fire my hook PROCedure Function. They may or may not be also related to the Popping up of my Box. 
    '    Dim BookMarkClassTeachMeWind As Long: Let BookMarkClassTeachMeWind = 5 ' 5 is Hooktype that I will be using. Using a variable for two reasons: '1_- general point in computing that you might get problems when a number is used to refer to something that might take or give a number at some point. But you might need to do that, so having an intermediate word is a workaround for that so that the number is set to a word which is then related to a word that might be being referred to or returning a number. Function = Word --- Word = 873248 '2_- Just to avoid confusion Later as in this particular case later another option number happens to be 5 
    Private Declare Function GetDaFredId Lib "kernel32" Alias "GetCurrentThreadId"() As Long ' The Thread is what is going on, I expect that means in this case my VBA. My computer might do something else with or without me knowing. Most things going on will have a Thread number. When used in my code, Function GetDaFredId will return an identifying number referring to the Excel instance that that code line is in.  It is actually needed in the setting of the Windows hook code line only (that which is last argument in SetWindowsHookEx( , , , DaFredId As Long) ... set a hook, confined to the current thread (so it doesn't get triggered by other things going on) and give it the address of the function that you want to call in response to the hook being triggered. In this I will use 5 CBT hook which is triggered generally by Window messages (activating, creating, destroying, minimizing, maximizing, moving, or sizing a window) 
    ' This below takes it off the chain. Or wipe the chain clean. Or remove it from something. Or cancel it. Or Kill it. Or whatever. In any case it needs the identifying number of the "hook", then a simple code line as shown in comment below will do this "Killing" Without doing this the thing seems to go on indefinitely (with or without any recursion. (A recursion is another issue which seems to happen as an additional issue - that occurs when the final API code below (over next line) does its job - that seems to fire my Hook PROCedure function WinSubWinCls_JerkBackOffHooKterd 
    Private Declare Function UnHookWindowsHookCodEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHookTrapCrapNumber As Long) As Long '    'Release the Hook   This is used in code in a simple code line like:-  Call UnHookWindowsHookCodEx(hHookTrapCrapNumber) 
    '_- === All of the above in section Rem 2 is required so that I am able to organise that when I use APIssinUserDLL_MsgBox another program (my windows hookProcedure program WinSubWinCls_JerkBackOffHooKterd) is triggered. (It has a habit of being triggered indefinitely so the API program Decared in the last line above will be used to stop that happening). 
    '2(d)=== The Final API program below we need to actually do what we want. (WindowIdentifyinghandle, zorder   , x    ,  y   ,  width   ,  height   ,  zFurtherInfo ) '_- Most is obvious, except the z stuff -  WindowIdentifyinghandle/wParam is one the parameters passed in some secret process to my Function WinSubWinCls_JerkBackOffHooKterd( , wParam , ) and will be the windows identifying number for my Message box that is popping up. (,10 ,50 ,400 ,150 ,) These four numbers are the horizontal and vertical size and positions. (0, , , , ,40) The two numbers 0 and 40 are chosen after a bit of intuitive guessing based on Microsoft references like https://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx The end effect is to have the window seen as dominantly as wanted. They are likely to be based to some extent on experimenting in a particular requirement. 
    Private Declare Function SetWindowPosition Lib "user32" Alias "SetWindowPos" (ByVal hWnd As Long, ByVal zNumber As Long, ByVal CoedX As Long, ByVal CoedY As Long, ByVal xPiXel As Long, ByVal yPiYel As Long, ByVal wFlags As Long) As Long ' This API prog will be called in my hook PROCedure function. So.. Rem 2a)-c) sets "Bookmark"/ series of "Bookmarks"/ Microsoft Windows cyber Robot monitering events (of "type 5", i.e. my Pop up coming up is one such. When such a event occurs my function is triggered by Windows software monitering Robot, he knows where/which my function WinSubWinCls_JerkBackOffHooKterd is from the AddressOf in a "hook setting code line" like (5 ,AddressOf WinSubWinCls_JerkBackOffHooKterd , 0, ThreadID) The monitoring Robot program thing passes somehow (a number from a list of event types to tell me more precisely what event it noticed, wParam-identifying number of the Window doing that event, possibly some other mouse thing info thing am not bothered about) 
    Dim Booloks As Boolean ' I use this in the code line Booloks = SetWindowPosition(WindowIdentifyinghandle, zorder,x, y, width, height ,zFurtherInfo) I don't seem to need this, but as a function, the SetWindowPos is designed to return a value. In this usage I have not experienced problems using it as a Sub routine Call like Call SetWindowPosition(, , , , , ,) but to be on the safe side I have used it as a Function returning its return in a Boolean variable, Booloks 
    Dim GlobinalCntChopsLog As Long ' I use this to keep track of the copy number of my Hook PROCedure function WinSubWinCls_JerkBackOffHooKterd, that is to say check for when that = 2. If that is the case I do the "unhooking" and Exit the Function 

3A)將是你想用你的主代碼/調用了區域選擇拉網用戶僞的InputBox
簡單的演示中,我已經做有助於說明那個東西我提到有關ByRefByVal的變化。如果您在代碼中使用並在下一代碼部分的開始處更改(ByXxx),那麼我認爲您會得到我暗示的內容的點
因此在第3a)主要的事情與此問題相關的是線
呼叫HangAHookToCatchAPIssinUserDLL MsgBoxThenBringThatMsgBoxUp(RSEL)
這行代碼使彈出上來,選定的電子表格範圍在可變RSEL返回一個範圍對象。代碼將一直等到您做出選擇,但這並不妨礙您進行選擇。因此,在這方面,它的作用類似於應用程序輸入框方法(當您使用該應用程序輸入框方法並選擇最後一個選項爲Type:= 8)。

' ======================== 
    Rem 3a) This is just to demo the idea of a Pop Up User InputBox with range selection alternative with API User 32 dll Programs.  ' Normally in this section 3a) there would be other stuff and probably lots of it and if I have anything to do with it then it will be very Pretty.. Pretty well disgusting probably. 
    Sub MainSubWithAllOtherStuffInIt() ' This would be your main coding and would nornally be a lot bigger, it is just here as part of the demo for a Pop Up User InputBox with range selection alternative with API User 32 dll Programs 
    ' Some where in the main code I might want to ask the user to select a range. So to do that I 
    Dim RSel As Range ' This is a variable to hold the Pointer to the users range object..  So this variable in VBA is like the Link to the part of a URL string reducing size site where a few things about the actual Final site is informed about. This area in that site, like a pigeon Hole to which the variable refers, (the "pigeon hole" location address, and all its contents would be defined as the "Pointer". Amongst other things it has a link, a "Pointing part", pointing to actually where all the stuff is 
    'Set RSel = Selection ' This line will be needed if you chose to send ByVal. That is necerssary to ensure that you have a range object - If you do not have a range object when you go to HangAHookToCatchAPIssinUserDLL_MsgBoxThenBringThatMsgBoxUp(ByVal RcelsToYou), then you wont have one when you get back neither, as in HangAHookToCatchAPIssinUserDLL_MsgBoxThenBringThatMsgBoxUp you will be Set ing the copy variable, not the actual RSel variable. You put a copy of the Pointer in the new variable. But it is an object. A different object. A Copy object. https://www.excelforum.com/excel-programming-vba-macros/1138804-help-understanding-class-instancing-cant-set-ws-new-worksheet-intellisense-offers-it-2.html#post4386360 
    Call HangAHookToCatchAPIssinUserDLL_MsgBoxThenBringThatMsgBoxUp(RSel) '      In a normal application of the main Theme of all this, this would be the main code line you use to cause a the "Pop Up User pseudo InputBox with range selection alternative with API User 32 dll Programs" 
    VBA.MsgBox Prompt:="Address check RSel - It is now " & RSel.Address & "" & vbCrLf & "Da .Value of the range object is " & RSel.Value ' Just done to demo that A simple change of the ByRef to ByVal in the signature line of a Called routine allows you to change the value of a range object to that of the selection, but the original range object will not change, that is to say its address remains as before the selection. 
    End Sub 

3B)-3C)做兩兩件事。
_「鉤子」被「吊死」,這確實既
__「抓」事件相似,我的「非模態消息框」的姿態出現,
然後當它是
__激發了一個功能WinSubWinCls JerkBackOffHooKterd
我試圖在'評論(和下面的第一個參考文獻)中更詳細地解釋一切。
實際上在最終效果中發生的事情是,通常作爲我的消息框彈出該函數之前觸發6次它得到我真正想要的「事件」,這是消息框窗口被激活

Private Sub HangAHookToCatchAPIssinUserDLL_MsgBoxThenBringThatMsgBoxUp(ByRef RcelsToYou) ' This will by referral To You, (RSel), the actual Pointer of you the original RSel. This is not too important a point here, but intersting if you consider the next line alternative to this one..... 
    ' Public Sub HangAHookToCatchAPIssinUserDLL_MsgBoxThenBringThatMsgBoxUp(ByVal RcelsToYou)  The RSel Pointer aint Gone anywhere if you do this. Just a copy of the Pointer is here. This will allow you to change the value as the Pointer or a copy of it will tell you where to go and do that... But in neither this line or the last line case have you sent the range object. If you use this line then you will find that the address of the range object will not change, as that refers to the range object of the copy variable in this subroutine. But that will not change the range object of RSel 
    Set RcelsToYou = Selection ' 3c(-i)               Pointer GoneTo -1 WTF 
Noughty:      ' 3c(0i)               Pointer GoneTo 0y WTF 
    ' 3b) Hang A Hook to catch things like APIssinUserDLL_MsgBox, .... HOOK: Hook the pseudo Windows Sub Class Function WinSubWinCls_JerkBackOffHooKerd 
    Dim BookMarkClassTeachMeWind As Long: Let BookMarkClassTeachMeWind = 5 ' I do not need this. 5 is Hooktype that I will be using. Using a variable for two reasons: '1_- general point in computing that you might get problems when a number is used to refer to something that might take or give a number at some point. But you might need to do that, so having an intermediate word is a workaround for that so that the number is set to a word which is then related to a word that might be being referred to or returning a number. Function = Word --- Word = 873248 '2_- Just to avoid confusion later as in this particular case later another option number in Rem 4 happens to be 5. That is checking for a Window opening. So it is similar to the 5 of BookMarkClassTeachMeWind, but it is a narrowed down version of those window happening things. So a bit of aa coincidence really. Using the variable just reminds me of that. 
    Let hHookTrapCrapNumber = SetWindowsHooksExample(BookMarkClassTeachMeWind, AddressOf WinSubWinCls_JerkBackOffHooKerd, 0, GetDaFredId) ' (5-pull before flush, somehow arranges that the function gets called , 
    ' 3c) Bring APIssinUserDLL_MsgBox up 
    Dim Valyou As Variant: Let Valyou = RcelsToYou.Value: If IsArray(Valyou) Then Valyou = Valyou(1, 1) 'For display Value of Top Left of Selection 
    Dim Rpnce As Long '                   Long is very simple to handle, - final memory "size" type is known (123.456 and 000.001 have same "size" computer memory) , and so a Address suggestion can be given for the next line when the variable is filled in. '(Long is a Big whole Number limit (-2,147,483,648 to 2,147,483,647) If you need some sort of validation the value should only be within the range of a Byte/Integer otherwise there's no point using anything but Long.--upon/after 32-bit, Integers (Short) need converted internally anyways, so a Long is actually faster.)  https://www.mrexcel.com/forum/excel-questions/803662-byte-backward-loop-4.html 
    Let Rpnce = APIssinUserDLL_MsgBox(hWnd:=&H0, Prompt:="Yes, or No to ReCheck, Cancel for help ", Title:="Selection Check: Address is " & RcelsToYou.Address & " Value is """ & Valyou & """", Buts:=vbYesNoCancel) ' ' Pseudo Non Modal MsgBox 
    Set RcelsToYou = Selection: Let Valyou = RcelsToYou.Value: If IsArray(Valyou) Then Valyou = Valyou(1, 1) 'The code waited until you made one of the three message box options. But in this time you could change the selection object 
     If Rpnce = 2 Then Application.Help HelpFile:=ThisWorkbook.Path & "\AnyFileName.chm", HelpContextID:=2 '    ----- download this file: https://app.box.com/s/bx2pkvtemsppscz60rd6f430wm89c6fj This is a 「.chm Microsoft Help file」 It has the name _ AnyFileName.chm --- Put in same folder as this Workbook --- Check out possible workarounds --- http://www.excelfox.com/forum/showthread.php/2146-%E0%A4%AC%E0%A5%8D%E0%A4%B2%E0%A5%89%E0%A4%97-%E0%A4%95%E0%A5%8B%E0%A4%B6%E0%A4%BF%E0%A4%B6-%E0%A4%95%E0%A4%B0-%E0%A4%B0%E0%A4%B9%E0%A4%BE-%E0%A4%B9%E0%A5%88-%D8%A8%D9%84%D8%A7%DA%AF%D8%B2-%DA%A9%DB%8C-%DA%A9*Trying-Blogs?p=10467#post10467 --- you shopuld get this HelpGetUpBollox.JPG imgur.com/KdKOYWr 
     If Rpnce = 7 Then GoTo Noughty ' Option to update the displayed Address and Value in Top Left cell of that range 
    End Sub 

雷姆4功能WinSubWinCls JerkBackOffHooKterd
此挑選出我想要的特定事件,是被我的「非模態消息框」被啓用,改變窗口尺寸,使用API事情SetWindowPos
(您將需要通過實驗與左右爲主,中間的四個數字
上兩端的兩個數字,,你可能也想調整。完全理解這兩個數字有點超出我的想象 - 我花了一個星期的時間來弄清楚WTF所有其他的東西都是關於什麼的)。
此功能最後一件事是「殺死」或「放下」或「脫掉」鉤「」或「」鉤「鉤」。如果你不這樣做,該功能似乎無限期地觸發。
類似點上的最後一件事:其他一些代碼做了與我所看到的類似的事情,似乎引起了一個狂野的遞歸:函數中的大小調整由SetWindowPos似乎再次引發了功能代碼。堆棧似乎被限制爲30個。我看不出有任何理由要這樣做,實際上它有時會導致一些奇怪的不一致的幽靈般的圖像出現在我的桌面上,有時會永久!我的功能只是做我認爲應該做一次的事情。它看起來更穩定。在獲得正確的API資料之前,我確實有很多樂趣。但是從那以後,代碼似乎在不同計算機和不同Excel版本的許多代碼情況下都能正常工作。 (在我嘗試過的所有情況下,我的代碼有退出 -ed如我所料之後如果子句檢測到函數是否在第一次遞歸複製運行的開始(我認爲它可能不妨在SetWindowPos之後直接解除掛鉤,以防萬一SetWindowPos不會導致遞歸(***試圖「解除掛鉤」似乎沒有任何壞處))

Rem 4============= Some hidden function/bookmark/bookmarks/cyber Robot thing was brought into life ("I hung or set a hook"). That monitors events like my message box popping up. When it catches one it starts this finction and passes to it three parameters. The first tells me with a number more excactly what even took place, the next is the window identifying number of that window doing that particular event , the last parameter is something maybe to do with the mouse god knows what exactly probably even Sid don't know... but looking at his Avatar I probably wouldn't say that to him as he I don't know if I would want to mess with him... 
    Private Function WinSubWinCls_JerkBackOffHooKerd(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' I "set a hook" which should trigger (things similar to my Meassage box popping up , and gave it the AddressOf this function , 0 , and limited it to this "Thread" on my computer that is to say my Excel ) 
    Let GlobinalCntChopsLog = GlobinalCntChopsLog + 1 ' The idea of this is that I add 1 on entering and subtract 1 when leaving the function. So this would be two if I started an other copy of this code before the first had finished. I am expecting that as the SetWindowPosition seemes to trigger it off again. 
     If GlobinalCntChopsLog = 2 Then Let GlobinalCntChopsLog = GlobinalCntChopsLog - 1: UnHookWindowsHookCodEx hHookTrapCrapNumber: Exit Function ' If I have 2 then that is an indication that recurtion has taken place, that is to say I started another function run caused by SetWindowPosition triggering it off. So i assume then that SetWindowPosition has done what it should so I can "take the hook off" (as if i did not then the function seems to get triggeredt indefinitely even without recusion), and then I exit the function. So I do expect a second copy of the code to run, but due to this it does not do anything other than take the "hook off". I also reduce the count by 1. It is then at 1. But then the first copy of the function ends from just under SetWindowPosition. So then the count is reduced again and is at the initial 0 
     If lMsg = 5 Then Let Booloks = SetWindowPosition(wParam, 0, 10, 50, 400, 150, 40) ' 5 here is the number for a window about to be activated. This is probably the one I want. If I catch it when it is starting , 3, then It might then re set the size and position stuff again to the standard after I have done it 
    Let GlobinalCntChopsLog = GlobinalCntChopsLog - 1 ' Every first copy run of the code has the count reduced to 0 so that when it starts again (as the only first copy active) it will be increased to 1 again to indicate it is a run of the function copy 1 
    End Function 

希望可以幫助OP和其他人處理相同或相似的問題。

艾倫

參考文獻:
http://www.excelfox.com/forum/showthread.php/2227-VBA-Input-Pop-up-Boxes-Application-InputBox-Method-versus-VBA-InputBox-Function
http://www.mrexcel.com/forum/excel-questions/447043-left-top-arguments-application-inputbox-method.html
http://www.vbforums.com/showthread.php?617519-RESOLVED-Excel-InputBox-position-works-in-2003-but-not-2007
https://www.excelforum.com/excel-new-users-basics/1099015-vba-application-inputbox-option-helpfile-helpcontextid.html#post4827566

相關問題