Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1148to1152
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

Formel automatisch einfügen

Formel automatisch einfügen
claudia
Hallo zusammen,
ich nutze bislang folgenden Code, der reibungslos klappt.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Set Bereich = Intersect(Range("i2:i1000"), Target)
If Not Bereich Is Nothing Then
Application.EnableEvents = False
With Bereich
ActiveSheet.Unprotect
.Offset(0, 2).Value  = "0:30"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
Application.EnableEvents = True
End If
End Sub

Nun möchte ich aber, wenn ich in der Spalte I etwas ändere, folgende Formel in die Spalte K eintragen.
ActiveCell.FormulaR1C1 = _
"=IF(R[1]C[-1] = ""Excel"","".xls"",IF(R[1]C[-1] = ""Word"","".doc"",IF(R[1]C[-1] = ""Powerpoint"","".ppt"",IF(R[1]C[-1] = ""Outlook"","".msg"",""""))))"
Ich weiß aber nicht, wie das geht. Bei mir kommt immer statt der Formel das Ergebnis falsch.
Manno!
Wer kann mir helfen?
LG
Claudia
Formel automatisch am richtigen Ort einfügen
14.04.2010 19:49:13
Luc:-?
Hi Claudia,
…wenn ich in der Spalte I etwas ändere, folgende Formel in die Spalte K…, also liegt die normalerweise mit Target identische ActiveCell in Spalte I, wo dann eigentl auch die Fml eingetragen wdn würde. Hier ist überflüssigerweise auch noch Bereich mit Target identisch, denn der kann nach Intersect nur Nothing oder Target sein. Die Offset-Operation verändert Target (⇒ActiveCell) nicht, da die Events-Reaktion zeitweise abgeschaltet wurde.
Außerdem finde ich die vom Makro-Recorder herrührende Verwendung von R1C1 einfach nur grässlich, denn die ist (fast) nur dann sinnvoll, wenn Excel auch auf Z1S1 eingestellt ist. Dem VBA-Standard entspricht das nicht!
Richtig müsste Target.Offset(0, 2) = … sein…
Außerdem würde deine Fml im TabBlatt bei dt Excel und Einstellung Z1S1 so erscheinen…
=WENN(Z(1)S(-1) = "Excel";".xls";WENN(Z(1)S(-1) = …
Wenn die Fml (richtig) bspw in Zelle K2 ankommen würde, würde sie sich so relativ auf Zelle J3 beziehen. Wenn das deine Absicht war, wäre die Fml sonst ok…
Gruß Luc :-?
Anzeige
AW: Formel automatisch am richtigen Ort einfügen
14.04.2010 20:34:20
Claudia
Hallo Luc,
ich habe leider gar nichts verstanden.
Ich habe aber meine Datei hochgeladen.
https://www.herber.de/bbs/user/69087.xls
Vielleicht kannst Du mir da zeigen, was ich machen muss. Ich bin kein VBA-Profil, sondern suche mir im Archiv was zusammen bzw. bitte um Hilfe!.
Vielen Dank!
LG
Claudia
offen vergessen
14.04.2010 21:09:15
Claudia
Warum so kompliziert u.VBA,...
15.04.2010 00:55:57
Luc:-?
…Claudia,
wenn du doch offensichtlich davon gar nicht genug verstehst? Das ist dann immer ein Risiko und du bist von anderen abhängig…!
Die Fml in K muss doch erst erscheinen, wenn in I und J etwas eingetragen wurde! (Nebenbei, die Werte für die Gültigkeit scheinst du einer anderen Mappe zu entnehmen → #BEZUG!) Da kann man doch Xl so einstellen, dass die Fml in K automatisch übernommen wird, wenn keine Leerzellen bleiben. Falls in I nein eingetragen wird und deshalb dann auch nichts in J, würde das wohl nicht fkt. Deshalb wäre es wohl angeraten, I und J zu tauschen, damit immer etwas in der Zelle vor der Fml steht.
Was die Ereignisprozedur betrifft und ich dir zuvor sagen wollte ist, die Fml enthält einen falschen Bezug — nämlich auf die (leere) Zelle in der Folgezeile (richtig wäre (RC[-1]) und der Eintragsort dürfte nicht stimmen. Richtig wäre wohl Target.Offset(0, 2).FormulaR1C1 statt ActiveCell.FormulaR1C1
Gruß Luc :-?
Anzeige
AW: offen vergessen
15.04.2010 01:14:32
fcs
Hallo Claudia,
die Zuweisung der Formel schaut dann wie folgt aus:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Set Bereich = Intersect(Range("i2:i1000"), Target)
If Not Bereich Is Nothing Then
Application.EnableEvents = False
With Bereich
ActiveSheet.Unprotect
.Offset(0, 2).FormulaR1C1 = _
"=IF(RC[-1] = ""Excel"","".xls"",IF(RC[-1] = ""Word"","".doc"",IF(RC[-1] " _
& "= ""Powerpoint"","".ppt"",IF(RC[-1] = ""Outlook"","".msg"",""""))))"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
Application.EnableEvents = True
End If
End Sub
Gruß
Franz
Anzeige
@ Franz: Vielen Dank für Deine Hilfe! :-)
15.04.2010 12:33:43
Claudia
Dich merk ich mir! :-( owT
15.04.2010 16:18:25
Luc:-?
:-?
Abgesehen von deinem unpassenden,...
15.04.2010 16:25:53
deinem
…weil unbesehen übernommenen Betreff, Franz,
hättest du, wenn du mit meinen Vorgaben einer offensichtlich Ahnungslosen eine irgendwie zusammengeklaubte EventProc korrigierst, auch noch die nicht nur von mir als überflüssig monierte, sondern tatsächlich sinnlose Variable Bereich beseitigen können. So entspricht die Proc wohl kaum deinem Level… ;->
Gruß Luc :-?
AW: Probleme wenn Target mehrspaltig!
15.04.2010 17:54:04
fcs
Hallo Luc,
ich hatte auch erst gedacht, dass Target.Offset(0, 2)......
reicht. Aber es gibt Probleme, wenn Target nicht nur eine Zelle in Spalte I ist, sondern wenn eine Zeile kopiert wird oder eine Markierung über mehrer Spalten inklusive Spalte I kopiert und dann eingefügt wird.
Mit der Set Bereich = Intersect(... )- Anweisung enthält Bereich dann nur die Zellen aus Target, die in Spalte I liegen und die Formeln werden korrekt eingefügt. Alternativ müsste man in die Prüfung von Target (Columns.Count=1, etc) mehr Aufwand stecken, um gegen alle Eventualitäten gewappnet zu sein.
Um deinen Vorschlag, "RC[-1]" in der Formel zu verwenden, kam ich dann hier nicht herum, da Excel hier wenig Spielraum läßt. "R[0]C[-1]" hätte ich noch nehmen können.
Deine Abneigung gegen die R1C1-Schreibweise unter VBA für das Einfügen von Formeln kann ich auch nicht nachvollziehen.
1. So gibt es keine Probleme bei unterschiedlichen Länder/Spracheinstellungen.
2. Versuche die Formel doch mal in der A1-Schreibweise im Code abzubilden. Da wird dir aber auch schnell schwindlig. Da muss du nämlich den Ausdruck zerpflücken und für die Zeilennummer immer " & Target.Row & " oder einen anderen passenden Ausdruck einfügen.
      .Offset(0, 2).Formula = _
"=IF(J" & Target.Row & " = ""Excel"","".xls"",IF(J" & Target.Row & " = ""Word"","".doc"" _
," _
& "IF(J" & Target.Row & " = ""Powerpoint"","".ppt"",IF(J" & Target.Row & "= ""Outlook"", _
"".msg"",""""))))"
Da gefällt mir die kurze R1C1-Schreibweise dann deutlich besser.
Gruß
Franz
Anzeige
Ja, mit dem Letzten hast du recht, das ist...
15.04.2010 21:23:38
Luc:-?
…fast die einzige sinnvolle Anwendung von R1C1, Franz,
zumindest bei solchen fmlstandortabhängigen Bezügen (deshalb habe ich das auch beibehalten), wenn ich auch immer erst überlegen muss, wie das war — Claudia hat's ja offensichtl auch nicht kapiert (genau so wenig wie die Proz oder allgem Höflichkeitsregeln)…
Im hier fktsrelevanten Fall sollte Target nur 1 Zelle repräsentieren. Andere Fälle, wie die von dir genannten, schließe ich bei Vglbarem ganz aus, d.h., die Proc wird sofort (ohne Aktion) wieder verlassen.
Eigentl habe ich etwas dagg, Leuten, die nur 'ne schnelle, weitestgehend eigendenk-freie Lösung suchen, mit EventProcs unter die Arme zu greifen, aber wenigstens hatte die hier, trotz aller Ungereimtheiten, einen Kettenreaktionsschutz…
Gruß Luc :-?
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige