[VBA] Excel-Anwendung

Hallo Community!

Ich darf im Rahmen eines Ferienjobs als keinen Zusatz eine VBA-Funktion entwickeln, die die Arbeit mit einer Excel-Liste erleichtern soll. Ich bin zurzeit nur leider noch ganz am Anfang meiner Programmier-Laufbahn. Ich habe schonmal - allerdings auf sehr niedrigem Niveau - ein bisschen VBScript geschrieben und bin gerade dabei, C/C++ zu lernen. Das Grundverständniss ist also schon da, nur eben alles noch in Kinderschuhen ...

Daher wäre ich über Hilfe jeglicher Art (Links, etc.) sehr dankbar. Gerne auch schon einen Code-Ansatz, dass ich einfach ein bisschen vorwärts komme. Ich weis nämlich leider garnicht, wie ich beginnen soll. (Außer Option Explicit :wink:)

Die Anwendung soll folgendes können:

Nach einer Eingabe in eine Zelle einer bestimmten Spalte soll das Verzeichnis der Hyperlink-Basis nach *.dwg-Dateien mit diesem Dateinamen durchsucht werden.
Wird eine Datei gefunden, so soll diese (zwei Spalten weiter) als Hyperlink mit Textfeld = Dateipfad (ohne Hyperlink-Basis) verlinkt werden.
Wírd keine Datei gefunden, so soll ein roter Fehlertext in die entsprechende Zelle zwei Spalten weiter geschrieben werden.

Beispiel: Eingabe 123 in der Spalte A1, Applikation durchsucht X:\lala nach 123.dwg und findet in X:\lala\lala2\ eine passende Datei. Diese wird als lala2\123.dwg in der Spalte A3 als Hyperlink eingefügt.

Vielen Dank für alle hilfreichen & konstruktiven Beiträge! :)
mymic

EDIT: Hoffe mal, das Thema ist im richtigen Bereich erstellt ... wenn nicht bitte verschieben, sorry!
 
anbieten würde sich schonmal die behandlung des Worksheet_Changed Events ... damit wird dein Code immer dann ausgeführt, nachdem eine zelle im betreffenden worksheet durch ein script oder eine benutzereingabe geändert wurde (nicht aber durch eine formelberechnung)

dein Event handler bekommt eine Range "Target" als Parameter übergeben, die representiert den bereich der geändert wurde

in dem du diese Range auf ihre adresse und ihre ausdehnung (Rows.Count, Columns.Count) überprüfst, kannst du feststellen ob dieses Ereignis die spalte berührt, für die du die angegebene funktionalität haben willst ...

falls ja, sollte es relativ leicht sein herauszufunden welche felder der spalte sich geändert haben...

um für ein feld deiner spalte diese änderung zu berechnen, also die datei zu suchen empfiehlt es sich eine neue funktion zu schreiben die als parameter das feld (ob als range, oder als adresse ist aus funktionaler sicht wohl relativ egal, aus performance gründen würde ich ein range objekt übergeben) annimmt, für dass eine aktualisierung stattfinden soll...


was das auffinden von dateien angeht, wird sich aus dem code hier wohl etwas machen lassen ...

und hyperlinks setzen ist auch nicht soo schwer...
Hyperlinks.Add <dein Zellbezug hier, ohne die spitzen klammern... z.B. Cells(1,1) >, "Ziel des Links", "Subziel des links... bei excel tabellen kann dies ein zellbezug sein, ansonsten leerer string", "der Tool-Tip Text", "Das was in der zelle angezeigt werden soll"
 
Danke schonmal für den Code für die Suche, ich denke damit kann man was anfangen ...

Den eigentlichen Vorgang zu starten müsste garnicht über ein Change-Event erfolgen, ich denke ich bin da auch nicht tief genug in der Materie um das in absehbarer Zeit zu verstehen.
Wäre es nicht einfacher, es nach einer Tastenkombination ablaufen zu lassen? Also zB Bei STRG + l nimmt die Anwendung den Inhalt der aktiven Zelle, führt damit die Suche aus und gibt den Dateipfad als Hyperlink aus? Da könnte man ja vielleicht mit einem OnKey-Befehl das simpler gestalten?

EDIT:
Weiteres Problem ist das Verweisen auf eine Zelle im FileName. "*.*" liefert ja alle Dateien. Wie binde ich die aktive Zelle in den FileName ein? Also: Aktive Zelle = test -> FileName = "test.*" ...
 
Zuletzt bearbeitet:
*macht benutz*

du willst nicht die aktive zelle auslesen ...


du willst vom change target wissen welche zelle geändert wurde, und diese auslesen ...


ich bastel dir morgen/heute ein beispiel ...
 
Code:
    Public QuellSpalte, ZielSpalte As Integer
    Public verz As String
    Private changingRow As Integer
    
Private Sub Worksheet_Activate()
    QuellSpalte = 1 ' A
    ZielSpalte = 3 ' C
    verz = Environ("UserProfile") + "\Desktop" ' zu durchsuchendes verz ... hier: %USERPROFILE%\Desktop
    changingRow = 0
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim quelle, ziel As String
    Dim cell As Range
    
    If Target.row = changingRow Then
        Exit Sub
    End If
    For Each cell In Target
        If (cell.Column = QuellSpalte Or cell.Column = ZielSpalte) And cell.Count = 1 Then
            quelle = Conversion.CStr(Cells(cell.row, QuellSpalte).Value)
            ziel = Conversion.CStr(Cells(cell.row, ZielSpalte).Value)
            If quelle = "" And ziel <> "" Then
                Cells(cell.row, ZielSpalte).Value2 = ""
                Cells(cell.row, ZielSpalte).Hyperlinks.Delete
            ElseIf quelle <> "" Then
                setupLink (cell.row)
            End If
        End If
    Next cell
    
End Sub

Private Sub setupLink(row As Integer)
    Dim quelle As String
    Dim fso As Object
    Dim file As Object
        

    quelle = Conversion.CStr(Cells(row, QuellSpalte))
    Set fso = CreateObject("Scripting.FilesystemObject")
    getFileOrNothing fso, quelle, verz, file
    changingRow = row
    If Not file Is Nothing Then
        Hyperlinks.Add Cells(row, ZielSpalte), file.path, "", "", "Link to " + file.Name
    Else
        Cells(row, ZielSpalte).Value2 = "Fehler: Datei nicht gefunden"
        Cells(row, ZielSpalte).Hyperlinks.Delete
    End If
    changingRow = 0
    
End Sub

Private Sub getFileOrNothing(fso As Object, fileName As String, path As String, ByRef file_out As Object)

    Dim f As String
    Dim pathDir As Object
    Dim subdir As Object
    Dim file As Object
    
    Set file_out = Nothing
    
    Set pathDir = fso.getFolder(path)
    For Each file In pathDir.Files
        If file.Name Like fileName + ".*" Then
            Set file_out = file
            Exit Sub
        End If
    Next file
    For Each subdir In pathDir.SubFolders
        getFileOrNothing fso, fileName, subdir.path, file_out
        If Not file_out Is Nothing Then
            Exit Sub
        End If
    Next subdir
End Sub

der code ist dazu gedacht einem Worksheet objekt zugeordnet zu werden

also in einem excel dokument den macro/vba-editor öffnen, im projekt explorer die excel objekte öffnen und auf der gewünschten tabelle einen doppelklick machen ... der code gehört in das fenster was dabei aufgeht ...
 
Zurück
Oben