【问题标题】:Range as a Variable VBA范围作为变量 VBA
【发布时间】:2013-11-19 22:08:54
【问题描述】:

我正在尝试将值从 sheet1 复制到 sheet2。 sheet1 的行数不同,所以我需要将它存储在一个变量中。我需要类似的东西:

Worksheets("Sheet1").Range("A2:Ab").Select

,其中“b”是存储Sheet1中行数的变量。

谢谢。

【问题讨论】:

  • Worksheets("Sheet1").Range("A2:A" & b).Copy Worksheets("Sheet2").Range("A2")

标签: vba variables range


【解决方案1】:

您实际上可以存储工作表的UsedRange。或者直接复制到另一张纸上。例如

Set oWS1 = Worksheets("Sheet1")
Set oWS2 = Worksheets("Sheet2")
oWS2.UsedRange.Clear ' Clear used range in Sheet2
oWS1.UsedRange.Copy oWS2.Range("A1") ' Copies used range of Sheet1 to A1 of Sheet2

'Set oRng = oWS1.UsedRange ' Sets a Range reference to UsedRange of Sheet1

获取工作表的最后一行:

lLastRow = oWS1.UsedRange.SpecialCells(xlLastCell).Row

编辑(从 UsedRange 的地址获取最后一行):

Dim sAddr as String, lLastRow As Long
sAddr = oWS1.UsedRange.Address
lLastRow = CLng(Mid(sAddr, InStrRev(sAddr , "$") + 1))

【讨论】:

  • + 1 :) 但是,请注意。 UsedRange 永远不应该用于查找有数据的最后一行。您可能想查看THIS。在这里很好,因为您只是从一张纸复制到另一张纸,但是如果用户想写入最后一行,那么UsedRange.SpecialCells(xlLastCell).Row 可能会给您带来意想不到的结果:)
  • 感谢@SiddharthRout,我没想到隐藏最后一行时该方法会改变!即使所有行都被隐藏,您的解决方案也能正常工作!或者,我想我可以使用 UsedRange 的地址...
【解决方案2】:

一种方法是通过连接列和行标识符,然后使用 Range(Cell1,Cell2) 重载来动态创建单元格名称,如下所示:

Dim rng As Range
Dim intStart As Integer
Dim intEnd As Integer
Dim strStart As String
Dim strEnd As String

'Let's say your range is A2 to A10
intStart = 2
intEnd = 10
strStart = "A" & intStart
strEnd = "A" & intEnd

Set x = Range(strStart, strEnd)

【讨论】:

  • 在 Excel 中处理行时,建议不要将它们声明为 Integers,而是声明为 Long。要对其进行测试,请将 intEnd = 10 更改为 intEnd = 1048570 :)
  • @Siddharth - 谢谢!这是一个匆忙且有些随意的 POC,但我会记住这一点!
  • 我总是使用 MS 对象引用中的类型,当我不确定时,我在即时窗口中使用 ?typename(...),例如?typename(range("a1").row) 给出 Long,您可能会惊讶于 Excel 中的大多数数字常量都是 Long - ?typename(xllastcell) 给出 Long
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多