Modul während Laufzeit umbenennen

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
thowe
Beiträge: 196
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 78 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Modul während Laufzeit umbenennen

#1

Beitrag von thowe »

Mit disem Code kann man während der Laufzeit ein vorhandes VBA-Modul umbenennen.
Wichtig ist das ein Verweis zu "Microsoft Visual Basic for Applications Extensibility 5.3" gesetzt wird.

Dies wird mit der zweiten Prozedur "ActivateReferenceByGUID" durchgeführt


Es gibt 2 Möglichkeiten einen Verweis (Reference) hinzuzufügen (aktivieren).

1) Via GUID - Globally Uniqe Identifyer (Präferenz!)
die GUID ist in der Registry zu finden
2) Direkter Verweis (Angabe des Pfades zur .dll)
ist nicht zu empfehlen, da sich die .dll je nach OS Version an unterschiedlichen Stellen befinden kann

Code: Alles auswählen



Sub RenameModuleName(strNameAlt As String, strNameNeu As String)

    'IMPORTANT: To run this code without occuring error you habe to activate the Rerence
    'Microsoft Visual Basic for Applications Extensibility 5.3
    
    '0,0 should pick the latest version installed on the computer
    ActivateReferenceByGUID "{0002E157-0000-0000-C000-000000000046}", 0, 0
    
    
    Application.VBE.ActiveVBProject.VBComponents(strNameAlt).Name = strNameNeu

End Sub

Code für das Hinzufügen des Verweises

Code: Alles auswählen


Public Sub ActivateReferenceByGUID(strGUID As String, lngMajor As Long, lngMinor As Long)

    On Error Resume Next

    'Für das akvive VBA Projekt
    'Application.VBE.ActiveVBProject.References.AddFromGuid strGUID, lngMajor, lngMinor
    
    'Für die aktive Arbeitsmappe
    ThisWorkbook.VBProject.References.AddFromGuid strGUID, lngMajor, lngMinor
    
    On Error GoTo 0
    
  
End Sub

LG

Man kann auch ein sauberes Errorhandling durchführen:

Code: Alles auswählen


   'Clear any errors so that error trapping for GUID additions can be evaluated
    Err.Clear

     ' Code to add the reference
    
     'If an error was encountered, inform the user
    Select Case Err.Number
    Case Is = 32813
         'Reference already in use.  No action necessary
    Case Is = vbNullString
         'Reference added without issue
    Case Else
         'An unknown error was encountered, so alert the user
        MsgBox "A problem was encountered trying to" & vbNewLine _
        & "add or remove a reference in this file" & vbNewLine & "Please check the " _
        & "references in your VBA project!", vbCritical + vbOKOnly, "Error!"
    End Select
    On Error GoTo 0

LG
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Modul während Laufzeit umbenennen

#2

Beitrag von d'r Bastler »

Moin thowe,

mit dem Rename-Snippet eröffnest Du von mir bisher nicht geahnte Möglichkeiten. Denn dadurch lässt sich das Erstellen von Userforms erheblich umfassender automatisieren, als bisher angenommen. Vielen Dank!!

Als Ergänzung: Es lassen sich auch UserForms und Tabellen auf diese Weise umbenennen - und das ganz ohne erst aufwändig zu deklarieren, um welche Art vbComponent es sich handelt. Der Name genügt. Klasse!

Schöne Grüße

p.s. FS
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Modul während Laufzeit umbenennen

#3

Beitrag von d'r Bastler »

Moin nochmal,

schon in meiner ersten Version meiner vbTools wurden alle aktiven Verweise eines vbProjects in eine Textdatei exportiert. Beispiel:

Code: Alles auswählen

{000204EF-0000-0000-C000-000000000046}  4  2 = VBA @ C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
{00020813-0000-0000-C000-000000000046}  1  9 = Excel @ C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE
{00020430-0000-0000-C000-000000000046}  2  0 = stdole @ C:\Windows\SysWOW64\stdole2.tlb
{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}  2  8 = Office @ C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16\MSO.DLL
{0D452EE1-E08F-101A-852E-02608C4D0BB4}  2  0 = MSForms @ C:\Windows\SysWOW64\FM20.DLL
Eine solche Datei als Grundlage für eine Neuentwicklungen und dann Deine beiden ActivateReferencebyGUID-Zeilen stellen sicher, dass auf dem ausführenden Rechner (natürlich nur, soweit dort vorhanden) die entsprechenden Verweise an den Start zu holen. Das Leben kann schön sein :P

Grüße
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 196
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 78 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Modul während Laufzeit umbenennen

#4

Beitrag von thowe »

Hallo und endlich mal auch ein "Moin" von mir, Heb!

Danke!
JA! Genau,
Am Besten ist man geht wirklich über die GUID vor, da tatsächlich je nach OS (MS, Apple) und ob 32 oder 64 Bit, die Dateien wo anders liegen...
Ich stelle sehr zeitnah ein Snippet rein, mit dem man die AKTIVEN Verweise sich auflisten lassen kann mit GUID, Pfad und so weiter.

Die GUIDS kann man sich aus der Registry heraussuchen. Tatsächlich habe ich die dort (die sind irgendwo unter HKEY-SYSTEM-ROOT gefunden.

Als Workaorund dieses GUIDS.Listing könnte man manuell im VBA IDE die grundsztlichen wiichtigen und oft verwendeten Verweise (Referenzen) aktivieren sich in ein Arbeitsblatt schreiben lassund und eben dann in einer .txt Datei vorhalten.

Apropos .txt Datei, erinnert mich an eine kurze Diskussion mit dir, in der du meintest, ich solle eher nicht Config-Daten in einer .txt vorrätig halten.
Das hier wäre nun ein klassischer Anwendungsfall.

LG
Benutzeravatar
thowe
Beiträge: 196
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 78 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Modul während Laufzeit umbenennen

#5

Beitrag von thowe »

Wie versprochen nun ein Snippet zum Auflisten der aktiven Verweise.

Leide habe bei learnmicrosoft nur für "Access" etwas gefunden.
Link zu: References Objedt (Access)

Hier der Code:

Code: Alles auswählen

Sub ListGUIDDetails()
    'Lists path and GUID (Globally Unique Identifier) for each varReferenceerenced library.
    'Select a Reference in Tools > varReferenceerences, then run this code to get GUID etc.
    'Wähle Extras > Verweise im VBE IDE
    
    
    Dim lngRow As Long
    Dim varReference As Variant
    Dim arrHeader()
    
    'initialize
    arrHeader = Array("Reference", "Version", "GUID", "Path", "Major", "Minor")
    lngRow = 1
    
    'Better way is to address the targeted Worksheet is to handle with the CodeName
    'In Case of this simple Example this recommended alternative has been dispensed
    
    With ThisWorkbook.Sheets("References")
        'some formatting issues
        With Cells
            .Clear
            .Rows(lngRow).Font.Bold = True
        End With
        .Range("A" & lngRow & ":F" & lngRow) = arrHeader
        For Each varReference In ThisWorkbook.VBProject.References
            lngRow = lngRow + 1
            .Range("A" & lngRow & ":F" & lngRow) = Array(varReference.Description, _
                   "v." & varReference.Major & "." & varReference.Minor, varReference.GUID, varReference.FullPath, varReference.Major, varReference.Minor)
        Next varReference
              
        'Adjust column width
        .Range("A:F").Columns.AutoFit
    End With
End Sub

Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Modul während Laufzeit umbenennen

#6

Beitrag von d'r Bastler »

Moin thowe,

wie erwähnt, hatte ich den Export der Verweise aus XL schon realisiert. Hier der Code (allg. Modul) als Auszug aus einer frühen Version der vbTools:

Code: Alles auswählen

Option Explicit
Sub ListReferencebyGUID()
Dim oFileRef As Object, oFileSystem As Object, oRef As Object
Dim sFileRef As String, r As Integer

sFileRef = ThisWorkbook.Path & "\Verweise.txt"
Set oFileSystem = CreateObject("Scripting.FileSystemObject")
Set oFileRef = oFileSystem.CreateTextFile(sFileRef, True)

'Verweise listen
For Each oRef In Application.VBE.ActiveVBProject.References
    oFileRef.WriteLine oRef.GUID & "  " & oRef.Major & "  " & oRef.Minor & " = " & oRef.Name & " @ " & oRef.FullPath
    r = r + 1
Next
oFileRef.Close

MsgBox r & " Verweise gefunden"

End Sub
Kann man natürlich noch um oRef.Version ergänzen.

Thema .txt: Exporte zur Weiterverarbeitung in anderen Anwendungen (z.B. HTML/JS/CSV-Datenbanken) sind keine config.Dateien ...

Grüße
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 196
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 78 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Modul während Laufzeit umbenennen

#7

Beitrag von thowe »

Moin Heb,

danke für dein Snippet.

du deklarierst die Verweise mit

Code: Alles auswählen

Dim oRef as Object
- eben als Objekt. Ich als Variant.

Was sind die wesentlichen Unterschiede, ausgenommen das offensihctlich Objekte weniger "Memory" verbrauchen...?

Zu den Verweisen (References).
Ist es klug diese nur während der Entwickung für "Early Biding" zu verwenden (zum Beispiel IntelliSense), um im Productive Stage dann auf Late Binding, also ohne Referenzen zu arbeiten? Diese würd eventuelle Inkompatibilitäten vorbeugen.... Wie seht ihr das?
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Modul während Laufzeit umbenennen

#8

Beitrag von d'r Bastler »

Moin thowe,
meiner bisherigen Kenntnis nach wäre es eigentlich am besten, wenn man die References direkt als solche deklarieren würde. Dazu benötigt man aber den tatsächlichen Namen. Nachdem mir diese Syntax nicht geläufig ist und ich schon z.T. Tage damit verbracht habe, sie für die verschiedenen Gelegenheiten ausfindig zu machen, habe ich mir irgendwann angewöhnt, die nächst untere Klasse, eben das Objekt, zu nutzen. Variant ist nochmal eine Etage tiefer. Und wahrscheinlich gibt es auch genügend Profis, die erklären können wieso MS das so anlegt.

Ich könnte mir vorstellen, dass da nicht nur Speicherbedarf, sondern auch Systemstabilität/Vulnerabilitäten ihre Rolle spielen. Aber das ist pure Spekulation.

Was Early/Late Binding betrifft: Gegen Inkompatibilitäten hilft nur ausgiebiges Testen auf verschiedenen Plattformen. Daher habe ich mir darüber noch nie Gedanken gemacht. Welche ich dazu nutzen kann, siehst Du in meiner Signatur, wobei meine Offices 32-Bit, die Wins 64-Bit sind. Und mac ist eh noch mal eine andere Baustelle.

Grüße und so ...
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 0 Gäste