Не можете вставить строки выше диапазона? - PullRequest
0 голосов
/ 04 марта 2020

я написал следующий код, чтобы вставить rngtocopy ABOVE rngins ....

Теперь я много пробовал, и он продолжает добавлять его ниже rngins, и я понятия не имею, почему. Я попробовал xlshiftup, который на самом деле дает мне ошибки, вероятно, потому что есть значения выше?

Sub reviewverschieben()

Dim counter As Long, lrow As Long, lrowrev As Long, i As Long, lastrev As Long
Dim ws As Worksheet
Dim rngtocopy As Range, rngins As Range
Dim lastcolumn As String

Set ws = ActiveSheet
Rows.EntireRow.Hidden = False

counter = 0

With ws
lrow = .Cells(Rows.Count, 1).End(xlUp).row
Do While counter = 0
  For i = 32 To lrow
    If .Cells(i, 1).Value = "Review Participants" And counter = 1 Then
     lrowrev = i

    ElseIf .Cells(i, 1).Value = "Review Participants" And i <> lrow Then
     counter = counter + 1
     lastrev = i  'row nr which we take as a reference to insert new table above
     lrowrev = lastrev
     lcol = .Cells(i + 1, .Columns.Count).End(xlToLeft).Column 'last meeting of the review is our reference for lastcol

        ElseIf counter = 1 And i = lrow Then
        lrowrev = lrow + 2
        Exit For
End If
Next
Loop

lastcolumn = Split(Cells(, lcol).Address, "$")(1)
Set rngtocopy = .Range("A" & 32 & ":" & lastcolumn & lrowrev)

Debug.Print rngtocopy.Address

Set rngins = .Range("A" & 32 & ":" & lastcolumn & lrowrev)
Debug.Print rngins.Address

        'Range("A" & lrow).Offset(5).EntireRow.Hidden = False
             rngtocopy.Copy
             rngins.Insert Shift:=xlShiftDown
             ringins.PasteSpecial Paste:=xlPasteAll

Изображение для лучшего понимания, что у меня сейчас

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Если вам нужно освободить место для копирования диапазона rngins, вы должны выполнить следующие действия:

Dim aboveR As Long
aboveR = rngins.Cells(1, 1).row
sh.Rows(aboveR & ":" & aboveR + rngtocopy.Rows.Count - 1).Insert xlDown

Этот фрагмент кода будет вставлять в диапазон rngins столько строк, сколько и rngtocopy Диапазон имеет.

Если вам нужно вставить только несколько строк диапазона, второй параметр должен заменить rngtocopy.Rows.Count на указанное c количество строк. И затем, ячейка вставки должна быть определена путем добавления этого числа к существующему значению aboveR:

Dim pasteCell As Range
Set pasteCell = sh.Range("A" & aboveR + rngtocopy.Rows.Count)
 rngtocopy.Copy pasteCell

И чтобы ваш код работал так, как вы хотели, попробуйте это:

rngtocopy.Copy
rngins.Cells(1, 1).Insert Shift:=xlDown
Application.CutCopyMode = False 'Clear clipboard

Когда вы пытаетесь вставить строки, и в буфере обмена что-то есть, содержимое буфера обмена вставляется ...

0 голосов
/ 04 марта 2020

Ваша спецификация RngIns вполне может быть описана как авантюрная, учитывая этот маленький кусочек кодового жонглирования: lastcolumn = Split(Cells(, lcol).Address, "$")(1). Я рекомендую вам определить диапазон следующим образом.

Set rngIns = .Range(.Cells(32, "A"), .Cells(lrowrev, lcol))

Код определяет первую и последнюю ячейки диапазона, и вам будет легко следовать за ним. Теперь, если вы вставите в rngIns, вставка будет сделана ниже этого диапазона. Если вы вставите в RngIns.Offset (1), вставка будет выполнена выше rngIns. Конечно, вы можете добиться той же разницы, по-разному определяя строку rngIns, например, Set rngIns = .Range(.Cells(33, "A"), .Cells(lrowrev + 1, lcol)).

Однако мне интересно, зачем вообще вставлять ячейки. Не проще ли вставить столько строк в листы, а затем вставить их в пустые строки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...