如何在VBA中声明Excel范围?

时间:2019-07-19 15:53:05

标签: excel vba raw-data

所以我丢了我所有的VBA笔记,并且在这里重做一些逻辑时遇到了问题,如果这看起来很基础,我深表歉意。我试图找到顶部,找到一列中最后一个填充的单元格,并将它们都设置在我的范围内,以便能够将其复制并粘贴到日志中。当我进入MYRANGE部分时,我会得到:

  

错误1004

我尝试使用更基本的选择来实现我想做的事情,但是原始数据永远不会有相同的大小,因此我想回到这里尝试看看是否可以得到帮助。

Sub CopyRows()

    Dim sht As Worksheet
    Dim LastRow As Long
    Dim LastColumn As Long
    Dim MYRANGE As Range
    Dim Top, Bottom, Left, Right As Long        

    Set sht = Worksheets("Data")
    sht.Activate

    Set Top = Range("B2")
    LastRow = Cells(Rows.Count, "B").End(xlUp).Select
    Set MYRANGE = Range("Top", "LastRow").Select.Copy

End Sub

正如我所提到的,我试图将范围设置为“顶部”和“底部”或“最后一行”,这样我就不必担心数据的实际大小并将其复制并粘贴到上面了。到另一个工作表。

2 个答案:

答案 0 :(得分:2)

设置范围时,请勿使用.Select.Copy

在其他范围内使用可变范围时,请勿使用""

请勿使用.Activate.Select

Sub CopyRows()
    Dim sht As Worksheet
    Dim LastRow As Range
    Dim LastColumn As Long
    Dim MYRANGE As Range
    Dim Top As Range, Bottom As Range, Left As Range, Right As Range

    Set sht = Worksheets("Data")

    Set Top = sht.Range("B2")
    Set LastRow = sht.Cells(Rows.Count, "B").End(xlUp)
    Set MYRANGE = sht.Range(Top, LastRow)
    'Now you can do something with MYRANGE like MYRANGE.Copy
End Sub

答案 1 :(得分:0)

general 情况下,在Excel中用两个单元格或一个单元格定义一个范围。定义单个单元格范围需要一个单元格,多个单元格范围需要两个单元格。

在您的情况下,您需要在Excel中有两个单元格范围,因此需要定义范围的左上单元格和右下单元格:

下面的代码定义了左上单元格(startRange)和右下单元格(endRange):

enter image description here

然后它定义myRange,因为这两个之间的所有单元格都位于四边形中:

enter image description here

Sub TestMe()

    Dim wks As Worksheet
    Dim lastRow As Long

    Dim startRange As Range
    Dim endRange As Range
    Dim myRange As Range

    Set wks = Worksheets("Data")
    lastRow = wks.Cells(wks.Rows.Count, "B").End(xlUp).Row

    Set startRange = wks.Range("B2")
    Set endRange = wks.Range("B" & lastRow)

    Set myRange = wks.Range(startRange, endRange)
    Debug.Print myRange.Address
    myRange.Offset(0, 1).Value = myRange.Value

End Sub

代码的其他要点:

  • 它不使用.Select.ActivateHow to avoid using Select in Excel VBA
  • 它始终引用Range的父级工作表。例如wks.Range("B2")
  • 代码不复制单元格,而是采用其值并将其写入myRange.Offset(0, 1).Value = myRange.Value到下一列,如果单元格的样式和格式也很重要,则可能不需要。