Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Tabellenblatt auf VBA-Code überprüfen
#1
Moin

nach langer (und erfolgloser) Recherche habe ich mich entschlossen mein Problem in diesem Forum darzustellen.
Ich habe eine Exceldatei bei der ich über einen Button eine Userform aktiviere. In dieser Userform werden alle geöffneten Exceldateien gelistet und der Benutzer soll eine auswählen. Aus der ausgewählten Datei wird das erste Tabellenblatt in diese Datei integriert. Es sollen aber nur Exceldateien gelistet werden, die keinen VBA-Code enthalten. Dafür habe ich mir eine Funktion geschrieben - check_code - die WAHR zurückgibt, wenn Code gefunden wurde.

Nach langem Ausprobieren bin ich auch so weit gekommen, dass die Funktion das tut was sie soll. ABER leider bekomme ich eine Situation nicht ordentlich abgefangen: die Überprüfung von Arbeitsmappen, die noch nie gespeichert wurden, also Mappe1.* Dateien. denn für diese Dateien gibt es (leider) keinen FileName. Ich habe erwartet, dass im FileName dann zumindest "Mappe1.xlsx" steht - Fehlanzeige. 

Ich habe mir bisher so geholfen, dass ich solche Files über die Eigenschaft "BuildFileName" erkenne, da diese nur 14 Zeilen lang ist. Ist aber eine unschöne Lösung. Mir fehlt eine Möglichkeit vom ArbeitsmappenNamen (ThisWorkbook.Name oder Worksbooks(i).Name) auf das zugehörige VBProject zuzugreifen. Hätte ich dafür eine Lösung, könnte der Code deutlich einfacher aussehen. 

Vielleicht hat ja jemand eine Idee. 
(Ziel dieses Posts ist nicht meine Programmierfähigkeit zu beurteilen - ich weiß, dass ich kein Experte darin bin und man vermutlich einiges im Code professionell anders machen würde. Sollten grobe Schnitzer drin sein, bin ich über eine PM dankbar 63)

Private Function check_code(dateiname As String)
Dim i As Integer
Dim j As Integer

    If dateiname <> "" Then
        check_code = False
        For i = 1 To Application.VBE.VBProjects.Count
            If Len(Application.VBE.VBProjects.Item(i).BuildFileName) > 14 Then
                If InStr(Application.VBE.VBProjects.Item(i).Filename, dateiname) > 0 Then
                    For j = 1 To Application.VBE.VBProjects.Item(i).VBComponents.Count
                        If Application.VBE.VBProjects.Item(i).VBComponents.Item(j).CodeModule.CountOfLines > 0 Then
                            check_code = True
                        End If
                    Next
                End If
            ElseIf Len(Application.VBE.VBProjects.Item(i).BuildFileName) <= 14 Then
                check_code = True
                Exit Function
            End If
        Next
    Else
        resp = MsgBox("Datei '" & dateiname & "' existiert nicht.", vbOKOnly)
    End If
End Function
Antwortento top
#2
Hallo,

eigentlich sollte es einfacher gehen:

- für normale Dateien reicht eine Prüfung auf den Typ:
xlsx: ohne VBA, xlsm: mit VBA
(gilt nicht für malware)
- Workbook.hasVBAProject
gibt True/False zurück
- vor dem Öffnen sollte man "Application.AuitomationSecuroty" auf disable setzen
- um ganz sicher zu gehen, kann das Zip-File untersucht werden.

mfg
Antwortento top
#3
(05.11.2020, 09:50)bongers.stefan schrieb: ABER leider bekomme ich eine Situation nicht ordentlich abgefangen: die Überprüfung von Arbeitsmappen, die noch nie gespeichert wurden, also Mappe1.* Dateien. denn für diese Dateien gibt es (leider) keinen FileName.

Moin!
Eine noch nicht gespeicherte Datei hat noch keine Dateiendung!

Du kannst aber die Windows.Caption-Eigenschaft abfragen:

Sub Test()
Dim w As Window
For Each w In Application.Windows
  Debug.Print w.Caption
Next
End Sub

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antwortento top
#4
Hallo Fennek, 

laut meinen Recherchen haben alle Dateien auch ein VBA-Projekt. Dies habe ich auch getestet und neue Dateien, bekommen auch das Projekt (markierte Datei hat definitiv keinen Code, aber ein Projekt).

Ich habe nun mal die Abfrage eingebaut Workbooks(i).hasVBProject => und tatsächlich wird mir hier FALSCH ausgegeben, wenn kein Code vorhanden ist. Das ist aber merkwürdig, da das Projekt ja vorhanden ist. 

Danke erstmal vielmals für die Info - ich werde das so mal umsetzen und testen.


Angehängte Dateien Thumbnail(s)
   
Antwortento top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste