Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: PeterW am März 01, 2025, 16:53:29

Titel: Verweise
Beitrag von: PeterW am März 01, 2025, 16:53:29
Im Zusammenhang mit der Nutzung der Zwischenablage soll der Verweis Microsoft Forms 2.0 Object Library (Excel) gestzt werden. Ich arbeite mit Office 365 und kann den Verweis nicht finden. Gibt es den nicht mehr?
Titel: Re: Verweise
Beitrag von: andyfau am März 01, 2025, 17:19:03
Hallo,

lade dir die FM20.DLL irgendwo runter und speichere sie  im Windows/system32/ Verzeichnis. Dann sollte ein Verweis darauf in VBA unter Extras möglich sein.

Beste Grüße
Andreas
Titel: Re: Verweise
Beitrag von: Debus am März 01, 2025, 19:42:44
Hey schau auch mal hier wegen 64 bit und Registrierung

https://www.herber.de/forum/archiv/1884to1888/1887797_VBA_Probleme_mit_FM20DLL.html#26

Und schau mal vorab bei Dir hier ob die nicht da liegt.

C:\Program Files\Microsoft Office\root\vfs\System

Holger
Titel: Re: Verweise
Beitrag von: PhilS am März 02, 2025, 10:08:13
Zitat von: PeterW am März 01, 2025, 16:53:29Im Zusammenhang mit der Nutzung der Zwischenablage soll der Verweis Microsoft Forms 2.0 Object Library (Excel) gestzt werden. Ich arbeite mit Office 365 und kann den Verweis nicht finden. Gibt es den nicht mehr?
Die Microsoft Forms Bibliothek gehört nicht (direkt) zu Excel sondern zu VBA im Allgemeinen.
Am einfachsten Bekommst du einen Verweis darauf, wenn du in VBA "Einfügen" - "User Form" ausführst und dann das User Form wieder löscht.

Zitat von: andyfau am März 01, 2025, 17:19:03lade dir die FM20.DLL irgendwo runter und speichere sie  im Windows/system32/ Verzeichnis.
Äh..? Nein! Bitte nicht vermeintlich fehlende Systemdateien von irgendwelchem dubiosen Webseiten herunterladen!
Windows\System32 wäre in vielen Fällen auch nicht der richtige Zielort.
Titel: Re: Verweise
Beitrag von: Bitsqueezer am März 02, 2025, 12:42:40
Hallo,

ich habe hier noch ein paar Clipboard-Funktionen, die ich in einem früheren Projekt verwendet habe, die benötigen keine DLL, weil sie die Windows API verwenden. Muß man nur auf 64Bit anpassen, wenn benötigt.

Option Compare Database
Option Explicit

'Clipboard Funktionen aus
'Microsoft Knowledge Base 210216/210213

Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function CloseClipboard Lib "User32" () As Long
Public Declare Function OpenClipboard Lib "User32" (ByVal hWnd As Long) As Long
Public Declare Function EmptyClipboard Lib "User32" () As Long
Public Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long

Public Const GHND = &H42
Public Const CF_TEXT = 1

' Zusätzliche Funktionen zum Auslesen der Zwischenablage
Public Declare Function GetClipboardData Lib "User32" (ByVal wFormat As _
   Long) As Long
Public Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) _
   As Long

' Zwischenspeicher für Zwischenablage
Public varClipboardBuffer As Variant

Public Sub ClipBoard_SetData(MyString As String)
   Dim hGlobalMemory As Long, lpGlobalMemory As Long
   Dim hClipMemory As Long, X As Long

   ' Allocate moveable global memory.
   '-------------------------------------------
   On Error GoTo ClipBoard_SetData_Error

   hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

   ' Lock the block to get a far pointer
   ' to this memory.
   lpGlobalMemory = GlobalLock(hGlobalMemory)

   ' Copy the string to this global memory.
   lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

   ' Unlock the memory.
   If GlobalUnlock(hGlobalMemory) <> 0 Then
      MsgBox "Could not unlock memory location. Copy aborted."
      GoTo OutOfHere2
   End If

   ' Open the Clipboard to copy data to.
   If OpenClipboard(0&) = 0 Then
      MsgBox "Could not open the Clipboard. Copy aborted."
      Exit Sub
   End If

   ' Clear the Clipboard.
   X = EmptyClipboard()

   ' Copy the data to the Clipboard.
   hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

   If CloseClipboard() = 0 Then
      MsgBox "Could not close Clipboard."
   End If

ClipBoard_SetData_Exit:
    Exit Sub

ClipBoard_SetData_Error:
    Select Case Err
        Case Else
            fnErr "modClipboard->ClipBoard_SetData", True
            Resume ClipBoard_SetData_Exit
    End Select

End Sub


Public Function ClipBoard_GetData() As String
   Dim hClipMemory As Long
   Dim lpClipMemory As Long
   Dim MyString As String
   Dim Retval As Long
   Dim lngSize As Long

   On Error GoTo ClipBoard_GetData_Error

   If OpenClipboard(0&) = 0 Then
      MsgBox "Cannot open Clipboard. Another app. may have it open"
      Exit Function
   End If
         
   ' Obtain the handle to the global memory
   ' block that is referencing the text.
   hClipMemory = GetClipboardData(CF_TEXT)
   If IsNull(hClipMemory) Then
      MsgBox "Could not allocate memory"
      GoTo OutOfHere ' -------->
   End If

   lngSize = GlobalSize(hClipMemory)
   If Not lngSize = 0 Then
        MyString = Space$(lngSize)
   Else
        MyString = ""
        GoTo OutOfHere ' -------->
   End If

   ' Lock Clipboard memory so we can reference
   ' the actual data string.
   lpClipMemory = GlobalLock(hClipMemory)

   If Not IsNull(lpClipMemory) Then
      Retval = lstrcpy(MyString, lpClipMemory)
      Retval = GlobalUnlock(hClipMemory)
     
      ' Peel off the null terminating character.
      'MyString = Mid(MyString, 1, InStr(1, MyString, Chr$(0), 0) - 1)
   Else
      MsgBox "Could not lock memory to copy string from."
   End If

OutOfHere:

   Retval = CloseClipboard()
   ClipBoard_GetData = MyString

ClipBoard_GetData_Exit:
    Exit Function

ClipBoard_GetData_Error:
    Select Case Err
        Case Else
            fnErr "modClipboard->ClipBoard_GetData", True
            Resume ClipBoard_GetData_Exit
    End Select

End Function

"fnErr" ist eine Funktion zur Fehlerbehandlung, man kann hier auch einfach eine Msgbox verwenden o.Ä.

Die Zwischenablage läßt sich damit auswerten:
varClipboardBuffer = ClipBoard_GetData
Der Inhalt kann aber komplex sein, je nachdem, was man in die Zwischenablage gestellt hat.

Ich wäre mit den DLLs auch aus anderer Hinsicht vorsichtig: Wenn die DLL nicht auf dem eigenen System ist, kann sie auch Teil einer Lizenz sein, die man z.B. mit einer älteren Office-Version noch hatte. Wenn diese in einem aktuellen Office nicht enthalten ist, ist sie auch nicht lizenziert. Man darf sie dann weder verwenden noch mit der eigenen Anwendung weitergeben. Ich weiß nicht, ob das für die Forms-Library zutrifft, aber nur mal so allgemein.

Unter 64Bit-Windows ist die FM20.dll allerdings auch nicht in System32, sondern in ..Windows\SysWOW64\FM20.dll.

Entgegen dem, was man annehmen würde, nämlich 32Bit-Komponenten in System32 zu finden, sind die 32Bit-Komponenten unter SysWOW64 zu finden. Wer immer sich das ausgedacht hat...

Gruß

Christian


Titel: Re: Verweise
Beitrag von: Knobbi38 am März 02, 2025, 12:44:54
Hallo Peter,

wenn du lediglich das DataObject brauchst, kannst du auch mit late-binding
Dim objDataObject As Object
Set objDataObject = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
darauf zugreifen.

Gruß
Knobbi38
Titel: Re: Verweise
Beitrag von: PhilS am März 03, 2025, 10:33:13
Zitat von: Bitsqueezer am März 02, 2025, 12:42:40Unter 64Bit-Windows ist die FM20.dll allerdings auch nicht in System32, sondern in ..Windows\SysWOW64\FM20.dll.
Und das auch nur dann, wenn man noch ein Office 2010 (oder evtl. auch 2013) installiert hat. 
Bei den neueren MS365 Installationen liegen solche Dateien in dem virtuellen Dateisystem der Office-Sandbox unter ...Microsoft Office\root\vfs\...
Titel: Re: Verweise
Beitrag von: Knobbi38 am März 03, 2025, 11:20:36
Holla,

auf einem 64Bit Windows ist \windows\System32 reserviert für 64Bit DLLs und 32Bit DLL landen im \windows\SysWOW64 Verzeichnis, welches dann bei 32Bit Anwendungen mit Hilfe des File System Redirectors automatisch beim Zugriff auf %windir%\System32 angesprochen wird.

Auf einem 32Bit Windows gibt es kein %windir%\SysWOW64 Verzeichnis.

Wenn man also ein 32Bit Office installiert hat, sollte sich die FM20.DLL im Verzeichnis %windir%\SysWOW64 befinden, oder aber im gleichnamigen Verzeichnis im virtuellen Filesystem für die Office Installation. Letzteres hat eigentlich nichts mit der "Office Sandbox" zu tun, sondern gehört eigentlich zu den Technologien "Microsoft Application Virtualization" und "Application Virtualization Sequencer", welche für die Bereitstellung von Installationen, Komponenten und Upgrades von MS verwendet werden.

Gruß
Knobbi38