Avatar billede dkclajen Juniormester
07. januar 2017 - 15:02 Der er 10 kommentarer

VBA macro does not exist

Er der nogen som ved hvorfor ovennævnte fejl kan finde på at dukke op når jeg køre en VBA macro.

Fejlen tyder på en IBM fejl.
http://docs.attachmate.com/reflection/14.x/prog-ref/ibm/index.htm#_rb_error_codes.htm

Koden virker 100%, fejlen kommer først efter fuldendt macro. :/
Kan der være noget i koden, eller kan det være programmet som ikke vil acceptere koden?
Avatar billede Dan Elgaard Ekspert
07. januar 2017 - 15:28 #1
Vi er jo nok nødt til at se din VBA kode, for at kunne give et kvalificeret svar...
Avatar billede dkclajen Juniormester
07. januar 2017 - 16:06 #2
Option Explicit

' Import
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare Function SetDlgItemText Lib "user32" _
    Alias "SetDlgItemTextA" _
    (ByVal hDlg As Long, _
    ByVal nIDDlgItem As Long, _
    ByVal lpString As String) As Long

Private Declare Function SetWindowsHookEx Lib "user32" _
    Alias "SetWindowsHookExA" _
    (ByVal idHook As Long, _
    ByVal lpfn As Long, _
    ByVal hmod As Long, _
    ByVal dwThreadId As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long

' Handle to the Hook procedure
Private hHook As Long

' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5

' Constants
Public Const IDOK = 1
Public Const IDCANCEL = 2
Public Const IDABORT = 3
Public Const IDRETRY = 4
Public Const IDIGNORE = 5
Public Const IDYES = 6
Public Const IDNO = 7

Public Sub MsgBoxSmile()
    ' Set Hook
    hHook = SetWindowsHookEx(WH_CBT, _
                            AddressOf MsgBoxHookProc, _
                            0, _
                            GetCurrentThreadId)

    ' Run MessageBox
    MsgBox "Smiling Message Box", vbYesNo, "Message Box Hooking"
End Sub

Private Function MsgBoxHookProc(ByVal lMsg As Long, _
                                ByVal wParam As Long, _
                                ByVal lParam As Long) As Long

    If lMsg = HCBT_ACTIVATE Then
        SetDlgItemText wParam, IDYES, ":-)"
        SetDlgItemText wParam, IDNO, ":-("

        ' Release the Hook
        UnhookWindowsHookEx hHook
    End If

    MsgBoxHookProc = False
End Function

Just a copy-past som jeg fandt på nettet.
Igår gjorde den det hele tiden, i dag gør den det ikke. :/
Avatar billede Dan Elgaard Ekspert
08. januar 2017 - 12:35 #3
Ahhh....
Den klassiske MsgBox hook :-)

Du finder en langt bedre og mere robust version her:
http://www.EXCELGAARD.dk/Bib/MsgBoxCB/
Avatar billede dkclajen Juniormester
08. januar 2017 - 19:25 #4
Ja jeg syntes lige den var smart til det jeg skulle bruge i min Macro. :)

men den vil ikke godkende følgende linjer, den melder fejlen på PtrSafe. :/


Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr
      Private Declare PtrSafe Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" (ByVal hDlg As LongPtr, ByVal nIDDlgItem As LongPtr, ByVal lpString As String) As LongPtr
      Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As LongPtr, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongPtr) As LongPtr     
      Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongPtr
#Else
Avatar billede dkclajen Juniormester
08. januar 2017 - 19:46 #5
Og så kan jeg åbenbart heller ikke få lov til at tilgå macroen.
Den kræver åbenbart at den hedder :

Sub xxxx()    /  Public Sub xxxx()

End
Avatar billede Dan Elgaard Ekspert
08. januar 2017 - 21:48 #6
????
Den makro som jeg henviser til?
Har du lavet noget om i den kode???
Hvilken version af Excel benytter du?
Avatar billede Dan Elgaard Ekspert
08. januar 2017 - 21:51 #7
Du skal blot kopiere modulet med koden over i dit eget project, og så blot kalde funktionen i dine egne makroer...
...forsøger du at tage dele af koden, og indbygge den i dine egne koder, går det galt!

Flyt hele modulet med koden over i dit eget projekt!
Avatar billede dkclajen Juniormester
09. januar 2017 - 08:13 #8
Jeg kopier det hele, godt nok i 3 bider, ellers kopier jeg linjetal med over fandt jeg ud af.
Og nej, jeg har intet lavet om i den. Det er ikke Excel jeg bruger, det er et gammelt DOS baseret program jeg bruger på arbejde som anvender VBA til macroer. Noget som gør min hverdag lidt bedre. ;)
Avatar billede Dan Elgaard Ekspert
09. januar 2017 - 19:40 #9
Okey - så er vi jo ved at spore os ind på problemet :-)

Så er det jo ikke VBA, du benytter, men VBScript - og, det er ikke helt det samme...
Hvis du downloader Excel filen, og prøver, at køre makroen i Excel, vil det bestemt virke...

Jeg er desværre ikke så skarp til VBScript, men jeg jeg mindes, at det er ren 32-bit, og derfor skal du fjerne alt, hvad der indeholder:

- PtrSafe
- LongPtr
- #If...#Else... #EndIf

Måske osse noget mere, men i hvert fald sørge for at koden er ren 32-bit.
Avatar billede dkclajen Juniormester
09. januar 2017 - 19:57 #10
Se der lærte jeg også lige noget. :) De ligner jo hinanden til forveksling. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester