我正在编写一个宏来打开一个新工作簿并将所有数据复制到另一个工作簿。 数据总是从C12开始,但我们并不总是知道有多少行数据
以下代码出错:
Workbooks("Somesheet.xls").Activate
Sheets("Sheet1").Activate
With Range("C12").Select
End (xlDown)
End With
如何从C12中选择所有行?
答案 0 :(得分:2)
dim rng as range
with Workbooks("Somesheet.xls").Sheets("Sheet1").range("C12")
set rng = range(.cells(0,0), .end(xldown))
end with
您也可以使用
set rng = Workbooks("Somesheet.xls").range("C12").CurrentRegion
答案 1 :(得分:1)
要从单元格C12中选择所有数据,请使用UsedRange
属性查找使用的绝对最后一行。如果列C中有空白单元格,其他方法将在工作表的真正结束之前停止。此代码段设置一个范围变量,该变量从C12跨越到工作表中最后一个使用的单元格:
Dim rng As Range
Dim lRowLast As Long, lColLast As Long
With ActiveWorkbook.Worksheets("Sheet1")
lRowLast = .UsedRange.Row + .UsedRange.Rows.Count - 1
lColLast = .UsedRange.Column + .UsedRange.Columns.Count - 1
Set rng = .Range(.Range("C12"), .Cells(lRowLast, lColLast))
End With
注意:使用.Row + .Rows.Count - 1
来处理在第一行之后开始使用范围的情况。
编辑:更新了修复@brettdj指出的错误的示例。
答案 2 :(得分:1)
我使用Find来检测真正的最后使用过的单元格,因为UsedRange可能不可靠,过度估计真实使用范围的范围,除非在使用之前强制在代码中重新计算。 UsedRange也可能有问题,除非它从A1开始(我在使用Rachel的代码时遇到此问题仅在C12:C40中测试数据时,提供的答案是G34:G60)
从您的问题示例代码中可以看出,您只希望C12中的C列数据向下(这是此代码的作用)。它可以很容易地扩展到真正使用的列范围,或者如果需要可以作为整行
Sub GetData()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Set wb = Workbooks("SomeSheet.xlsm")
Set ws = wb.Sheets("Sheet1")
Set rng1 = ws.Columns("C").Find("*", ws.[c1], xlFormulas, , , xlPrevious)
If rng1.Row > 12 Then
Set rng2 = ws.Range(ws.[c12], rng1)
MsgBox "Your range is " & rng2.Address(0, 0)
Else
MsgBox "Last row in " & ws.Name & " was only " & rng1.Row
End If
End Sub