Autor
|
Thema: Anzahl Zeilen als Variable verwenden (1088 mal gelesen)
|
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 07. Feb. 2017 14:40 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich hätte nochmal eine Frage. Ich habe eine Excel-Tabelle mit verschiedenen Artikeln. Diese Liste kann jederzeit größer werden. Nun möchte ich beim Hinzufügen eines Artikels nicht jedes Mal mein Makro anpassen, sondern die Anzhal Zeilen als Variable nutzen. In der Liste mit den Artikeln wird gefiltert und es werden Daten kopiert, per Makro. Code: Worksheets("Bestand").Range("B2:B74"). _ SpecialCells(xlCellTypeVisible).Copy Worksheets("Berechnung").Range("C15").PasteSpecial xlPasteValues In der ersten Zeile möchte ich nun das B74 durch eine Variable ersetzen, bzw. die Zahl 74. Ich habe eine Variable definiert: Dim b As Long b = Worksheets("Bestand").Cells(Rows.Count, 1).End(xlUp).Row Leider schlugt jede Variante fehl, die ich bisher versucht habe. Worksheets("Bestand").Range("B2:B&b"). _ Worksheets("Bestand").Range("B2:B+b"). _ Worksheets("Bestand").Range("B2:B"&b). _ Worksheets("Bestand").Range("B2:B"+b). _ Kann mir da evtl. jemand weiter helfen? Anfangs hatte ich anstatt der B74 ein B1000 drin, aber dann bekomme ich an anderen Stellen des Makro Probleme, deshalb wollte ich mich auf die tatsächliche Anzahl Zeilen beziehen. Danke und Gruß Tammy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 07. Feb. 2017 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 657 Registriert: 20.11.2006 Win7 Pro SP1 64Bit HP Z230, Core i5, 8GB RAM, nv Quadro K600 Creo Elements/Direct 19.0 M010 ModelManager 19.0 M010 clisp,VB.net,VBA,AHK,php,javascript
|
erstellt am: 07. Feb. 2017 15:51 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Bei Zeichenfolgenverkettung muss das Ampersand beideitig durch Leerzeichen von den zu verkettenden Zeichenfolgen getrennt sein. Worksheets("Bestand").Range("B2:B" & b). _ Sauberer übrigens, wenn man Zahlen explizit in den Typ String konvertiert: Worksheets("Bestand").Range("B2:B" & CStr(b)). _ ------------------ Patrick
[Diese Nachricht wurde von Patrick Weber am 07. Feb. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 07. Feb. 2017 17:12 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hi, ich würde es so lösen: Code: Dim lngLetzte As Long With Worksheets("Bestand") ' letzte belegte Zeile in Spalte A lngLetzte = .Columns(1).Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row .Range(.Cells(2, 2), .Cells(lngLetzte, 2)).SpecialCells(xlCellTypeVisible).Copy Worksheets("Berechnung").Range("C15").PasteSpecial xlPasteValues End With
Die Benutztung von Cells ist generell, aber insbesondere bei Bereichen, die über eine Variable definiert werden, günstiger, weil Excel intern alle Zellbzeichnungen in der Form Zeilennummer/Spaltennummer ablegt und nicht Spaltenbuchstabe/Zeilnnummer. Bei Verwendung von Range("A2:A" & lngVariable) muss Excel also unnötigerweise erst den Spaltenbuchstaben in die Spaltennummer umrechnen und dann in der gewohnten Weise zusammensetzen was natürlich Zeit kostet. Ist sicher nicht so dramatisch, wenn mann nur einen kurzen Code hat, aber bei umfangreichen Programmen kann das durchaus negativen Einfluss auf die Performance haben.
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 08. Feb. 2017 10:16 <-- editieren / zitieren --> Unities abgeben:
|
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3358 Registriert: 07.06.2001
|
erstellt am: 08. Feb. 2017 10:23 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
servus, oder letztezeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row gibt die letzte verwendete Zeile überhaupt an. ------------------ <----- Bitte Systeminfo eintragen, warum siehst du hier. Schöne Grüsse aus der Steiermark Bernd P. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 08. Feb. 2017 12:54 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Dann würde ich schon eher Code: Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
verwenden, weil andernfalls auch Zeilen unterhalb der optisch letzten belegten Zeile gefunden werden, aus deren Zellen Inhalte gelöscht wurden und somit würde der tatsächlich "gewünschte" benutzte Bereich nicht korrekt (weil größer) definiert.
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3358 Registriert: 07.06.2001 W10-64bit, AMD Ryzen 7 3700X,32GB RAM, Sapphire Pulse Radeon RX 570 8G G5, Canon TX-3000 MFP, Maus Cherry MW4500, Sub:Infrastructure Design Suite, Office 365
|
erstellt am: 08. Feb. 2017 14:05 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|