Excel 2011: Bei Klick auf Button Makro je nach Zellinhalt ausführen

Ja...so funktioniert das. Damit ist das Thema wohl tatsächlich abgehakt und wir kommen zur letzten Frage (hab ich da ein Tränchen im Auge?:D ), die ich der Einfachheit halber gleich hier rein schreib:

Wie sage ich einem Makro, dass es den Zelleninhalt kopieren soll, statt der Formel?

Wie immer: Merci :)
 
In dem du nicht die Zelle kopierst mit
Range("A1").Copy Destination:=Range("A2")
sondern in dem du den Wert übernimmst:
Range("A2") = Range("A1")
 
Wie immer ist das Beispiel etwas komplexer. Der Code:

Code:
 For Each rZelle In rBereich.Cells
    For i = 0 To 2 'die aktuelle Zellenumgebung spaltenweise durchlaufen
      If rZelle.Offset(0, i) = "" Then 'wenn die Zelle bei Offset(i, 0) leer ist, ...
        rKopie.Copy Destination:=rZelle.Offset(0, i) 'dann kopiere die Werte nach Offset(i, 0) ...
        Exit For 'und beende die Schleife
      End If
    Next i
  Next rZelle

Daraus habe ich gemacht:

Code:
 For Each rZelle In rBereich.Cells
    For i = 0 To 2 'die aktuelle Zellenumgebung spaltenweise durchlaufen
      If rZelle.Offset(0, i) = "" Then 'wenn die Zelle bei Offset(i, 0) leer ist, ...
        Range(rKopie) = Range(rZelle.Offset(0, i)) 'dann kopiere die Werte nach Offset(i, 0) ...
        Exit For 'und beende die Schleife
      End If
    Next i
  Next rZelle

Und natürlich funktioniert es nicht :D. Wo ist der Fehler?


EDIT: Und leider noch eine Frage zur Zeilenproblematik ^^.

Ich hab das ganze in meine Tabelle übertragen

Sub auswahlZ()
Dim rAuswahl As Range
Dim sZiel As String
Dim iZeilen As Integer
Dim rKategorie As Range
Dim rUebertrag As Range
Set rAuswahl = Range("C1")
Set rUebertrag = Range("B4:N4")

rUebertrag.Copy 'A4 bis E4 kopieren
sZiel = Range("B:B").Find(what:=rAuswahl, lookat:=1).Offset(2, 0).Address 'ausgewählte Kategorie in Spalte A suchen und Adresse 2 Zeilen darunter speichern (= Einfügebereich)
iZeilen = Range(sZiel).CurrentRegion.Rows.Count 'Zeilenanzahl im Einfügebereich zählen
Range(sZiel).Offset(iZeilen - 1, 0).Insert 'Abhängig von vorhandener Zeilenanzahl die neuen Werte mit Offset(iZeilen, 0) darunter einfügen
Application.CutCopyMode = False

End Sub

Das ganze soll zugleich noch in eine zweite Tabelle in einem anderen Tabellenblatt eingefügt werden. Dazu muss ich den ganzen Code vermutlich nochmal kopieren. Meine Frage: Oben lege ich ja die Zellen fest. Wie muss ich die Zellen umschreiben, damit das Programm weiss, dass sie sich in einem anderen Tabellenblatt befinden?

Merci, merci, merci :)
 
Zuletzt bearbeitet:
fiedlator schrieb:
Und natürlich funktioniert es nicht :D. Wo ist der Fehler?
Range erwartet einen String; bspw. Range("A1").

Du schreibst Range(rKopie) - rKopie ist aber selbst bereits eine Range, kein String (zumindest in obiger Datei). Selbes gilt für rZelle.Offset(0, i)

Hab mal ein Beispiel gebastelt, da siehst du, was wie möglich ist: Anhang anzeigen range.rar

Wie muss ich die Zellen umschreiben, damit das Programm weiss, dass sie sich in einem anderen Tabellenblatt befinden?
Wenn du mit mehreren Tabellen arbeitest, solltest du die einzelnen Tabellenblätter im Makro zu Beginn definieren.

Du könntest auch bspw. vor eine Range immer das Tabellenblatt schreiben, damit klar ist, wo du arbeitest:
Worksheets("Tabelle1").Range("A1").Value

Leichter ist es aber die Tabellenblätter in Variablen zu speichern, so wie es bisher schon mit den Ranges gemacht wurde: Anhang anzeigen sheets.rar
Dim wksTab1 as Worksheet
Dim rBereich1 as Range

Set wksTab1 = Worksheets("Tabelle1")
Set rBereich1 = Range("A1")

wksTab1.rBereich1.Value



'oder
Set wksTab1 = Worksheets("Tabelle1")
Set rBereich1 = wksTab1.Range("A1")

rBereich1.Value
 
Zuletzt bearbeitet:
Juuhuu...ich bins wieder :).

Alles funktioniert wie es soll....deluxe! Eine Frage habe ich jedoch noch. Der Windows Rechner brauch für das Durchgehen der Checkboxen und das dazugehörige ein- und ausblenden der Zeilen etwa 1 sek. Der Mac braucht hierfür so 4 Sekunden...das finde ich schonmal seltsam, zumal der Mac wesentlich mehr auf der Haube hat. Aber wie auch immer...meine Frage: Die Anzahl möglicher Kombination der Check-Boxen ist ja alles in allem begrenzt.

Gibt es denn, wenn das Programm vollständig ist, eine Möglichkeit, die einzelnen Kombinationen durchrechnen zu lassen und abzuspeichern? So dass Excel nur auf Grundlage der Check-Boxes ein bestimmtes "Programm" ausführt, und so die Reaktionszeit verkürzt wird?

merci :)
 
Hm, dazu müsstest du so oder so jede Checkbx auf ausgewählt/nicht ausgewählt prüfen.
Von daher wird das nichts bringen. Oder ich hab dich falsch verstanden.
 
Meine Idee war, dass Excel sich für jede mögliche Kombination einmal die "Lösung" ausrechnet und dann schneller parat hat. Aber so wichtig ist das auch nicht. Ich hab jedoch tatsächlich nochmal (:() eine Frage zum .value Sachverhalt. Also entweder hat das schonmal funktioniert, oder ich habe das schlicht übersehen.


Ich habe diesen Code


Sub auswahlS()
Dim rZelle As Range
Dim rBereich As Range
Dim rKopie As Range
Set rBereich = Worksheets("Vergleich").Range("B3")
Set rKopie = Range("B3:D17")

For Each rZelle In rBereich.Cells
For i = 0 To 10 'die aktuelle Zellenumgebung spaltenweise durchlaufen
If rZelle.Offset(0, i) = "" Then 'wenn die Zelle bei Offset(i, 0) leer ist, ...
rKopie.Copy Destination:=rZelle.Offset(0, i) 'dann kopiere die Werte nach Offset(i, 0) ...
Exit For 'und beende die Schleife
End If
Next i
Next rZelle


End Sub

Dabei werden die Zellen kopiert, ich will ja aber die Werte.
Demnach hätte ich nach deine schönen (vielen Dank nochmal:)) Excel Zusammenfassung gesagt:

Sub auswahlS()
Dim rZelle As Range
Dim rBereich As Range
Dim rKopie As Range
Set rBereich = Worksheets("Vergleich").Range("B3")
Set rKopie = Range("B3:D17")

For Each rZelle In rBereich.Cells
For i = 0 To 10 'die aktuelle Zellenumgebung spaltenweise durchlaufen
If rZelle.Offset(0, i) = "" Then 'wenn die Zelle bei Offset(i, 0) leer ist, ...
rZelle.Offset(0, i).Value = rKopie.Value
Exit For 'und beende die Schleife
End If
Next i
Next rZelle

Aber leider ...herje...funktioniert es nicht :(.

Edit: Auf (großen) Umwegen selbst gelöst :)
 
Zuletzt bearbeitet: (Solved)
Hey, wie ich schon erwähnte, arbeite ich an zwei verschiedenen Projekten. Das Problem oben konnte ich lösen, da ich jeweils nur eine Zelle hatte, die übertragen werden musste. Jetzt habe ich aber doch wieder einen Zellenbereich, dessen Werte übernommen werden müssen. Vielleicht kannst du mir nochmal zur Seite stehen!? :D

Der derzeitige Code führt dazu, dass nur der erste Zellwert übertragen wird statt des gesamten Bereiches....davon abgesehen funktioniert er. Wo ist der Fehler?

Code:
Sub auswahlS()
Dim rZelle As Range
Dim rBereich As Range
Dim rKopie As Range
Set rBereich2 = Range("C48")
Set rKopie2 = Range("C3:C14")


 For Each rZelle In rBereich2.Cells
    For i = 0 To 10
      If rZelle.Offset(0, i) = "" Then
        rZelle.Offset(0, i).Value = rKopie2.Value
       
        Exit For
      End If
    Next i
Next rZelle
 
Du willst einen Bereich in einen anderen Bereich einfügen, gibst als Ziel aber nur eine Zelle an. Der Zielbereich muss so groß sein, wie der Quellbereich.

Des Weiteren ist For Each rZelle In rBereich2.Cells nicht nötig, da bei dir rBereich2 nur eine einzige Zelle ist (rBereich2 = Range("C48")).
Code:
Sub auswahl()
Dim rBereich2 As Range
Dim rKopie2 As Range
Set rBereich2 = Range("D8")
Set rKopie2 = Range("C3:C14")

zeilen = rKopie2.Rows.Count

For i = 0 To 10
  If rBereich2.Offset(0, i) = "" Then
   [COLOR="Green"]'Range((ursprüngliche Zeile + Offset 0, ursprüngliche Spalte + Offset i),(ursprüngliche Zeile  + Offset 0 + Anzahl Zeilen Quellbereich, ursprüngliche Spalte + Offset i)[/COLOR]
    Range(Cells(rBereich2.Row,             rBereich2.Column + i),           Cells(rBereich2.Row + zeilen,                                  rBereich2.Column + i)).Value = rKopie2.Value
    Exit For
  End If
Next i

End Sub
 
Suuuper, merci. Um eine weitere Frage komm ich jedoch nicht rum. Wenn ich das Makro ausführe, wird es ausgeführt, jedoch erhalte ich die Meldung: Fehler beim Kompilieren Es wurde Function oder Variable erwartet. Daraufhin wird im Editor das Tabellenblatt geöffnet und folgende Passage markiert:

Code:
[COLOR="Yellow"]Sub worksheet_change(ByVal Target As Range)[/COLOR]

If Target.Address = "$F$2" Then 'Zelle mit der Dropdown-Liste

[COLOR="DimGray"]auswahl [/COLOR]= Target

Select Case auswahl 'abhängig vom ausgewählten Wert ein Makro aufrufen
  Case "Brandvermeidung": Call makro_Brand
  Case "Alle": Call makro_Alle
  Case "Nichts": Call makro_Nichts
  Case Else: MsgBox "Nichts gewählt."
End Select
End If
End Sub

Das Worksheet_Change funktioniert wie gewünscht...nur erscheint beim Ausführen eines Makros oben genannte Meldung...Idee!? :(
 
Beschwert sich die Meldung nicht eher über eines/mehrere der unten angegebenen Makros: makro_Brand, makro_Alle, makro_Nichts?

Wenn es eines der Makros nicht gibt, kommt der Fehler.
 
Gut...der automatische Makrostart geht jetzt auch nicht (mehr) :D. Ein Makro wird nicht angezeigt oder markiert. Nur die obige Zeile. Das ist mehr als seltsam...die Makros sind da und wenn ich eins der Makros über eine Schaltfläche starte (und vorher das worksheet change entfernt habe) wird das Makro ohne Probleme ausgeführt. Die Adresse der Zelle stimmt auch noch. Hmmm.....
 
Ich hab den Fehler gefunden...wir definieren ja auswahl=target, doch haben wir ja schon ein makro, das auswahl heisst. Ich glaube, dass war der Fehler.
 
Edit: Problem selbst gelöst :)
 
Zuletzt bearbeitet:
Zurück
Oben