2016-06-22 9 views
0

Ich habe eine Tabelle in Abschnitte unterteilt und für jeden Abschnitt gibt es eine "Neue Zeile hinzufügen", wo es zu den vorhandenen Zeilen in diesem Abschnitt hinzugefügt wird.Hinzufügen einer neuen Zeile zu einer Auswahl von Zeilen in einem Abschnitt vba

Ich habe in der CurrentRegion-Funktion versucht, die Zeilen zu zählen, aber bei der Auswahl der letzten Zeile fest und dann fügen Sie eine darunter.

Der Code so weit ist, wo ich in der Lage bin eine neue Zeile hinzufügen, aber ich bin auf der Suche nach einer sauberen präzisen Lösung mit Current für jeden Abschnitt -. Dies mit dem sBudgetLine Parameter durchgeführt werden kann, die in übergeben wird

Sub AddNewAllocToSpendLine(sBudgetLine As String, Optional sSheetName As String = c_Alloc2SpendSheetName) 
'Adds new line to the list of allocated to spend 

Dim c As Range 
Dim s As String 


    Worksheets(sSheetName).Activate 

'get the budget line position 
    Set c = Worksheets(sSheetName).Range("A:A").Find(sBudgetLine, LookIn:=xlValues) 
    If Not (c Is Nothing) Then 
     s = Trim(str(c.Row)) 
     Range("B" & Trim(str(c.Row))).Select 
     Selection.End(xlDown).Select 

     If Selection.Value = "Period" Then 
      s = Trim(str(Selection.Row + 2)) 
     Else 
      s = Trim(str(Selection.Row + 1)) 
     End If 

     s = s & ":" & s 
     Rows(s).Select 
     Selection.Insert Shift:=xlDown 
     s = Trim(str(Selection.Row)) 
     Range("E10").Copy 
     Cells(Selection.Row, 5).Select 
     ActiveSheet.Paste 
     Application.CutCopyMode = False 
     Range("A" & Trim(str(c.Row))).Select 
    End If 


End Sub 

Antwort

0

zum Beispiel, wenn Sie sicher wissen, Ihre Reichweite hat Daten in A1, die den folgenden Code:

Dim lastrow as Integer 

lastrow = Worksheets(sSheetName).Range("A1").CurrentRegion.Rows.Count 
Rows(lastrow + 1).Select 
Selection.Insert Shift:=xlDown 
0

Zunächst einmal loszuwerden, alle Auswahlen. Sie sind langsam und anfällig für Fehler.

Zum Beispiel statt

Rows(s).Select 
Selection.Insert Shift:=xlDown 

Verwendung

Rows(s).Insert Shift:=xlDown 

Zweitens brauchen Sie nicht die Zeilennummer als String zu werfen und es zu trimmen. Die & bewirkt, dass sie als Zeichenfolge für Sie umgewandelt werden.

Ich entfernte die unnötigen Zeilen mit ' und fügte Kommentare mit '' hinzu.

Sub AddNewAllocToSpendLine(sBudgetLine As String, Optional sSheetName As String = "Sheet3") 'c_Alloc2SpendSheetName) 
'Adds new line to the list of allocated to spend 

Dim c As Range 
Dim lastRow As Long 'I renamed s so it's more obvious what it does 

''this is to make sure we're always on the right sheet 
With Worksheets(sSheetName) 

    'get the budget line position 
    ''range("A:A") or columns(1) is really just a matter of taste 
    Set c = .Columns(1).Find(sBudgetLine, LookIn:=xlValues) 
    If Not (c Is Nothing) Then 
     ''instead of selecting the cell in the last row, we find the index of the last row and use that instead 
     's = Trim(Str(c.Row)) 'you don't use s before resetting it? 
     'Range("B" & Trim(Str(c.Row))).Select 
     'Selection.End(xlDown).Select 
     lastRow = .Cells(c.Row, 2).End(xlDown).Row 'see how you can skip all the selecting? 

     ''just insert the lines directly 
     'If Selection.Value = "Period" Then 
     If .Cells(lastRow, 2).Value = "Period" Then 
      .Rows(lastRow + 2).Insert Shift:=xlDown 
      lastRow = lastRow + 2 
     Else 
      .Rows(lastRow + 1).Insert Shift:=xlDown 
      lastRow = lastRow + 1 
     End If 

     ''what is this for? Rows("4:4") works but it's unnecessary 
     's = s & ":" & s 

     ''remove selection 
     'Rows(s).Select 
     'Selection.Insert Shift:=xlDown 
     ''this is what you'd do if you didn't insert the row above 
     'Rows(s).Insert Shift:=xlDown 

     ''instead of copying, just assign the range 
     's = Trim(Str(Selection.Row)) 'why? you don't use it anymore 
     'Range("E10").Copy 
     'Cells(Selection.Row, 5).Select 
     'ActiveSheet.Paste 
     'Application.CutCopyMode = False 
     .Cells(lastRow, 5) = .Cells(10, 5) 

     ''is this really necessary? 
     'Range("A" & Trim(Str(c.Row))).Select 
     .Cells(c.Row, 1).Select 
    End If 
End With 
End Sub 
+0

Ok, danke. Aber würde es keine Möglichkeit geben, CurrentRegion dem Befehl .Rows (lastRow + 2) zuzuweisen. Geben Sie Shift: = xlDown ein, um die Liste der Zeilen in dem Abschnitt zu zählen, da sie ein zufälliger Betrag sein werden. – user3565164

+0

Ich bin mir nicht sicher, ob ich verstehe, was du meinst. 'lastRow = .Cells (c.Row, 2) .End (xlDown) .Row 'kümmert sich um eine variable Anzahl von Zeilen. Ich sehe keinen Grund, die Anzahl der Zeilen in der aktuellen Region zu zählen, da Sie nur am Ende der Region interessiert sind. – arcadeprecinct

+0

Ja, aber es bedeutet, dass wenn Sie eine neue Zeile hinzufügen, wird immer unter den 2 übersprungenen Zeilen (Titel, Spaltentitel) hinzugefügt, unabhängig davon, ob eine Anzahl von Zeilen bereits in der Sektion ist. – user3565164

Verwandte Themen