Verwendung von Range Objekten in VBA

Diskutiere und helfe bei Verwendung von Range Objekten in VBA im Bereich Microsoft Office im Windows Info bei einer Lösung; Hallo Da ich nicht beliebig aus VBA auf Excel Tabellen zugreifen kann (schmerzliche Erfahrung und Hilfeleistung eines anderen Microsoft Anwenders),... Dieses Thema im Forum "Microsoft Office" wurde erstellt von Eberli Albert, 13. November 2017.

  1. Verwendung von Range Objekten in VBA


    Hallo


    Da ich nicht beliebig aus VBA auf Excel Tabellen zugreifen kann (schmerzliche Erfahrung und Hilfeleistung eines anderen Microsoft Anwenders), bin

    ich nun genötigt, alle relevanten Zellen an eine Funktion zu übergeben. Ich verwende seit neuesten dazu Range Objekte und bis anhin habe ich nur eindimensionale Ranges (z.B. =funktion(a$12:a$25; b$12:b$25, ... ) ) übergeben, das ging soweit gut. Ich konnte das Tabellenende mit UBOUND() abfragen und habe mich auf eine feste Anzahl Spalten beschränkt. Um das weiter zu vereinfachen möchte ich =funktion($a$12:$f$25) übergeben.


    Wie kann ich nun in meiner VBA Funktion, wenn ich mit einer variablen Anzahl von Zeilen und Spalten arbeiten will:


    a) Abfragen wie viele Spalten in diesem Range enthalten sind (also a bis f = 5 Spalten) ?

    b) Abfragen wie viele Zeilen in diesem Range enthalten sind (also 12 bis 25 = 24 Zeilen) ?

    c) Eine ganze Zeile aus diesem Range an eine Subfunktion weitergeben ?

    d) eine ganze Spalte aus diesem Range an eine Subfunktion weitergeben ?
     
  2. Andreas Killer Win User

    Verwendung von Range Objekten in VBA

    Okay, ist alles kein Problem, jedoch müssen wir da mal ein paar Dinge klären, weil so wie Du das in "SteuerBetragAlt" machst passiert da was ganz anderes als Du denkst.

    a) Variablendeklaration erzwingen

    Schreib mal die Zeile "Option Explicit" als erste in das Modul und klick auf "Debuggen\Kompilieren von VBAProject". Wie Du siehst bekommst Du einen Fehler weil "Suchzeile" nicht deklariert ist.

    In VBA kann man Quick&Dirty programmieren, alles was man nicht deklariert ist dann automatisch ein Variant Datentyp.

    Kann man machen, hat aber Nachteile und man fängt sich durch Tippfehler schnell schwer zu findende Fehler ein.

    b) Richtig deklarationen

    Function SteuerBetragNeu(SteuerbaresEinkommen, Steuertabelle As Range)

    Hier ist SteuerbaresEinkommen ein Variant, aber Steuertabelle ein Range. Die Function selber ist auch ein Variant. In VBA muss man jede Variable explizit mit einem Datentyp versehen, sonst klappt das mit der Intellisense nicht.

    Das gilt auch für "Dim" und jede andere Art von Deklaration:

    Dim i As Long, j As Long

    BTW: Die Argumente sind als ByRef übergeben, in 99% aller Fälle benötigt man aber ByVal.

    Weise ich einem Argumente z.B. einen Wert zu, dann werden die mit ByRef übergeben werden dort wo sie tatsächlich deklariert sind verändert. Mit ByVal passiert das nicht, hier ändert sich nur der Wert innerhalb der Routine.

    Function SteuerBetragNeu(ByVal SteuerbaresEinkommen As Double, ByVal Steuertabelle As Range) As Double

    So bekommen wir in SteuerbaresEinkommen bereits eine fertige Zahl übergeben und die Tabelle ist ein richtiges Range Objekt.

    c) Intellisense und Properties

    Nachdem wir nun ordentliche Typen haben können wir die Intellisense nutzen um auf die Eigenschaften des Range Objektes zuzugreifen. Schreib mal "Steuertabelle." in den Editor:


    [​IMG]


    Sobald Du den . geschrieben hast sollte ein Dropdown kommen in dem alle Dinger zu sehen sind die das Range Objekt hat.

    Wenn nicht dann unter Extras\Optionen dies einstellen:


    [​IMG]


    d) Das Range Objekt, die Eier legende Wollmichsau

    Das Range Objekt kann extrem viel und ist noch vielseitiger in Bezug auf möglicher Syntax in VBA.

    Der Aufruf "Suchzeile = UBound(Steuer())" liest alle Daten aus den Zellen in ein 2D Array, welches dann von UBound ausgewertet wird, dieses gibt die obere Grenze als Zahl zurück, welche dann in Suchzeile geschrieben wird... Overkill sozusagen.

    Wie man mit Arrays und dem Range arbeitet lass ich mal weg, das führt zu weit.

    Schau dir mal den Code unten an und lies die Kommentare dazu. Noch Fragen?

    Andreas.

    Function SteuerBetragNeu(ByVal SteuerbaresEinkommen As Double, ByVal Steuertabelle As Range) As Double

    Dim i As Long

    Dim Einkommen As Double, Steuer As Double, Pro100 As Double, RestFaktor As Double

    'Ein WITH beschleunigt den Zugriff, da nur einmal eine Referenz aufgebaut wird

    With Steuertabelle

    'Von unten nach oben

    For i = .Rows.Count To 1 Step -1

    'Einkommen einlesen

    Einkommen = .Cells(i, 1)

    If SteuerbaresEinkommen > Einkommen Then Exit For

    Next

    'Gefunden?

    If i < 1 Then Exit Function

    'Die Werte daneben lesen

    Steuer = Steuertabelle.Cells(i, 2)

    Pro100 = Steuertabelle.Cells(i, 3)

    End With

    'Berechnung

    RestFaktor = Int((SteuerbaresEinkommen - Einkommen) / 100)

    SteuerBetragNeu = Steuer + (RestFaktor * Pro100)

    End Function
  3. Andreas Killer Win User

    Verwendung von Range Objekten in VBA

    Ich kann aus der Fragestellung herauslesen das es sich wohl um eine UDF handelt...

    Aber was Du mit UBOUND da drin willst und was Du übergeben willst ist mir ein Rätsel.

    Mach mal eine Beispieldatei, lade sich auf einen Online File Hoster wie www.dropbox.com und poste den Download-Link hier.

    EDIT: Funktioniert die Intellisense in Deinem VBA.Editor? Deklarierst Du alle Variablen richtig mit Typen?

    Andreas.
  4. Eberli Albert Win User

    Verwendung von Range Objekten in VBA

    Hallo Andreas

    Besten Dank dass DU Dir Zeit dafür nimmst.

    https://www.dropbox.com/s/nnl406j37hkdcw1/Test%20.xlsm?dl=0

    Weiter Erklärungen sind in dem Workbook enthalten.
  5. Andreas Killer Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Ich finde es merkwürdig, dass ich Dinge explizit referenzieren kann, aber auch "Unterelemente" einfach direkt ansprechen kann. Da weiß man eigentlich nicht immer unbedingt direkt zu welchem "Überobjekt" das Element, das man anspricht, eigentlich
    gehört.
    Ja, das ist verwirrend, verstehe ich.

    Allerdings hat sich VBA genau wegen dieser (und ein paar anderer) herausragender Eigenschaften so weit verbreitet, man kann in VBA selbst als Anfänger einfach und ohne Grundkenntnisse drauflos programmieren und es läuft. Alle anderen Hochsprachen hauen Dir
    da gehörig auf die Finger.

    Auch VBA ist kein Wunderding, alle Objekte sind immer voll referenziert... nur muss man das im Code nicht schreiben, das geht "von alleine". Dabei muss man jedoch unterscheiden in welcher Art von Modul der Code läuft, in VBA gibt es 3 verschiedene:

    Ein reguläres Modul (Menü\Einfügen\Modul)

    Ein Klassenmodul

    Eine Userform

    Das erste solltest Du benutzen, die anderen irgendwann später. Dann hast Du in Excel noch 2 Sonderformen eines Klassenmodules und zwar das Codemodul einer Tabelle und das der Datei "DieseArbeitsmappe".

    Im Regulärem Modul gilt z.B. für das RANGE Objekt:

    Wenn keine Referenz angegeben ist, wie bei

    Range("A1") = 1

    dann bezieht sich das Range immer auf das aktuelle Blatt, welches durch ActiveSheet referenziert ist.

    Wenn eine Tabellenreferenz angegeben wird, wie bei

    Sheets("Test").Range("A1") = 1

    oder besser

    Worksheets("Test").Range("A1") = 1

    dann bezieht sich das Range immer auf die aktuelle Datei, welche durch ActiveWorkbook referenziert ist.

    Eine Ausnahme gibt es in den Excel-Klassenmodulen, in einem Tabellenmodul referenziert das Range immer auf die Tabelle (Worksheet Objekt) in der sich der Code befindet.

    Das gleiche gilt für "DieseArbeitsmappe", wobei dieses Workbook Objekt kein RANGE Mitglied hat.

    Ich hoffe das hilft ein wenig.

    Andreas.
  6. Andreas Killer Win User

    Excel Personl.xls

    Die Verknüpfung spielt keine Rolle, das gilt für jede beliebige Datei:
    <br />1) Referenziere die Objekte und lese die Daten wie üblich.
    <br />Also "normalerwesie" sagt Du
    Range("B1") = Range("A1")
    und schreibst so den Inhalt aus A1 im aktiven Blatt in B1 im aktiven Blatt.
    <br />Aus einem anderen Blatt musst Du nur das Objekt des Sheets davor tun
    Range("B1") = Worksheets("Tabelle2").Range("A1")
    <br />und schreibst so den Inhalt aus A1 aus Blatt "Tabelle2" in B1 im aktiven Blatt.
    <br />Aus einer anderen Datei musst Du zusätzlich noch das Objekt des Workbooks davor tun
    <br /> Range("B1") = Workbooks("PERSONAL.XLS").Worksheets("Tabelle2").Range("A1")
    <br />und schreibst so den Inhalt aus A1 aus Blatt "Tabelle2" aus Datei "PERSONAL.XLS" in B1 im aktiven Blatt.
    <br />2) Gar nicht.
    <br />Deklarationen innerhalb von VBA-Prozeduren sind nicht zugänglich, sind immer PRIVATE.
    <br />Nur global und als PUBLIC deklarierte Variablen können gelesen/geschrieben werden und dafür braucht es dann auch eine Referenz via VBA zu der Datei.
    <br />Andreas.
    <br />
  7. User Advert


    Hi,

    willkommen im Windows Forum!
Thema:

Verwendung von Range Objekten in VBA - Microsoft Office

Die Seite wird geladen...

Verwendung von Range Objekten in VBA - Similar Threads - Verwendung Range Objekten

Forum Datum

Excel VBA - Laufzeitfehler ... Die Methode 'Value' für das Objekt 'Range' ist fehlgeschlage

Excel VBA - Laufzeitfehler ... Die Methode 'Value' für das Objekt 'Range' ist fehlgeschlage: Hallo Community,wie so einige habe auch ich das Problem, dass der in der Beschreibung stehende Fehler in unregelmäßigen Abständen auftaucht.An sich ist es ganz simpel.Ich habe eine Userform, in...
Microsoft Office 14. März 2024

Range in einer Excel/VBA-Function

Range in einer Excel/VBA-Function: Guten Tag,ich möchte in einer Tabelle eine Function aufrufen, die eine "Range" als Parameter hat: =Anzahl"B2:H2"In der Function will ich dann auswerten, in welchen Zellen etwas drin steht, also...
Microsoft Office 25. Februar 2024

Wie speichere ich den Wert einer Checkbox in VBA, um ihm später wieder zu verwenden?

Wie speichere ich den Wert einer Checkbox in VBA, um ihm später wieder zu verwenden?: Guten Tag zusammen,folgendes Problem:Ich bin momentan dabei eine "erweiterte Suchfunktion" in Excel für mein Glossar zu implementieren.Dafür habe ich bereits ein extra Fenster eingerichtet in dem...
Microsoft Office 5. Oktober 2023

Kann man Range mit Variablen verwenden?

Kann man Range mit Variablen verwenden?: Hallo,derzeit verwende ich den folgenden code, um jeweils vier Wochen-Bereiche 28 Zeilen in einer Tabelle zu formatieren: Range"A3:U30".Select Selection.Copy Range"A31:U58".Select...
Microsoft Office 27. November 2022

verwendung von vba-macros in 365 auf apple-Rechner

verwendung von vba-macros in 365 auf apple-Rechner: Bei Aufruf einer Excel-Datei - die auf einem Windows-Rechner erstellt wurde - auf einem Applerechner unter Verwendung von Excel aus dem Office-Paket 352 erscheint die Meldung "In dieser Version...
Microsoft Office 25. Februar 2021

VBA - Datum aus Range mit Offset suchen

VBA - Datum aus Range mit Offset suchen: Liebe Community, da mir hier schon einige Male schnell geholfen wurde, wäre ich begeistert, wenn dies noch einmal klappt. Ich arbeite an einem Skript zur Aufarbeitung von Daten (Umformatierung...
Microsoft Office 28. Oktober 2019

Verwendung von VBA Funktionen in Office365 auf OSX

Verwendung von VBA Funktionen in Office365 auf OSX: Hallo Zusammen Ich benutze ja nicht das erste mal VBA in Excel, aber ich komm einfach nicht weiter. Vielleicht steh ich auch irgendwo selbst auf dem Schlauch. Neues Excel Sheet angelegt,...
Microsoft Office 28. September 2017
Verwendung von Range Objekten in VBA solved
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.