# Excel VBA: Bezug auf aktuelle Zelle in Schleife?



## venom4u (25. April 2007)

Hallo Leute, ich versuche gerade mich in Excel VBA etwas einzuarbeiten und bin über folgendes Problem gestolpert. Ich möchte ein kleines Makro schreiben, dass mir in jeder Zelle, die ich vorher makiert habe, einen gewissen String einfügt. Hier erstmal das Makro soweit:

```
Sub insert_plus()
    Dim wert As String
    Dim wert_temp As String
    Dim ins As String
    Dim einfuegen_start As Long
    
    
    ins = Application.InputBox(prompt:="Textzeichen zum Einfügen:", Type:=2)
    einfuegen_start = Application.InputBox(prompt:="Textzeichen zum Start:", Type:=1)
    
    For Each c In Range(ActiveWindow.RangeSelection.Address)
        wert_temp = c.Value
        wert = Mid(wert_temp, 1, einfuegen_start) & ins & Mid(wert_temp, einfuegen_start + 1)
        MsgBox (wert)
    Next c
     
End Sub
```

Anstelle der "MsgBox" möchte ich aber den modifizierten String in das akutelle Feld (quasi die Quelle von "c") zurückschreiben. In Java wäre das ja sowas wie "this". Kann mir bitte jemand einen Tipp geben?

Tausend Dank

Christian.


----------



## Perlmann (27. April 2007)

Hallo,
 das wäre vermutlich einfach c.value = wert
klappt?
Gruß
Phil


----------



## venom4u (27. April 2007)

Nein so ging es leider nicht. c oder auch c.value liefert immer den Inhalt der Zelle, nicht aber die Adresse (weder in "Range"-form noch in "Cells"-form). Deshalb habe ich es nach langem Durchstöbern von ca. 1000 Foren und etlichem Kombinieren anders gelöst. Ob es elegant ist weiß ich nicht, aber da ich noch ein totaler Anfänger bin, zählt ja nur das Ergebnis  

Hier der Code, falls es interessiert:


```
Public Sub string_einfuegen()
    Dim ins As String
    Dim einfuegen_start As Long
    Dim str_start As String
    Dim int_start_zeile As Integer
    Dim int_start_spalte As Integer
    Dim int_ende_zeile As Integer
    Dim int_ende_spalte As Integer
    Dim x, y As Integer
    Dim wert_temp As String
    Dim arr_a As Variant
    
    
    'Einlesen der Werte
    
    ins = Application.InputBox(prompt:="Textzeichen zum Einfügen:", Type:=2)
    einfuegen_start = Application.InputBox(prompt:="Postion, HINTER dem der String eingefügt werden soll:", Type:=1)
    
    str_start = ActiveWindow.RangeSelection.Address '(rowabsolute:=False, columnabsolute:=False)
    MsgBox (ActiveWindow.RangeSelection.Address)
    
    'Start Zelle
    If InStr(str_start, ":") > 0 Then
        int_start_zeile = Range(Left(str_start, InStr(str_start, ":") - 1)).Row
        int_start_spalte = Range(Left(str_start, InStr(str_start, ":") - 1)).Column
    
        'End Zelle
        int_ende_zeile = Range(Right(str_start, InStr(str_start, ":") - 1)).Row
        int_ende_spalte = Range(Right(str_start, InStr(str_start, ":") - 1)).Column
    Else
        int_start_zeile = Range(str_start).Row
        int_ende_zeile = int_start_zeile
        
        int_start_spalte = Range(str_start).Column
        int_ende_spalte = int_start_spalte
    End If
           
        
    For y = int_start_zeile To int_ende_zeile
        For x = int_start_spalte To int_ende_spalte
            wert_temp = Cells(y, x).Value 'Alter Wert der Zelle wird übergeben
            Cells(y, x).Value = Mid(wert_temp, 1, einfuegen_start) & ins & Mid(wert_temp, einfuegen_start + 1) 'Wert wird verändert und zurückgeschrieben
        Next x
    Next y

End Sub
```

Nun würde mich aber auch noch eins interessieren. Ich habe das Ding als AddIn gespeichert und im AddIn Manager aktiviert. Leider kann ich es nur aus der VBA Umgebung (Alt + F11) starten, nicht aber auf einen Button legen. Kann mir da jemand weiterhelfen? Es gibt nen Haufen Fragen im Netz dazu, aber keine gute Antwort.... 

Besten Dank, Christian.


----------



## Perlmann (29. April 2007)

Hallo Christian,

versuch mal folgende Funktion: (natürlich musst Du noch Deine Bezeichner eintragen...)
Gruß
Phil


Public Function PrepareExcel(NurLeisteLoeschen As Boolean)
    On Error GoTo err_
    Dim i As Integer
    Dim MyCommandBar As Office.CommandBar
    Dim MyButton As Office.CommandBarButton
    Dim MyListFeld As Office.CommandBarComboBox
    Dim MyPopup As Office.CommandBarPopup
    'Leiste Löschen
    For i = 1 To Application.CommandBars.Count
        If Application.CommandBars(i).Name = "myFunctionBar" Then
            Application.CommandBars(i).Delete
            Exit For
        End If
    Next i

    If NurLeisteLoeschen = True Then
        GoTo exit_
    End If

    Set MyCommandBar = Application.CommandBars.Add("myFunctionBar", msoBarTop, , True)

'LokationsListe
'1:
    Set MyButton = MyCommandBar.Controls.Add(msoControlButton, , , 1, True)
    MyButton.Caption = "my_Bezeichnung"
    MyButton.Style = msoButtonCaption
    MyButton.OnAction = "mySub_or_Function"

' ... und weitere bei Bedarf


Exit Function

exit_:

Exit Function
err_:

End Function


----------

