# Excel VBA-Editor - Kopieren von Zellen



## Chris_1205 (29. September 2010)

Guten Morgen, 
da ich auf der Arbeit seit kurzer Zeit mit Excel und dem VBA-Editor arbeite, aber ein Neueinsteiger auf diesem Gebiet bin, habe ich einige Fragen. Vllt kann mir ja jmd weiterhelfen 

Ich habe zwei versification Excel-Dateien. Die erste "Aufmaßanfrage.xls" besteht aus einem auszufüllenden Formular - hier gibt es bestimmte Felder (zb. Name, PLZ, Ort usw) die vom Kunden ausgefüllt werden. Die zweite Datei "Aufmassdatei.xls" besteht aus einer Tabelle. Diese Tabelle beinhaltet die gleichen Felder wie die erste Datei.

Es sollen nun die jeweiligen Felder aus "Aufmaßanfrage" in die dafür vorgesehenen Spalten der Tabelle "Aufmassdatei" kopiert werden. Das ganze soll über einen Button laufen, der per Mausklick die Daten von "Aufmaßanfrage" nach "Aufmassdatei" kopiert.

Beispiel
Bin auf folgenden Code gekommen: 


```
Private Sub CommandButton1_Click()

    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy _
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q958")

End Sub
```


Jetzt habe ich leider das Problem das die Formatierung (Hintergrundfarbe) mitkopiert wird. Wie kann ich das ändern? Es soll lediglich der Text kopiert werden.

Desweiteren soll der Button immer betätigt werden wenn das Formular (Aufmaßanfrage) komplett ausgefüllt ist. Kann ich irgendwie Pflichtfelder in das Formular einfügen, die ausgefüllt sein müssen bevor ich den Button betätigen kann?

Für jedes ausgefüllte Formular werden die Daten dann in die Tabelle übertragen. Wenn ein neues Formular übertragen wird, soll er also in der Tabelle eine Zeile nach unten springen, damit er die alten Daten nicht überschreibt. Ist das möglich?

Etwas viel für den Anfang, ich hoffe mir kann da jmd weiterhelfen. Vielen Dank schonmal im vorraus.

Greetz Chris


----------



## tombe (29. September 2010)

Ob es einen Trick fürs Kopieren bzw. Einfügen gibt weiß ich auf die Schnelle nicht aber eines davon könnte dir trotzdem helfen:


```
Selection.ClearFormats

Range().ClearFormats
```




> Desweiteren soll der Button immer betätigt werden wenn das Formular (Aufmaßanfrage) komplett ausgefüllt ist. Kann ich irgendwie Pflichtfelder in das Formular einfügen, die ausgefüllt sein müssen bevor ich den Button betätigen kann?


Du könntest doch im Makro einfach mit IF prüfen ob die entsprechenden Zellen/Felder gefüllt sind. Wenn nicht gibst du eine Fehlermeldung aus.

Gruß Thomas


----------



## Chris_1205 (29. September 2010)

Ich habe Selection.ClearFormats
mal verwendet aber dann hat er mir die Formatierung in "Aufmaßanfrage" gelöscht. 
Dort sind die Felder grau hinterlegt und die dazugehörige Spalte in "Aufmassdatei" ist grün hinterlegt. Das soll auch so bleiben, es soll eigtl nur der Text kopiert werden.




> Du könntest doch im Makro einfach mit IF prüfen ob die entsprechenden Zellen/Felder gefüllt sind. Wenn nicht gibst du eine Fehlermeldung aus.


das könnte man so auch machen, welchen befehl gebe ich dann in den editor ein?


greetz chris


----------



## tombe (29. September 2010)

Und wie sieht es zum Beispiel so aus:


```
Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q958").ClearFormats
```


----------



## Chris_1205 (29. September 2010)

```
Private Sub CommandButton1_Click()

    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("M25").Copy _
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("N985").ClearFormats

End Sub
```

Laufzeitfehler '1004'
Die Copy-Methode des Range-Objektes konnte nicht ausgeführt werden.


----------



## tombe (29. September 2010)

Ich muss zugeben ich habe mir das auch nur im Internet zusammengesucht.
Genauso wie das hier:


```
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
```

Hiermit wird der zuvor kopierte Text ohne Formatierung in die ausgewählte Zelle eingefügt. Bei mir hat das so geklappt.

Zur Prüfung der "Pflichtfelder". Angenommen in den Zellen "A2", "B5" und "C7" muss etwas eingegeben sein.
Dann kannst du das so überprüfen:


```
'jede Zelle wird separat geprüft
If Trim(Range("A2").Value) = "" Then
    MsgBox "Eingabe in Zelle 'A2' ist erforderlich.", vbOKOnly, "Fehler"
End If

If Trim(Range("B5").Value) = "" Then
    MsgBox "Eingabe in Zelle 'B5' ist erforderlich.", vbOKOnly, "Fehler"
End If

If Trim(Range("C7").Value) = "" Then
    MsgBox "Eingabe in Zelle 'C7' ist erforderlich.", vbOKOnly, "Fehler"
End If

'oder eine Prüfung für alle Zellen
If Trim(Range("A2").Value) = "" Or Trim(Range("B5").Value) = "" Or Trim(Range("C7").Value) = "" Then
    MsgBox "Die Zellen 'A2', 'B5' und 'C7' müssen ausgefüllt werden.", vbOKOnly, "Fehler"
End If
```

Gruß Thomas


----------



## Chris_1205 (29. September 2010)

Ich danke dir für deine Mühe Thomas.
Leider bringt der mir wieder einen Fehler. Ich werde da noch was rumprobieren. Habe auch versucht mir das zusammen zu suchen, aber als kompletter Neueinsteiger ist das garnicht so leicht 
Das mit dem Prüfen der Pflichtfelder sieht gut aus. Das hilft mir schon sehr. Ich danke nochmals und melde mich wieder wenn ich das eine Problem gelöst habe. Hoffentlich bald 

Greetz Chris


----------



## tombe (29. September 2010)

Chris_1205 hat gesagt.:


> ...Leider bringt der mir wieder einen Fehler...


 
Und woran stört sich Excel diesmal?

Geh doch mal her und starte die Makroaufzeichnung.

Dann kopierst du irgend einen Wert und gehst dann auf Bearbeiten -> Inhalte einfügen und markierst dort das "Werte".

Makroaufzeichnung stoppen und das so erstellte Makro anschauen. Der Befehl der jetzt mit drin steht ist der Befehl den du brauchst.

Gruß Thomas


----------



## Chris_1205 (30. September 2010)

Morgen,
mit der Makroaufzeichnung habe ich es versucht. Hat auch funktioniert nur leider hat er mir das immer in die Zelle eingefügt die gerade markiert war und nicht in die gewünschte. Das mit dem "Inhalte einfügen" --> "Werte" ist genau das was ich haben möchte.

Ich habe das ganze jetzt für eine Datei mal ausprobiert


```
Private Sub CommandButton1_Click()
  
 Range("AB25").Select
    Selection.Copy
   Range("BA32").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub
```

Mit diesem Befehl funktioniert es. Aber an der Übertragung von der einen zur anderen Datei schweiter ich immer an Laufzeitfehlern oder anderen Problemen.

Greetz Chris


----------



## tombe (30. September 2010)

Neuer Versuch.
Habe 2 Dateien "Mappe1.xls" und "Mappe2.xls". In Mappe1 stehen ein paar Werte und es existiert ein Button. Wird der Button angeklickt, wird folgender Code ausgeführt und der Wert in Mappe2 übertragen.

Bei mir hat es so (in Excel 2000) ohne Fehlermeldung geklappt.


```
Private Sub CommandButton1_Click()
Dim datei1, datei2 As Workbook
Dim mappe1, mappe2 As Worksheet

Application.ScreenUpdating = False

Set datei1 = ActiveWorkbook
Set mappe1 = datei1.ActiveSheet
Set datei2 = Workbooks("Mappe2.xls")
Set mappe2 = datei2.Worksheets("Tabelle1")

Range("A1").Select
Selection.Copy
mappe2.Activate
mappe2.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

mappe1.Activate

Application.ScreenUpdating = True
End Sub
```


----------



## Chris_1205 (30. September 2010)

Problem gelöst:


```
Private Sub CommandButton1_Click()
    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("AB25").Copy
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("N985").PasteSpecial Paste:=xlPasteValues
        
    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q985").PasteSpecial Paste:=xlPasteValues
End Sub
```

dank dir trotzdem viel mals Thomas. Hast mir da sehr geholfen.


----------



## Chris_1205 (30. September 2010)

Habe es jetzt sogar noch geschafft, dass er immer in die letzte Zeile der Tabelle springt und nicht die alten Daten überschreibt.


```
Private Sub CommandButton1_Click()
    Dim lngLast As Long
    
    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("AB25").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "N").End(xlUp).Row + 1

        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("N" & lngLast).PasteSpecial Paste:=xlPasteValues
        
    ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q985").PasteSpecial Paste:=xlPasteValues
End Sub
```

Greetz Chris


----------



## Chris_1205 (30. September 2010)

Hallo Thomas, 
ich habe jetzt mal deinen Code mit den Pflichtfeldern ausprobiert. Der sieht dann wie folgt aus:



```
Private Sub CommandButton1_Click()
    Dim lngLast As Long
    
    
     If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"

End If
    
    'Regionalzentrum
        ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "Q").End(xlUp).Row + 1
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues

End Sub
```

Das mit dem Prüfen funktioniert soweit auch, nur kopiert der mir die Daten dann trotzdem alle noch. Wahrscheinlich muss ich den Kopiervorgang in die Prüfung mit einbinden oder habe ich da sonst etwas über sehen?

Greetz Chris


----------



## tombe (30. September 2010)

Hi Chris,

du musst nach der Prüfung bzw. nach der Fehlermeldung den weiteren Ablauf unterbrechen:


```
If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"
'das hier hat gefehlt
    Exit Sub
End If
```

Hatte ich ganz oben aber auch vergessen, sorry.

Gruß Thomas


----------



## Chris_1205 (30. September 2010)

Danke für die schnelle Antwort. 
Aber das Kopieren erfolgt ja immer noch nach dem Prüfen der Zellen. 
Mit dem Exit Sub hat sich bei mir nichts geändert. Muss ich das Kopieren nicht irgendwie in die Prüfung der Pflichtfelder einschliessen?


----------



## tombe (1. Oktober 2010)

Hi Chris,
wenn ich es so schreibe wird die Prozedur verlassen (Exit Sub) wenn die Zellen G61 oder I77 leer sind.


```
Private Sub CommandButton1_Click()
Dim lngLast As Long
    
If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"
    Exit Sub
End If

'Regionalzentrum
ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "Q").End(xlUp).Row + 1

Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues

End Sub
```


----------



## Chris_1205 (1. Oktober 2010)

Das Problem ist gelöst. Herzlichen Dank Thomas.
Ich habe aber wieder mal ein kleines Problem. Beim Kopieren meiner Daten aus der einen Datei in die andere, soll immer eine Zeile tiefer kopiert werden. Bisher ist mein Code wie folgt:


```
ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "Q").End(xlUp).Row + 1
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues
```

Das Problem hier ist aber, das er nun immer die letzte beschriebene Zeile nimmt. Es gibt aber manchmal auch leere Zeilen. Diese müssten dann übersprungen werden. 
Wäre super wenn mir da jmd helfen könnte.

Greetz Chris


----------



## tombe (1. Oktober 2010)

Das Problem hier bei ist das Excel ja nicht wissen kann ob nach der letzten beschriebenen Zeile nur 1, 2, oder X leere Zeilen kommen.

Kannst du nicht eine Hilfsspalte einsetzten in die dann z.B. nur ein "x" oder eine "1" eingetragen wird. Diese Spalte kann ja auch ausgeblendet werden, zu Überprüfung kann sie trotzdem benützt werden ohne dass sie die Optik stört.

Gruß Thomas

P.S. was war das Problem mit der Überprüfung weiter oben?


----------



## Chris_1205 (1. Oktober 2010)

Das Problem mit der Überpfüfung war, dass ich noch ein Else einfügen musste. Damit er nur kopiert falls die Pflichtfelder ausgefüllt sind.


```
Private Sub CommandButton1_Click()
    Dim lngLast As Long

    If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"
    
Else
    
    
    'Regionalzentrum
        ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "Q").End(xlUp).Row + 1
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues
```


Das mit der Hilfsspalte wäre in dem Sinne nicht so gut, da man dann dort ja auch was eintragen müsste. Das sollte wenn möglich automatisch gehen. 
Gibt es denn die Möglichkeit das ich beim ersten Kopieren festlege wo er anfängt z.B. in Zeile 1 und das er dann bei jedem neuen Formular aus dem die Werte kopiert werden, eine Zeile tiefer springt.

Greetz Chris


----------



## tombe (1. Oktober 2010)

Klar, du kannst eine allgemein gültige Variable erstellen und ihr dann die entsprechende Zeilennummer zuweisen.
Beim ersten Aufruf oder wenn die Variable noch keinen Wert hat kannst du ihr ja einen Anfangswert geben.


```
If zeile% = 0 Then
  zeile% = 1
Else
  zeile% = zeile% + 1
End If
```


----------



## Chris_1205 (5. Oktober 2010)

Guten Morgen,
ich habe es jetzt etwas anders gemacht. Da ich dir Zeile ja Variablen zuweisen kann, habe ich einfach eine ''Aufmaß-Nr.'' dazu verwendet. Diese war sowieso schon in der Tabelle in Spalte A vorhanden und ist eine fortlaufende Zahl. Diese wird per Hand eingegeben und dann kopiert. Sie ist also in jeder Zeile vorhanden. Das ganze sieht dann so aus


```
'Aufmaß-Nr
        ThisWorkbook.Worksheets("Aufmaßanfrage").Range("I77").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "A").End(xlUp).Row + 1
        Workbooks("Aufmassdatei").Worksheets("Aufmassdatei").Range("A" & lngLast).PasteSpecial Paste:=xlPasteValues
```

Greetz Chris


----------



## Chris_1205 (5. Oktober 2010)

Da ich ja einen Button habe, der das Makro ausführt, würde ich diesen gerne nur für bestimmte Benutzer sichtbar machen. Ist das möglich? Alternativ ginge auch, dass nur bestimmte Benutzer die Berechtigung haben den Button zu betätigen. Könnte man ja vllt über den Benutzernamen in Excel machen oder?
Hat das schonmal jmd gemacht?
Habe es erst mit dem Blattschutz versucht, aber da sperrt er mir nur das Blatt und nicht den Button.

Greetz Chris


----------



## tombe (5. Oktober 2010)

Hier ist eine Möglichkeit beschrieben den Windows-Benutzer zu ermitteln:
http://www.schmittis-page.de/index.html?/excel/vba/t10.htm

Jetzt könntest du beim Excel Start bzw. beim Öffnen der Datei prüfen ob der so ermittelte Benutzer das Recht hat das Makro zu benützen oder nicht.
Wenn ja lässt du alles wie es ist, wenn nicht setzt du "Button.Enabled = False"

Gruß Thomas


----------



## Chris_1205 (5. Oktober 2010)

Hi,
habe den Benutzernamen ermittelt. Das sind immer so genannte "R-Nummern". Diesen Nummern könnte ich dann jetzt die Rechte zuordnen. 
Habe das jetzt mal so versucht


```
Private Sub CommandButton1_Click()

If UserName.R885897 = "False" Then
Button.Enable = False

End If
```

Er sagt mir dann: "Fehler beim Kompilieren"
"Funktion oder Variable erwartet"

Irgendwas hab ich wieder falsch gemacht...

Greetz Chris


----------



## tombe (5. Oktober 2010)

Also wenn der Excel-Benutzer zum Beispiel den "Namen" R885897 hat, dann musst du es so prüfen


```
If UserName = "R885897" Then
    Button.Enable = True
Else
    Button.Enabled = False
End If
```


----------



## Chris_1205 (5. Oktober 2010)

Danke sehr. Das sieht gut aus. Und wo bring ich das in meinem Code unter.
Der Anfang sieht zur Zeit so aus


```
Private Sub CommandButton1_Click()

  
    Dim lngLast As Long
    
    If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then    'Zellen für Pflichtfelder <Datum> und <Aufmaß-Nr>
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"    'Message Box
    
Else
    
    
    'Regionalzentrum
        ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "A").End(xlUp).Row + 1
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues
```


----------



## tombe (5. Oktober 2010)

In Excel gibt es entweder die Prozedur "Worksheet_Activate()" oder "Workbook_Open()" und hier könntest du obigen Code reinschreiben.

Dann wird der Button bereits beim Öffnen der Datei bzw. beim Aktivieren der entsprechenden Tabelle gesperrt oder freigegeben.


----------



## Chris_1205 (5. Oktober 2010)

Quasi ein neues Modul einfügen mit folgendem Code



```
Workbook_Open()
If UserName = "R885897" Then
    Button.Enable = True
Else
    Button.Enabled = False
End If
```

richtig?

Greetz


----------



## tombe (5. Oktober 2010)

Nein!
Wenn du im VB-Editor bist, dann ist rechts das Projektfenster.
Dort klickst du entweder auf Arbeitsmappe oder auf Tabelle1 (oder so wie sie halt heißt). Dann kannst du die entsprechende Prozedur auswählen.

Auf dem Bild siehst du es besser (hier sind beide enthalten). Du suchst dir eine davon aus (ist eigentlich egal welche) und fügst den obigen Code/IF-Block ein.


----------



## Chris_1205 (5. Oktober 2010)

Okay verstanden. Danke. 
Habe das jetzt gemacht und nun bringt er mir nen Laufzeitfehler '424' "Objekt erforderlich"


```
Private Sub Workbook_Open()
    
If UserName = "R885897" Then
    Button.Enable = True
Else
    Button.Enabled = False
End If
End Sub
```

Kann es sein, dass ich dem Button einen Namen zuordnen muss oder erkennt der das wenn ich nur Button schreibe?


----------



## tombe (5. Oktober 2010)

Ich Blödmann. Sorry mein Fehler.

Du musst es in die Worksheet_Activate-Prozedur schreiben. Da der Button ja in der Tabelle (Worksheet) enthalten ist, kann die Datei (Workbook) ihn ja gar nicht kennen. Deshalb auch der Fehler, Excel kaennt das Objekt an der Stelle ja noch gar nicht.


----------



## Chris_1205 (5. Oktober 2010)

Habe ich jetzt auch mal gemacht. Ganz an den Anfang oder?
Sieht dann so aus.


```
Private Sub Worksheet_Activate()

If UserName = "R885897" Then
    Button.Enable = True
Else
    Button.Enabled = False
End If

End Sub



Private Sub CommandButton1_Click()
  
    Dim lngLast As Long
    
    If Trim(Range("G61").Value) = "" Or Trim(Range("I77").Value) = "" Then    'Zellen für Pflichtfelder <Datum> und <Aufmaß-Nr>
    MsgBox "Die Zellen 'Datum' und 'Aufmaß-Nr' müssen ausgefüllt werden.", vbOKOnly, "Fehler"    'Message Box
    
Else
    
    
    'Regionalzentrum
        ThisWorkbook.Worksheets("Aufmaßanfrage").Range("L15").Copy
        lngLast = Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Cells(Rows.Count, "A").End(xlUp).Row + 1
        Workbooks("Aufmassdatei.xls").Worksheets("Aufmassdatei").Range("Q" & lngLast).PasteSpecial Paste:=xlPasteValues
```


Leider aber wieder Laufzeitfehler '424'


----------



## tombe (5. Oktober 2010)

Ok und was fällt dir auf wenn du die Click-Prozedur deines Buttons anschaust?

Er heißt nicht einfach "Button" sondern "CommandButton1". Ändere im Code die Bezeichnung und du hast es geschafft!


----------



## Chris_1205 (6. Oktober 2010)

Das hatte ich ja selber schon vorher mal ausprobiert. Aber dann konnte ich den Button garnicht mehr betätigen. Den UserName habe ich dann nochmal nachgeschaut obs vllt der falsche ist, aber es ist: R885897


----------



## tombe (6. Oktober 2010)

Ich glaube das steckt wieder mal viel MS Logik dahinter.

Wenn ich die Variable "username" beim Eingeben komplett klein schreibe und die Zeile verlasse, dann wird das Wort automatisch in "UserName" umgewandelt.
Das bedeutet für mich Excel hat erkannt das es eine - nennen wir es mal Systemvariable ist.

Wenn man dann aber den Inhalt überprüft erhält man immer nichts zurück, kein Inhalt. 

Erst wenn man den Code so ändert


```
Private Sub Worksheet_Activate()
'man achte auf Application vor dem Usernamen
If Applictaion.UserName = "R885897" Then
    CommandButton1.Enable = True
Else
    CommandButton1.Enabled = False
End If
 
End Sub
```

dann bekommt man etwas zurück und kann die Überprüfung vornehmen.

Gruß Thomas


----------



## Chris_1205 (6. Oktober 2010)

Das Problem ist, dass ich das Makro erst immer ausführen muss damit es funktioniert. Es geht nicht wenn das Worksheet aktiviert wird.

Edit: Hatte nicht gelesen das du noch was geschrieben hattest. Werde es jetzt mal ausprobieren danke.

Greetz Chris


----------



## tombe (6. Oktober 2010)

Geh mal her und gib irgendwo im VBA-Editor folgenden Code ein:


```
Sub test()
    Debug.Print "-" & UserName & "-"
    Debug.Print "-" & Application.UserName & "-"
End Sub
```

dann blende dir (sofern nicht sichtbar) das Direktfenster ein und drücke die F5-Taste.

Dann wird der Unterschied klar. Beim Ersten erhältst du nur "--" und beim Zweiten kommt dann z.B. "-R885897-".


----------



## Chris_1205 (6. Oktober 2010)

Bekam leider immer noch einen Laufzeitefehler. Vllt war ich auch zu blöd es richtig einzutippen. Habe da aber jetzt noch was gefunden mit dem es geklappt hat.


```
Private Sub Workbook_Open()
    Worksheets("Aufmaßanfrage").CommandButton1.Visible = Environ("Username") = "R885897"
End Sub
```

Greetz Chris


----------

