将范围作为变量从一张纸插入到另一张纸

时间:2018-11-05 18:15:41

标签: excel vba excel-vba

我现在正在寻找比我愿意管理的解决方案更长的时间,所以这是我的问题。

我需要在第一列之后的另一张工作表中插入一个动态范围的列,该列包含2行的大部分内容。 我无法对列进行硬编码,因此我创建了一个Application.InputBox,用户必须在其中选择范围,然后确认选择。现在,如果我接受范围并使用rng.address制作一个味精盒,它将显示范围e.G. A $ B $。

现在,当我尝试插入范围时,根据我的尝试方式,我会遇到各种错误。

我当前的方法如下:

dim rng as Range
         retry:
Set rng = Application.InputBox("Do that and that", "Obtain Range Object", Type:=8)

 If MsgBox("Your choice " & rng.Address & " ?", vbYesNo, "Confirm") = vbYes Then
    GoTo continue:
    Else
    GoTo retry:
    End If

         continue:

'#1) i tried this:
Worksheets(templateold).Range(rng).Insert Shift:=xlToRight Worksheets(templatenew).Range(rng)

'#2) and i tried that:
Worksheets(templateold).Range(rng).Copy Worksheets(templatenew).Range(rng)

我尝试过选择拳头然后进行复制,但没有任何效果。 :(

如何使用变量中存储的范围将范围插入另一张纸中?抱歉,如果我的代码段不正确,我在工作中尝试了更多操作,但家里什么都没有。

2 个答案:

答案 0 :(得分:1)

以下内容将复制用户选择的范围,然后通过将其他所有内容向右移动将其插入到B列的另一张纸中:

Sub foo()
Application.ScreenUpdating = False

Dim templateold As Worksheet: Set templateold = ThisWorkbook.Worksheets("Sheet1")
Dim templatenew As Worksheet: Set templatenew = ThisWorkbook.Worksheets("Sheet2")
'declare and set the worksheets you are working with, amend as required.
Dim rng As Range

retry:
Set rng = Application.InputBox("Do that and that", "Obtain Range Object", Type:=8)

If MsgBox("Your choice " & rng.Address & " ?", vbYesNo, "Confirm") = vbYes Then
    rng.Copy
    templateold.Range("B:B").Insert Shift:=xlToRight
Else
    GoTo retry:
End If

Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

假设我们有两个工作表,Sheet1(复制源)和Sheet2(粘贴目标)。 我们知道数据从哪里开始(在wsSource上为A1),但是数据可以有4列,也可以有40列(与行相同)。

当您要查找特定范围内的最后一行或最后一列时,我们使用CurrentRegion.Rows / Columns.Count,它将以长整数形式返回最后一行/列。

Sub DuplicateRange()
Dim wsSource As Worksheet, wsTarget As Worksheet
Dim lRow As Long, lCol As Long

Set wsSource = ThisWorkbook.Sheets("Sheet1")
Set wsTarget = ThisWorkbook.Sheets("Sheet2")

' We know A1 is the starting (top-left) cell. _
using CurrentRegion.Rows/Columns.Count we can _
find the range of data without hardcoding the columns
lRow = wsSource.Range("A1").CurrentRegion.Rows.Count
lCol = wsSource.Range("A1").CurrentRegion.Columns.Count

' Range(A1:lCol,lRow)
With wsSource.Range(Cells(1, 1), Cells(lRow, lCol))
    .Copy wsTarget.Cells(1, 1)
End With
End Sub