PDA

Vollständige Version anzeigen : PC-Benutzer per VBA abfragen


Kollaps
22.07.2014, 11:51
Hallo liebe Leute,

eine neue Frage schwirrte mir gerade im Kopf herum.
Ich habe mal gegooglet, aber so wirklich weitergebracht hat mich das nicht.

Vielleicht kennt ihr ja noch einen Querverweis, ich weiß ehrlich gesagt nicht wonach ich suchen soll.

Ich möchte "schummeleien" unterbinden und den Namen direkt aus dem Benutzernamen ausschneiden.
Wie ich den benutzernamen kriege weiß ich bereits. Mein problem liegt darin, dass ich den ersten Buchstaben jeweils weglassen muss.
Heißt abschneiden.

zum Beispiel der Mitarbeiter heißt Hans Meier, dann ist sein Benutzername (und das ist bei allen gleich) hmeier, allerdings muss das h dann weg und das M am liebsten Groß, geht das? Und wenn ja, geht das auch relativ simpel, also kein kleines Programm sondern so per ein zwei Zeilen? :D

Weil, wenn nicht, dann möchte ich da keine große Mühe bereiten, ist im Endeffekt nur eine Spielerei meinerseits :D

Vielen Dank im Voraus schonmal.

Liebe Grüße
Christoph

Hajo_Zi
22.07.2014, 11:53
Hallo Christoph,

Du hast die falsche Methode.
MsgBox Environ("username")

<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

Kollaps
22.07.2014, 11:54
Ich habe gar keine Methode geschrieben?

Aber ich möchte das auch nicht per MsgBox ausgegeben haben, der schreibt mir den Usernamen schon in die passende Zelle.

Nur der erste Buchstabe muss halt weg, im Grunde, das mit dem Großbuchstaben wäre nur eine SchönheitsOp.

Hajo_Zi
22.07.2014, 12:26
Gut, dann interpretiere ich das mal so Du möchtest keine Lösung.
Ich habe gar keine Methode geschrieben?

Da ich Deine Methode nicht sehe, bin ich dann raus.

<a href="http://Hajo-Excel.de/index.htm" target="_blank" title="Hajo's Excelseiten">Gruß Hajo</a>

Kollaps
22.07.2014, 12:32
:D Ich will doch eine erfahren, ich weiß doch keine, das ist doch mein Problem.

Private Sub Username()
Dim Netzwerk As Object
Dim Nachname As String

Set Netzwerk = CreateObject("wscript.network")

Nachname = Netzwerk.Username

Worksheets("data").Cells(2, 7).Value = Nachname

End Sub



So. Das ist meine Funktion bislang dafür. Die funktioniert so auch einwandtfrei.
Es fehlt halt nur das i-Tüpfelchen.

EarlFred
22.07.2014, 12:35
Hallo Christoph,

Option Explicit


Sub DeinCode()

'hier geht es los.....


Dim strNutzername As String

strNutzername = Environ("Username")
strNutzername = ersterwegundgroß(strNutzername)

End Sub


Function ersterwegundgroß(ByVal strÜbergabe As String) As String

strÜbergabe = Application.Proper(Mid(strÜbergabe, 2))

End Function

Kernstück, unschwer zu erkennen, ist dieser Teil:
Application.Proper(Mid(strÜbergabe, 2))

Grüße
EarlFred

Kollaps
22.07.2014, 12:40
Okay. Probier ich mal aus.
Was macht dieses "Environ" ?
Das hatte Hajo ja eben auch verwendet?

Und wofür steht eigentlich "str", das kommt extrem häufig vor in den Funktionen und Deklarationen?

EarlFred
22.07.2014, 12:47
Hallo Christoph,

markier mal Environ im VB-Editor und drück F1...
Solche Fragen muss man hier nicht stellen.

Schlau wäre die Frage gewesen, wofür das "Username" steht - denn DAS kann man dort nicht nachlesen - allerdings wenn man das erste nachgelesen hat, sich das auch selbst zusammenreimen.

Und wofür steht eigentlich "str"
Eine Abwandlung der ungarischen Notation (http://de.wikipedia.org/wiki/Ungarische_Notation)

Grüße
EarlFred

Kollaps
22.07.2014, 12:51
Wenn ich drunter schreibe, dass er den Wert in die Zelle schreiben soll, bleibt die Zelle leider leer?

Sonst nichts, er lässt schreibt sie nur leer.

EarlFred
22.07.2014, 12:52
Wodrunter??

Kollaps
22.07.2014, 12:56
Als letzten Befehl in das(?) Sub.

Private Sub Username()
Dim strNutzername As String

strNutzername = Environ("Username")
strNutzername = ersterwegundgroß(strNutzername)

Worksheets("data").Cells(2, 7) = strNutzername
End Sub

____________________
Achso:
Das die Frage doof war, ist mir im nachhinein auch aufgefallen.
Allerdings steh ich mir der Microsoft-Hilfe (F1) auf kriegsfuß, habe mal im msdn nachgelesen ^^

EarlFred
22.07.2014, 13:05
wollte nur mal sehen, ob Du mitdenkst:

Function ersterwegundgroß(ByVal strÜbergabe As String) As String

ersterwegundgroß = Application.Proper(Mid(strÜbergabe, 2))

End Function

Allerdings steh ich mir der Microsoft-Hilfe (F1) auf kriegsfuß, habe mal im msdn nachgelesen ^^
Wo Du nachliest ist doch egal, die Hauptsache ist, Du weißt wo und tust es überhaupt.

Grüße
EarlFred

Kollaps
22.07.2014, 13:14
Ja, in der Funktion wandelt er das ab und übergibt im Sub den rausgekommen Wert wieder an strNutzername, oder nicht?

Die Funktion steht da so drin?

______
Ich glaube euch, was ihr mir sagt :D Wenn ihr mir sagt, das stimmt so, les ich mir das durch und versuche zu verstehen, was da steht...

EarlFred
22.07.2014, 13:18
Hallo,

..und ich will, dass Ihr was lernt - auch aus den Fehlern von uns Helfern.

Zur Function: Es gibt mindestens 2 Varianten, wie Du die Rückgabe des veränderten Strings bewerkstelligen kannst. Die eine steht in Post 12.

Wie lautet also eine andere Möglichkeit?

Grüße
EarlFred

Kollaps
22.07.2014, 13:29
Ehm.

Nur etwas, was ich zumindest ausprobieren würde:

Man könnte entweder die Funktion so umschreiben, dass man mit einer globalen Variable arbeitet (z.B. strNutzername) und dann per

call erstergroßundweg
die Daten manipuliert und "abspeichert"

oder die "funktion" als solches komplett rausschmeißt und

strNutzername = Application.Proper(Mid(strNutzername, 2))

direkt schreibt?

bzw. wäre Environ("Username") nicht auch in dem Fall kürzbar, für die Übergabe?
______________________

aaah. Warte.
im Sub schreibt man:

ersterwegundgroß((strNutzername))

Das meinst du, oder?

xlph
22.07.2014, 13:33
Hallo,

oder so...

Sub Test()

Dim BenutzerName As String

BenutzerName = StrConv(Mid$(Environ("Username"), 2), vbProperCase)

MsgBox BenutzerName

End Sub

Kollaps
22.07.2014, 13:55
Okay, wenn man diese MsgBox weglässt und das an eine Zelle übergibt, funktioniert das sogar einwandfrei.

Allerdings muckst mein SVerweis jetzt, da muss ich mal nachschauen, was der hat.

Eine Frage noch: Wofür ist das Dollar-Zeichen, das kann ich auch weglassen und es funktioniert? MSDN gibt mir da keine Antwort zu, oder ich bin zu blöd zum suchen.

EarlFred
22.07.2014, 14:01
Hallo,

yep, genau, eine globale Variable wäre noch ein dritter Weg, den ich außer Acht gelassen habe, da diese Variante zwar funktioniert, aber durch Nutzung globaler Variablen der Code in der Regel schlechter lesbar wird (der Inhalt der Variable könnte jederzeit von jeder Prozedur geändert werden), zudem wird der Speicher, egal ob benötigt oder nicht, immer vorgehalten... usw.. Ich versuche, diese Variante zu vermeiden.

Ich dachte an etwas anderes:
Option Explicit

Sub DeinCode()

'hier geht es los.....


Dim strNutzername As String

strNutzername = Environ("Username")
ersterwegundgroß strNutzername

Worksheets("data").Cells(2, 7) = strNutzername

End Sub


Function ersterwegundgroß(ByRef strÜbergabe As String)

strÜbergabe = Application.Proper(Mid(strÜbergabe, 2))

End Function
Aber auch diese Variante wäre für mich nicht die bevorzugte, da das Ändern von Variablen durch eine Funktion oder Sub schnell zu unverständlichem Code führt.

Aber wie Du merkst, es führen viele Wege nach Rom. xlph hat die Grundaufgabe ja auch anders (und sehr elegant) gelöst.

Die $-Zeichen kann man weglassen, tu ich (leider) auch zu häufig. Es gibt einige Funktionen in VBA, die eine Variante mit und ohne $ haben. Bei denen mit $ ist es klar, dass ein String an die Funktion übergeben wird, die interne Typumwandlung von Variant nach String also entfallen kann. Dies spart Zeit und ist daher zu bevorzugen, wenn es die Randbedingungen zulassen.

Grüße
EarlFred

Kollaps
22.07.2014, 14:26
Okay, also voerst String Konvertierung inkl. StrConv-Member merken, weil schön schlank schnell.

Kann es sein, das der SVerweis mit diesem Wert nicht arbeiten kann (kommt nur ein NV bei rum)?
Index klappt tadellos?

EarlFred
22.07.2014, 14:38
...StrConv ist vor allem schnell.

Der Sverweis ist glücklicherweise sehr penibel (bei Bereich_Verweis = 0 / Falsch). Vermutlich ist Dein Datenbestand unsauber. Such mal nach Leerzeichen.

Warum genau es nicht klappt weiß kein Mensch, der Deine Daten nicht sieht.

Grüße
EarlFred

Kollaps
22.07.2014, 14:51
Ne, der meckert nur aus Spaß mal wieder.
Das habe ich oft, mit dem Index funktioniert das wunderbar.

In den Daten sind keine Leerzeichen oder sonst was.
Ich habe sogar die Zelle kopiert und als Kriterium angegeben.
--Macht er nicht.

Okay, Index macht es und das ist was wichtig ist, im Endeffekt.
Wenn mir jetzt nicht noch eine Schnapsidee kommt, bin ich tatsächlich endlich fertig damit. :D

Ist ein extrem cooler Monatsbericht geworden! :D
Mal schauen wie der ankommt, drückt mir die Daumen :D

EarlFred
22.07.2014, 15:01
Ne, der meckert nur aus Spaß mal wieder.
ganz sicher nicht. Du findest nur den Fehler nicht.

Wie bringst Du Index ohne weiteres dazu, das gleiche wie Sverweis zu tun? So langsam interessiert mich doch, wie Deine Formeln aussehen.
Ich benötige mindestens noch die Funktion Vergleich für die Suche der gesuchten Zeile / Spalte - und die Funktion arbeitet nach der gleichen Suchlogik wie der Sverweis, sollte also die gleichen Probleme haben.

Grüße
EarlFred

Kollaps
22.07.2014, 15:09
Entschuldige, ja, ich meinte natürlich Index/Vergleich (Bis jetzt habe ich die INDEX-Funktion noch nicht anders verwendet, also mit Vergleich, darum lass ich das meistens Weg.)
Ich weiß nicht warum, aber ab (ich sage mal) 30 Datensätzen macht der SVerweis bei mir nicht mehr das, was er machen soll, nie, alles darunter ist kein Problem.


Index:
=WENN($G$2="";"";INDEX(Personalnummern!A:C;VERGLEICH($G$2;Personalnummern!B:B;0);3))

SVerweis:
=WENN($G$2="";"";SVERWEIS($G$2;Personalnummern!A:C;3))

SVerweis sagt #NV Index sagt Christoph (Wie es sein soll).

EarlFred
22.07.2014, 15:17
Hallo,

beim Sverweis fehlt die Angabe von Bereich_Verweis! Das ist beinahe das wichtigste Argument der Formel!
=WENN($G$2="";"";SVERWEIS($G$2;Personalnummern!A:C;3;0))

Beim Vergleich steht's hingegen da (heißt dort zwar "Vergleichstyp" und arbeitet etwas anders, bei der Angabe von 0/FALSCH aber gleichwertig zum Sverweis):
VERGLEICH($G$2;Personalnummern!B:B;0)

Bei der einen Formel suchst Du übrigens in Spalte A, bei der anderen in Spalte B.

Grüße
EarlFred

Kollaps
22.07.2014, 15:20
Oh :D
Okay.
Das stand als Optional da? :D

Aber selbst, wenn ich 0 oder "FALSCH" (wie es mir Excel vorgibt) da eintrage sagt er #NV :D
___________________

Okay. Mein Fehler. Tabelle in dem Fall falsch herum angelegt. (bzw. aus dem System gezogen und nicht umsortiert.)
(Noch ein Grund warum ich Index-Vergleich lieber mag :D )
___________________
Ich werde da das nächste Mal drauf achten und sage noch einmal Bescheid, sollte das wieder kommen.
Das hab ich nämlich wie gesagt dauernd. Selbst bei Tabellen in der Schule, die aus dem Bildungszentrum kommen. (Ich schau mir die mal genauer an :D )

Mc Santa
22.07.2014, 15:21
Hallo,

ich würde ja eher sagen, es liegt daran, dass Vergleich in Spalte B sucht und Sverweis in Spalte A...

VG

EarlFred
22.07.2014, 15:25
dann siehe hier:
Bei der einen Formel suchst Du übrigens in Spalte A, bei der anderen in Spalte B.

Das stand als Optional da?
Dann musst Du aber auch mit dem Vorgabewert leben - der muss nicht immer der richtige sein.

Grüße
EarlFred

Mc Santa
22.07.2014, 15:31
Hallo,

ich glaube zwar nicht, dass es sehr relevant ist, aber mit Sverweis sollte es auch gehen:
=WENN($G$2="";"";SVERWEIS($G$2;Personalnummern!B:C;2;0))

VG

Kollaps
22.07.2014, 15:34
Auf der Arbeit arbeite ich denke ich mal mit dem Index-Vergleich weiter, da fällt mir das immer auf, bzw. muss ich nicht alles drei mal überdenken.

Da es eh ziemlich schnell gemacht werden muss, bietet sich das dann an.

Ich werde mir das mit dem SVerweis trotzdem nochmal zu Herzen nehmen und schauen, was ich da mit den Tabellen eigentlich versuche herauszufinden, bzw. wonach die gegliedert sind.

Danke für den Hinweis, ich wäre da im Leben nicht drauf gekommen!! :D

Kollaps
22.07.2014, 15:36
Ja, funktioniert.

Habe ich eben auch schon ausprobiert, als ihr das geschrieben habt, dass ich in der falschen Spalte suche.

Dankeschön :)