Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1196to1200
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

wenn Bedingung erfüllt, String in Grossbuchst umw.

wenn Bedingung erfüllt, String in Grossbuchst umw.
Peter
Guten Abend
Ich möchte mit
Privat Sub Workbook_SheetChange(ByVal Sh as Object, ByVal Target as Range)
Eingaben prüfen und wenn gewisse Bedingungen erfüllt sind, diese in Grossbuchstaben umwandeln (UCASE).
Bedingungen:
Sh: Tabellenname darf nur aus Zahlen bestehen, z.b. "0000" oder "51994", etc.
Target.Row => 5 und Target Row = Target.Column muss einer der Spaltennummern entsprechen, welche in verschiedenen benannten Zellen enthalten sind.
Beispielsweise
Range("ABC").Value = 5
Range("XA5").Value = 17
Range("_ABB").Value = 19
.... (etwas insgesamt 7)
Mir ist nicht klar, wie ich diese Bedingungen in einen Code verpacken kann.
Kann mir jemand helfen?
Danke und Gruss, Peter

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Formulierung von Abhängigkeiten
27.01.2011 20:43:03
Abhängigkeiten
Hi Peter,
ich weiß nicht, ob ich dich richtig verstanden habe, insbesondere der Teil
"Target.Column muss einer der Spaltennummern entsprechen, welche in verschiedenen benannten Zellen enthalten sind.
Beispielsweise
Range("ABC").Value = 5..."
ist mir nicht klar.
Heißt Range("ABC").Value = 5, dass in [ABC] eine 5 steht, die Spaltennr. sein kann,
oder soll hier mit Range("ABC").Value = 5 ein 5 in die Zelle geschrieben werden?
Probier das mal aus (wobei die Fkt. in ein normales Modul kann):

Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim arrN, ii As Long
If Not HatNichtZiffern(Sh.Name) Then Exit Sub
If Target.Count = 1 Then Exit Sub
If Target.Row >= 5 And Target.Row 
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Formulierung von Abhängigkeiten
27.01.2011 21:07:49
Abhängigkeiten
Halllo Erich
Bei diesen benannten Zellen trifft beides zu. Wenn sich beispielsweise Range("ABC") auf C2 (=in Spalte 3) bezieht, ist in dieser Zelle auch eine 3 eingetragen.
Ich habe eine Datei hochgeladen (in welcher dein Code nun enthalten ist). Hier müsste in der Tabelle "0001", wenn ich in den gelben Bereich etwas hineinschreibe, dies in Grossbuchstaben umgewandelt werden (allerdings müsste ich noch eine Einschränkung machen: nur bei der Tabelle "0000" soll - obwohl auch numerisch - nichts passieren.
Die Eingaben im gelben Bereich erfolgen sowohl einzeln als auch mehrere Zellen miteinander.
Wenn ich richtig verstehe, schliesst die Codezeile
If Target.Count = 1 Then Exit Sub
Einzeleinträge aus. Diese sollten jedoch auch umgewandelt werden.
Gäbe es auch die Möglichkeit, anstelle dem Schreiben der Namen in einen Array diese in einer Tabelle, ab Zelle A1 fortlaufend in Spalte A einzutragen?
Vielen Dank für die Hilfe und freundlicher Gruss, Peter
https://www.herber.de/bbs/user/73287.xls
Anzeige
nun etwas weniger falsch, hoffe ich
28.01.2011 08:08:09
Erich
Hi Peter,
da hatte ich in den ersten Zeilen wohl die Pferde gewechselt.
(Statt If Target.Count = 1 Then ... End If habe ich If Target.Count = 1 Then Exit Sub geschrieben,
Es hätte dann aber If Target.Count > 1 Then Exit Sub heißen müssen.)
Noch zwei Bemerkungen:
- Die Routine verarbeitet nur Eingaben in Einzelzellen. Ist das OK so?
- Der Name von 0001!F4 ist XY5, nicht XA5. Deshalb tut sich da nichts.
- Sollte auch in Blatt AB33 etwas passieren? Der Blattname besteht aber nicht nur aus Ziffern.
Hier eine neue Version bei der die Namenliste aus DEF!A:A gelesen wird:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim arrN, lngN As Long, ii As Long
If HatNichtZiffern(Sh.Name) Then Exit Sub          ' nur Ziffern
If 1 * Sh.Name = 0 Then Exit Sub                   ' nicht "000"
If Target.Count > 1 Then Exit Sub                  ' nur Einzelzellen
If Target.Row >= 5 And Target.Row 
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: nun etwas weniger falsch, hoffe ich
28.01.2011 09:17:10
Peter
Hallo Erich
Das ist prima und funktioniert so einwandfrei.
Zu deinen Bemerkungen:
A) Verarbeitung nur Einzeleingaben
- wäre super, wenn auch eine Umwandlung erfolgen würde, falls gleichzeitig mehrere Strings in die entsprechenden Bereiche kopiert werden - weiss allerdings nicht, ob das mit einem vernünftigen Aufwand zu bewerkstelligen ist
B) ja, da habe ich einen falschen Namen vergeben
C) nein, in AB33 muss natürlich nichts passieren
Für den Fall, dass zu A) "nicht nur Einzeleingaben umwandeln" eine Lösung möglich ist, lasse ich den Beitrag noch offen.
Nochmals vielen Dank und freundlicher Gruss, Peter
Anzeige
Danke für deine Rückmeldung, ...
28.01.2011 12:02:34
Erich
Hi Peter,
... da poste ich gern die Erweiterung zum Testen:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngW As Range, rngA As Range, rngC As Range, arrN, lngN As Long, ii As Long
If HatNichtZiffern(Sh.Name) Then Exit Sub          ' nur Ziffern
If 1 * Sh.Name = 0 Then Exit Sub                   ' nicht "000"
With Sheets("DEF")                        ' Namenliste in "DEF"
lngN = .Cells(.Rows.Count, 1).End(xlUp).Row  ' Anzahl Namen
arrN = .Cells(1, 1).Resize(lngN)             ' Namen aus Sp. A
End With
' Wirkbereich ermitteln
Set rngW = Sh.Cells(5, Range(arrN(1, 1)).Value).Resize(55)
For ii = 2 To UBound(arrN)
Set rngW = Union(rngW, Sh.Cells(5, Range(arrN(ii, 1)).Value).Resize(55))
Next ii
If Intersect(Target, rngW) Is Nothing Then Exit Sub
' geänd. Zellen im Wirkbereich
Application.EnableEvents = False
For Each rngA In Intersect(Target, rngW).Areas
For Each rngC In rngA
rngC = UCase$(rngC)
Next rngC
Next rngA
Application.EnableEvents = True
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Danke für deine Rückmeldung, ...
28.01.2011 13:58:15
Peter
Hallo Erich
Vielen Dank, ich habe das getestet. Ich habe ein paar kleine Anpassungen gemacht.
A) Der Zeilenbeginn (5) übergebe ich jetzt mit [zeStart] und das Ende (59) mit [zeEnde]
B) Beim Resize muss ich nach meinem Verständnis die Anfangsposition wieder in Abzug bringen und 1 dazuzählen, sonst funktioniert die Umwandlung über den Bereich hinaus.
Jetzt habe ich noch ein Anliegen: Anstelle die Namen der benannten Zellen in der der Tabelle ab A1 einzutragen, möchte ich diese in einem ein-spaltigen Bereich, den ich mit "spUCase" benannt habe eintragen, wobei dieser Bereich am Ende noch ein paar Zeilen hat, wo nichts eingetragen ist.
Ich habe versucht, dies wie folgt zu lösen, jedoch ohne Erfolg:
'' lngN = Application.WorksheetFunction.CountA(Range("spUCase")) - [spUCase].Rows.Count
'' arrN = Range("spUCase").Resize(lngN)
Vielen Dank und Gruss, Peter
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngW As Range, rngA As Range, rngC As Range, arrN, lngN As Long, ii As Long
If HatNichtZiffern(Sh.Name) Then Exit Sub          ' nur Ziffern
If 1 * Sh.Name = 0 Then Exit Sub                   ' nicht "000"
With Sheets("DEF")                        ' Namenliste in "DEF"
lngN = .Cells(.Rows.Count, 1).End(xlUp).Row  ' Anzahl Namen
arrN = .Cells(1, 1).Resize(lngN)             ' Namen aus Sp. A
End With
' Wirkbereich ermitteln
Set rngW = Sh.Cells([zeStart], Range(arrN(1, 1)).Value).Resize([zeEnd] - [zeStart] + 1)
For ii = 2 To UBound(arrN)
Set rngW = Union(rngW, Sh.Cells([zeStart], Range(arrN(ii, 1)).Value).Resize([zeEnd] - [ _
zeStart] + 1))
Next ii
If Intersect(Target, rngW) Is Nothing Then Exit Sub
' geänd. Zellen im Wirkbereich
Application.EnableEvents = False
For Each rngA In Intersect(Target, rngW).Areas
For Each rngC In rngA
rngC = UCase$(rngC)
Next rngC
Next rngA
Application.EnableEvents = True
End Sub

Anzeige
mit CountA
28.01.2011 17:03:15
Erich
Hi Peter,
das könnte so gehen:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngW As Range, rngA As Range, rngC As Range, arrN, lngN As Long
Dim lngZ As Long, ii As Long
If HatNichtZiffern(Sh.Name) Then Exit Sub          ' nur Ziffern
If 1 * Sh.Name = 0 Then Exit Sub                   ' nicht "0...0"
With Sheets("DEF")                        ' Namenliste in "DEF"
lngN = Application.WorksheetFunction.CountA(Range("spUCase"))
arrN = Range("spUCase").Resize(lngN)
End With
' Wirkbereich ermitteln
lngN = Range("zeStart")                      ' 1. Zeile
lngZ = Range("zeEnd") - lngN + 1             ' Anz. Zeilen
Set rngW = Sh.Cells(lngN, Range(arrN(1, 1))).Resize(lngZ)
For ii = 2 To UBound(arrN)
Set rngW = Union(rngW, Sh.Cells(lngN, Range(arrN(ii, 1))).Resize(lngZ))
Next ii
If Intersect(Target, rngW) Is Nothing Then Exit Sub
' geänd. Zellen im Wirkbereich
Application.EnableEvents = False
For Each rngA In Intersect(Target, rngW).Areas
For Each rngC In rngA
rngC = UCase$(rngC)
Next rngC
Next rngA
Application.EnableEvents = True
End Sub
Zu deinem Ansatz:
[spUCase].Rows.Count ist die Anzahl der (gefüllten odeer nicht gefüllten) Zeilen des Bereichs.
Die spielt abder doch gaer keine Rolle.
Interessant ist dagegen die Anzahl gefüllter Zellen des Bereichs:
WorksheetFunction.CountA(Range("spUCase"))
Die kommt in lngN.
Range("zeEnd") - Range("zeStart") + 1 ist ja für alle Teilbereiche gleich,
kann also besser vor der ii-Schleife berechnet werden statt x-mal in der Schleife.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: mit CountA
02.02.2011 17:33:41
Peter
Hallo Erich
Vielen Dank für die Antwort. Ich bin leider noch nicht dazu gekommen, die letzten Anpassungen vorzunehmen. Da der Eintrag wohl bald ins Archiv wechselt und ich mich dann nicht mehr melden kann, bedanke ich mich mal für die Hilfe. Falls eine weitere Frage zu diesem Thema auftaucht, werde ich wohl einen neuen Thread eröffnen.
Gruss, Peter
Danke für deine Rückmeldung! Grüße Erich (owT)
02.02.2011 17:43:45
Erich
AW: nun etwas weniger falsch, hoffe ich
28.01.2011 11:48:37
Peter
Hallo Erich
Ich habe den Code nun in meiner Datei eingebaut und habe versucht, die Variablen lngN und arrN "anders" abzufüllen - und bin gescheitert.
Deine Version:
With Sheets("DEF") ' Namenliste in "DEF"
lngN = .Cells(.Rows.Count, 1).End(xlUp).Row ' Anzahl Namen
arrN = .Cells(1, 1).Resize(lngN) ' Namen aus Sp. A
End With
Versuchte Anpassung:
lngN = Application.WorksheetFunction.CountA(Range("spUCase")) - [spUCase].Rows.Count
arrN = Range("spUCase").Resize(lngN)
Ich habe die Variablen in einer bestehenden Tabelle eingegeben und den Eingabebereich mit "spUCase" benannt. Da es im Eingabebereich noch leere Zeilen hat, ermittle ich deren Anzahl und weise sie lngN zu.
Dann ging ich davon aus, dass ich den ganzen Range "spUCase" der Variable arrN zuweisen kann und dann mit Resize die leeren Zeilen eliminiere.
Was mache ich da falsch?
Gruss, Peter
Anzeige

351 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige