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

VBA

VBA
PeterT.
Hallo Ihr Lieben,
Bisher habe ich die Formeln in Exel eingetragen, versuche es nun mit VBA. Da brauche ich mal eure Hilfe.
Was ich möchte: Wenn in Spalte E oder F ein Betrag steht, soll in G die Formel in der vorherigen Zeile kopiert und darunter eingetragen werden.
Das habe ich versucht:

Private Sub Summe(ByVal Target As Excel.Range, Cancel As Boolean)
Dim iCol As Integer, iCount As Integer, n As Boolean
n = True
If WorksheetFunction.CountA(Columns(n, 5)) = True Or (Columns(n, 6)) = True Then
For iCol = 7 To 7
If WorksheetFunction.CountA(Columns(iCol)) > iCount Then
iCount = WorksheetFunction.CountA(Columns(iCol))
End If
Next iCol
Else
Exit Sub
Range("G5:G65536").FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
Range("A65536").End(xlUp).Offset(1, 0).Select
End If
End Sub

Was macht das Macro? NICHTS! Kein Fehler oder irgend was.
Wenn ich es ab For iCol.... laufen lasse, trägt es die Formel bis in die letze G Zeile ein.
Schuster nun schon 2 Tage dran rum und weiss nicht weiter.
vielen Dank im Voraus
PeterT

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

Betreff
Benutzer
Anzeige
Code neu frisiert :-)
30.01.2011 15:22:34
Reinhard
Hallo Peter,
ich hab mir erlaubt deinen Code lesbarer zu machen. Hab jetzt noch nicht getestet,
Was mir auf den ersten Blick auffällt, im Else Zweig kannste alles nach Exit Sub vergessen.
Dann dieses n= True und Columns(n, 6) = True
M.W. ist True minus 1 und False 0
Dazu kommt, wieso gibst du Columns ZWEI Argumente,Parameter?
Prrüf mal an der Stelle.
Private Sub Summe(ByVal Target As Excel.Range, Cancel As Boolean)
Dim iCol As Integer, iCount As Integer, n As Boolean
n = True
If WorksheetFunction.CountA(Columns(n, 5)) = True Or (Columns(n, 6)) = True Then
For iCol = 7 To 7
If WorksheetFunction.CountA(Columns(iCol)) > iCount Then
iCount = WorksheetFunction.CountA(Columns(iCol))
End If
Next iCol
Else
Exit Sub
Range("G5:G65536").FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
Range("A65536").End(xlUp).Offset(1, 0).Select
End If
End Sub

Gruß
Reinhard
Anzeige
AW: Code neu frisiert :-)
30.01.2011 16:54:00
PeterT.
Erstmal Danke für die schnelle Antwort und Lesbarkeit.
Zwei Argumente, weil es ja in Spalte E & F nachsehen soll, wenn dann E oder F Wahr, dann Spalte G letzte Zeile mit Formel, kopieren und eine Zeile darunter einfügen. Ansonsten soll er es ja verlassen, wenn in E oder F nichts ist, also Exit.
Was Du mit M.W. meinst weiß ich nicht.
Gruß
Peter
AW: Code neu frisiert :-)
30.01.2011 17:36:35
Reinhard
Hallo Peter,
ich weiß jetzt nicht genau was du da nicht verstehst, aber kann man ja rausfinden
m.E. = meines Erachtens
M.W.= meines Wissens
Heutzutage schreiben da andere IMO IMHO, kannste ergoogeln, ist ähnlich.
M.W. ist True minus 1 und False 0
Damit meine ich du setzt n auf True also auf minus 1
Dann steht da bei deinem Columns(n,6)
Columns(-1,6)
Das kapier ich nicht.
Und zwei Parameter bei Columns kenne ich auch nicht, ich kenne sowas:
Columns("E:F")
Gruß
Reinhard
Dazu kommt, wieso gibst du Columns ZWEI Argumente,Parameter?
Anzeige
AW: Code neu frisiert :-)
30.01.2011 17:55:36
PeterT.
Hallo Reinhard,
Danke für die Antwort.
Nun weiß ich auch was M.W. u. m.E heißt, danke.
Wieso ist True minus1? Dachte immer True = Wahr u. False = Falsch?
Habe es mal rausgenommen:
Private Sub Summe(ByVal Target As Excel.Range, Cancel As Boolean)
Dim iCol As Integer, iCount As Integer, n As Boolean
If WorksheetFunction.CountA(Columns("E:F")) > 0 Then
For iCol = 7 To 7
If WorksheetFunction.CountA(Columns(iCol)) > iCount Then
iCount = WorksheetFunction.CountA(Columns(iCol))
End If
Next iCol
Range("G5:G65536").FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
Range("A65536").End(xlUp).Offset(1, 0).Select
End If
End Sub
Passiert aber immer noch nichts!!
Komisch ist nur wenn ich das raus nehme, macht das Macro es ja, bloss sofort bis zur letzten Zeile in G.
If WorksheetFunction.CountA(Columns("E:F")) > 0 Then
Es soll es aber nur, wenn in E o. f was steht, eben Zeile für Zeile.
Ich mache irgendwie ein Gedankenfehler, weiß bloss nicht wo?
Gruß
Peter
Anzeige
OT, nur was zu True/False
30.01.2011 18:08:04
Reinhard
Hallo Peter,
teste mal dieses:
Sub tt()
MsgBox True
MsgBox False
MsgBox True * 1
MsgBox False * 1
End Sub

Das gilt nur in Vba, in Excel ist Wahr plus 1 und Falsch Null.
Das kann man ggfs. so ausnutzen, anstatt
=wenn(A1>5;0;7)
=(A1>5)*7
Gruß
Reinhard
AW: OT, nur was zu True/False
30.01.2011 18:17:09
PeterT.
Hallo Reinhard,
Habe es versucht..und verstanden. Hilft mir bei meinem Problem aber nicht weiter.
Das hatte ich auch schon versucht:
Private Sub Kopieren()
Dim i As Integer
i = Selection.Rows - 1
Selection.FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
Range("A65536").End(xlUp).Offset(1, 0).Select
End Sub
Klappt gut. Problem ist nur , dass Macro machts in jeder Spalte. :((
Gruß
Peter
Anzeige
AW: OT, nur was zu True/False
30.01.2011 18:17:54
PeterT.
Hallo Reinhard,
Habe es versucht..und verstanden. Hilft mir bei meinem Problem aber nicht weiter.
Das hatte ich auch schon versucht:
Private Sub Kopieren()
Dim i As Integer
i = Selection.Rows - 1
Selection.FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
Range("A65536").End(xlUp).Offset(1, 0).Select
End Sub
Klappt gut. Problem ist nur , dass Macro machts in jeder Spalte. :((
Gruß
Peter
Naja, alles ziemlicher Kohl voll ungeeigneter...
31.01.2011 02:53:05
Luc:-?
…Maßnahmen und kaum verstandener Code-Elemente, Peter,
was bei VBA nein ja auch zu erwarten ist. Zuerst müsste mal geklärt wdn, wann und wie das eingesetzt wdn soll. Als private wird die Prozedur nämlich nicht im Makro-Assi angezeigt! Außerdem verhindert das auch die nicht-optionale Parametrierung, die dann auch noch nicht vom Typ Variant ist. Sinn macht das also nur bei irgendeiner Art von Automatik und da auch nicht immer. Sicher hast du eine (unverstandene) Ereignisproz als Vorlage benutzt (man kann's noch erkennen!)…
Reinhard hat ja nun schon das Grobe erledigt. Falls die Werte in E bzw F manuell eingetragen wdn sollen, kann auch das Folgende schon ausreichen. Den Code in das Dokument-Klassenmodul der betroffenen Tabelle (quasi auf ihre Rückseite) einkopieren…
Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsEmpty(Target) And Not Intersect(Target, Range("E:F")) Is Nothing Then _
Cells(Target.Row, 7).FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
End Sub
Wenn die Werte schon vorhanden sind bzw von Formeln erzeugt wdn und deshalb das Ganze per Button oder sonstigem Aufruf nachträglich erledigt wdn soll bzw muss, kann folgende Form gewählt und in ein normales Modul eingetragen wdn…
Sub FmlSetzen()
Dim berZ As Range
For Each berZ in ActiveSheet.UsedRange.Rows
With berZ
If Not IsEmpty(.Cells(5)) Or Not IsEmpty(.Cells(6)) Then _
.Cells(7).FormulaR1C1 = "=IF(RC[-2]+RC[-1]=0,"""",R[-1]C+RC[-2]-RC[-1])"
End With
Next berZ
End Sub
Damit sollte das dann auch in diesem Falle klappen…
Der Code erklärt sich im Prinzip selbst — b.Bedarf einfach mal alles in der VBE-Hilfe nachschlagen!
Für die einzutragende Fml bist du selbst verantwortlich!
Gruß Luc :-?
Anzeige
DANKE!!
31.01.2011 12:17:37
PeterT.
Hallo Luc,
Vielen vielen Dank!!!
Habe mir ein 900 S. VB Buch gekauft und ein VBA Buch :-))
Verstanden habe ich noch fast nichts, aber ich lerne!!
Gruß
Peter
Na, dann viel Erfolg! Gruß owT
01.02.2011 15:40:07
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige