# VBA Exel - Inhalt von Zellen in Variable schreiben



## JumpnJack (2. Mai 2004)

Hallo Leute.

Also ich bin ein totaler Neuling in Sachen VB oder VBA. Mein Problem ist, ich möchte Werte in Zellen auslesen, diese dann mit verschiedenen Abfragen prüfen und dann etwas damit anstellen.

Das Prob ist halt das ich mit der Hilfe von VBA nicht wirklich zurecht komme und eine anständige Funktionsreferenz ala php vermisse ich auch. Also weiß ich schon überhaupt nicht wie ich eine Zelle auselesen kann. Hat da einer einen Tipp wie ich das am besten bewerkstellig, oder wo es sowas wie eine sinnvolle Funktionsreferenz gibt?

Wäre echt klase wenn ihr mir helfen könntet.

Liebe Grüße
JumpinJack


----------



## lohokla (2. Mai 2004)

```
dim ZellenInhalt as String
ZellenInhalt = range("A1").value
```

Befehlreferenz find ich auch grade für Einsteiger nicht besonders nützlich und im Internet hab ich auch noch keine guten Sites gefunden 
Was manchmal ganz nützlich sein ist "Makro aufzeichnen".


----------



## JumpnJack (2. Mai 2004)

Hallo Danke dir für die Antwort. War schon ziemlich nahe an der Lösung wie ich sehe. Es ist auch mal schön zu sehen wie man die Variablen perfekt ausweißt. Also vielen Dank dafür.

Leider stehe ich vor einem unerklärlichen Prob. Ich möchte eine Referenz schreiben und diese soll aus Variablen zusammengesetzt. Das sieht wie folgt aus:
ActiveCell.FormulaR1C1 = "='" & VAR_TABELLE   & "'!" & VAR_ZELLE
Laut meinem Gedankengang sollte das dann richtig raus kommen. Nämlich:
='TabelleX'!B3
Was aber tatsächlich raus kommt ist dies:

='TabelleX'!*'*B3*' *

Sprich zwei einzelne Anführungszeichen zu viel. Wie kommt sowas und wie kann ich das verhindern.

Gruß JumpinJack

btw: Ja das mit dem Makro aufzeichnen funktioniert echt klasse. Aber leider nurt soweit wie man alles anklicken kann. Wenn ich eine wert in eine Variable schreiben möchte ist das praktische Tool am ende, oder ich hab das noch nicht ganz begriffen.


----------



## lohokla (2. Mai 2004)

Ich denk mal der Fehler entsteht, wenn du VAR_TABELLE und VAR_ZELLE einen Wert zuweist. Aber so wie du das vorhast zu machen sieht es sowieso ziemlich umständlich aus - da gibt es bestimmt eine leichtere Methode. Was möchtest du denn genau machen?


----------



## JumpnJack (2. Mai 2004)

Das entsteht aus einer Buchhaltung herraus. Jedes WorkSheet ist die Buchhaltung für ein anderes Jahr für nur einen Klient oder Mandant. 

Das Makro erzeugt eine neue Tabelle mit dem Namen "Aktuelles Jahr" (2004) und übernimmt von Tabelle 2003 die Daten. Ich möchte nicht die Werte von den Zellen kopieren sondern die referenz hinterlegen damit, sollte ich was ändern, auch alles automatisch mitgeändert wird.

Hm...das ist echt schwer zu erklären. Fest steht das ich diese Referenzen benötige. Mal ein Beispiel für meine Zuweisungen


```
COUNTER2 = COUNTER2 + 1
' COUNTER2 = Schleifendurchlauf und Zeilendef
            NEW_GEGENSTAND_ZELLE = "B" & COUNTER2
' Spalte B bleibt, Reihe wird durch Schleifendurchlaufszahl gesetzt
' Ich denke die Zusammensetzung ist einigermassen klar.
' NEW_GEGENSTAND_ZELLE ist die Referenz
            Sheets(TO_SHEET).Select
            Range(NEW_GEGENSTAND_ZELLE).Select
            I_NEW_GEGENSTAND_ZELLE = "='" & AKT_SHEET & "'!" & NEW_GEGENSTAND_ZELLE
            ActiveCell.FormulaR1C1 = I_NEW_GEGENSTAND_ZELLE
```

Ich kanns schlecht erklären. Ich hoffe du siehst wo ich hin will. Was kann ich denn falsch machen wenn ich 2 Variablen an einander hängen möchte. Oder einen festen String mit einer Variable verkette?


----------



## lohokla (2. Mai 2004)

Wenn ich das Problem richtig verstanden habe, dann kann man das Problem sogar ohne vba lösen  

Also du hast ein Blatt mit den Daten vom letzten Jahr (in meinen Beispiel heißt es DB_2003). Die Daten die auf diesen Blatt stehen willst du auf ein neues Blatt (DB_2004) übertragen, willst aber auch, dass automatisch Änderungen, die du auf den alten Blatt machst aufs Neue übertragen werden?! 
Ich hab mal ein Beispiel (ist ohne vba) angehängt, wie ich mir vorstelle wie das aussieht.


----------



## JumpnJack (2. Mai 2004)

OK. Finde ich echt klasse das du dir die Mühe machst. Also das Beispiel habe ich mir mal angesehen, funktioniert aber nicht wirklich. Jedenfalls wenn ich in DB_2003 was ändere wird das nicht im anderen Tabellenblatt übernommen.

Ich denke ich benötige doch VBA.  Ich hänge mal mein Bspl an.
Gucks dir bitte mal an. Gehe bitte auf Tabellenbaltt 2004. Dort siehst du Referenzen auf 2003. Nun kannst du mit dem kleinen Makro was ich geschrieben habe ein neues Datenblatt erzeugen mit dem Namen 2005. Dort wird die entsprechende Formatierung der Spaltenbreite und den inhalt der Kopftabelle erzeugt. Nun soll das Makro hingehen und checken:
Ist in H3 (1. Zeile Abgänge) ein wert enthalten > ja dann überspringe diese Zeile und kopiere diese nicht in 2005
Wenn nein checke ob in H3 (1. Zeile  unter Spalte Gegenstand) ein wert drin steht. Wenn nein ist das ende der tabelle erreicht. 

Wenn aber in H3 nichts steht aber in B3 schon dann schreibe die Referenz in das eben erzeugte Tabellenblatt 2005 unter B3. ...und diverse andere Werte. Aber das ist dann nur noch fleissarbeit.

Bei H3 und B3 ist die 3 nur exemplarisch und dient nur als Anfang. Tatsächlich sollte das eher X heißen da diese Abfrage in Schleife gesetzt werden soll. Es soll ja bis zum ende der Tabelle jeder Eintrag geprüft werden.

Ich hoffe das ist einigermassen Verständlich. Und ich hoffe das Makro ist im Dokumnet enthalten.


----------



## lohokla (3. Mai 2004)

Ich hab mal probiert das mit Objektvariablen zu lösen - bei mir geht es, wie ich mir das vorgestellt habe


----------



## MattisGod (22. September 2006)

Also ich hab das jetzt bei mir auch einmal gemacht - die variable bekomm ich hin - nur möchte ich jetzt mit der Variablen auch etwas machen und zwar, ich habe in der zelle G36 einen Tabellennamen diesen habe ich jetzt in die Variable übergeben nun möchte ich diese Variable in ein makro eingebunden eingesetzt - wo es anstatt des Tabellennames steht - wenn ich jetzt das marko ausführe dann kommt folgende Fehlermeldung "Index auserhalb des gültigen Bereichs" weis einer was ich da machen muss - also ich möchte aus einer 2. tabelle deren name in der Variablen steht daten in die 1. tabelle kopieren.

Danke im Voraus


----------



## Nirraven (22. September 2006)

```
Sub test()
bla = Range("A1")
Worksheets(bla).Activate
End Sub
```

Sollte eigentlich funktionieren.


P.S.: Ja, ich benutze nicht aussagekräftige Variablennamen. Bevor das wieder jemand bemängelt...


----------



## MattisGod (25. September 2006)

Ja das ist nicht schlecht - aber das geht nur wenn sich die daten auf einem Tabellenblatt befinden - ich möchte aber eine kompelt neue tabelle öffnen - also ich habe in der Zeile "G45" den Pfad stehn - und nun möchte ich mit einem druck auf einen commandbutton die tabelle öffnen.


----------



## MattisGod (25. September 2006)

Ich habe noch ein prob^^

also ich habe in excel ein "SelectFile Class" objekt erstellt - damit kann man ja eine Datei suchen und dann steht der komplette pfad in einem Textfeld - wie kann ich jetzt zb diesen pfad in dem textfeld in eine zeile - damit ich wie im letzen beitrag beschrieben diese tabelle öffnen kann ?

ich weis echt nicht mehr weiter - ich hoffe einer von euch hab eine idee !

Also das mit den Variablen geht bei mir irgendwie nicht - wenn ich eine Zelle einer variablen zuweise und dann diese variable in eine funktion einsetzte dann geht das nicht - wenn ich aber nur die zelle einsetze ohne alles dann geht es - ist doch igendwie komisch - oder ? :suspekt:


----------



## Nirraven (25. September 2006)

Klapp trotzdem


```
Sub test()
bla = Range("A1")

Workbooks.Open (bla)

End Sub
```


----------



## MattisGod (25. September 2006)

ok du hast recht - thx, ich hab da immer "" gemacht - das war warscheinlich der fehler ^^

eine frage hätte ich da aber noch an dich - und zwar - wenn ich jetzt den pfad haben will indem ich auch einen button drücke und dann die datei auswähle - weist du wie das geht?

ich pack mal en screen von der form mit rein!


----------



## Nirraven (25. September 2006)

Am unkompliziertesten ist wohl

```
Public Function GetFolderName()
    Dim oFileDialog As FileDialog
    Set oFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    With oFileDialog
        .Title = "Wählen Sie bitte den gewünschten Ordner aus!"
        .ButtonName = "auswählen"
        .Show
        For Each vrtselecteditem In .SelectedItems
            GetFolderName = vrtselecteditem & "\"
        Next

    End With
End Function
```


----------



## MattisGod (25. September 2006)

ähm ja nicht schlecht - nur kann ich da keine dateien auswählen...

was ich gerne hätte wenn es nicht zuviele umstände macht - ist das wenn man die datei ausgewählt hat - sie automatisch an die zelle G45 geleitet wird.

Ist das vllt machbar *bitte* *hundeblick*


----------



## MattisGod (26. September 2006)

also das mit den dateien auswählen hab ich geschaft - nur wie bekomme ich das jetzt ausgegeben ...

auserdem bringt der mir immer nen fehler bei der zelle wo 

For Each vrtselecteditem In .SelectedItems
            GetFolderName = vrtselecteditem & "\"

steht ...


----------



## Nirraven (26. September 2006)

Hm, sorry, das war aus einem meiner Programme zum Ordner auswählen.


```
Public Function GetFolderName()
    Dim oFileDialog As FileDialog
    Set oFileDialog = Application.FileDialog(msoFileDialogOpen)
    With oFileDialog
        .Title = "Wählen Sie bitte den gewünschten Ordner aus!"
        .ButtonName = "auswählen"
        .Show
        For Each vrtselecteditem In .SelectedItems
            GetFileName = vrtselecteditem
        Next
    End With
End Function
```

ist für Dateien. 
GetFileName beinhaltet dann das was du brauchst. Die komplette Pfadangabe inkl. Dateiname.


----------



## MattisGod (26. September 2006)

und was ist jetzt die variable wo der pfad drinsteht?

GetFileName
oder
vrtselecteditem


----------



## Nirraven (26. September 2006)

Und schon wieder n Fehler... ^^

```
Public Function GetFileName()
    Dim oFileDialog As FileDialog
    Set oFileDialog = Application.FileDialog(msoFileDialogOpen)
    With oFileDialog
        .Title = "Wählen Sie bitte den gewünschten Ordner aus!"
        .ButtonName = "auswählen"
        .Show
        For Each vrtselecteditem In .SelectedItems
            GetFileName = vrtselecteditem
        Next
    End With
End Function
```

GetFileName ist die funktion, welche als String den Pfad zugewiesen bekommt.


----------



## MattisGod (26. September 2006)

ja das ist mir alles klar - das hab ich auch selber herausgefunden  

nur wenn ich das jetzt ausfürhre dann kommt der mir mit der fehlermeldung "objekt erforderlich"

ich hab vrtselecteditem als object gemacht da der gesagt hat das das nicht deklariert ist.

Kannst du mir vllt die ganze funktion zeigen ^^


----------



## Nirraven (27. September 2006)

vrtSelectedItem ist ein string, welcher den Pfad beinhaltet, welchen ich hier nur der Funktion zugewiesen habe, weil ich den FileDialog immer als eigene Funktion habe.

Ich weiß auch nicht, wie du das Objekt erforderlich hin bekommst.

P.S.: Da du doch VBA Excel benutzt. Streng mal die suche mit dem begriff File Dialog an.


----------



## MattisGod (27. September 2006)

also wenn ich vrtselecteditem als string mache dann kommt die fehler meldung
"Steuervaribable für for each muss vom typ variant oder object sein"

also ich hab das jetzt mal so gemacht:

```
Public Function przGetFileName()
    ' Auswahlfenster öffnen und Daten anzeigen
    Dim oFileDialog As FileDialog
    Set oFileDialog = Application.FileDialog(msoFileDialogOpen)
    With oFileDialog
        .Title = "Wählen Sie bitte den gewünschten Ordner aus!"
        .ButtonName = "auswählen"
        .Show
        ' Ausgewählte Datei in Variable übergeben
        For Each vrtselecteditem In .SelectedItems
            GetFileName = vrtselecteditem
        Next
    End With
End Function
```

und dann hab ich die funktion hier ausgeführt


```
Private Sub CommandButton2_Click()
        'Public Function ausführen
        przGetFileName
        'Pfad der Datei von Variablen in Zelle schreiben
        Range("G50").Value = vrtselecteditem
End Sub
```

nur was ist daran falsch?

ich hab das jetzt mal aus den angaben die du mir gemacht hast heraus geproggt - vllt findest du ja einen fehler ...


----------



## MattisGod (27. September 2006)

ahh ok ich glaub ich habs - ich habs als variant gemacht - nur bekomm ich jetzt den inhalt der variablen nicht in die zelle ...

arfg ich dreh noch ab bei dem scheis ^^ ich will das endlich hinbekommen xD


----------



## Nirraven (27. September 2006)

MattisGod hat gesagt.:


> also wenn ich vrtselecteditem als string mache dann kommt die fehler meldung
> "Steuervaribable für for each muss vom typ variant oder object sein"
> 
> also ich hab das jetzt mal so gemacht:
> ...



Wenn du die Funktion umbenennst, dann würde ich das auch im kompletten code machen...
Im moment weist du einer Variablen vom Typ Variant vrtselecteditem zu.

vrtselecteditem brauchst du nicht deklarieren. Das ist ein String innerhalb einer FileDialog Auflistung.

Und Wieso nicht einfach

```
Range("G50").Value = przGetFileName
```

?


----------



## MattisGod (27. September 2006)

ich muss aber vrtselecteditem deklarieren sonst macht er mir ne fehlermeldung ...


----------



## MattisGod (27. September 2006)

wohhooo ich habs !!^^

jetzt isses nur so das wenn ich die datei einmal ausgewählt habe - das dialogfeld ein 2. mal kommt und ich dann nochmal auswählen muss ....

aber es ist ein fordschritt ... XDD


----------



## MattisGod (27. September 2006)

ahhhh ok ich habs ... jetzt gehts wirklich ^^

man war das eine schwere geburt ... aber ich bedanke mich für die hilfe - ohne dich hätte ich es nicht geschaft 

Es sollte mehr solche Leute geben wie dich ;-)


----------



## MattisGod (27. September 2006)

hei ich hab doch noch ein prob^^

habs aber in nen neuen threat gemacht 
http://www.tutorials.de/forum/visual-basic/255727-vba-excel-pfad-teilen.html

vllt weist du ja was ... warscheinlich muss ich bei dem Filedialog schon was machen ...

keine ahnung ich hoffe du weist was^^


----------

