【问题标题】:VBA range value from a dynamic range来自动态范围的 VBA 范围值
【发布时间】:2016-09-23 18:10:09
【问题描述】:

我正在尝试在不使用复制/粘贴功能的情况下“粘贴”范围值。我对 VBA 很陌生,不明白为什么我的代码不起作用。如果这是一种已经回答但我无法通过其他帖子解决问题的问题,我很抱歉。

我可以选择我希望从中复制和粘贴值的范围

name_task = [code].select
name_task_2 = [code].select

但我无法将值写入 name_task_2

name_task_2 = name_task.value

这行得通,对我来说,我所写的内容以某种方式相同只是更复杂,但由于它不起作用,因此显然不一样 :D

sht2.Range("C2:D12") = sht1.Range("A8:B18").value 

Excel sheet1

Sub Time_Estimate()

Application.ScreenUpdating = False

Dim name_task As Variant
Dim name_task_2 As Variant

Dim R_count As Double
Dim C_count As Double

Dim sht1 As Worksheet
Dim sht2 As Worksheet

Set sht1 = Sheet1 'Sheets("Tekla_2016")

name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))
R_count = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)).Rows.Count
'Debug.Print name_task.Rows.Count
'Debug.Print name_task.Columns.Count
Debug.Print R_count

Set sht2 = Sheet2 'Sheets("Timeforbruk_2016 - UFERDIG")

name_task_2 = sht2.Range("C2:D2", sht2.Range("C2:D2").Offset(R_count - 1, 0))

'name_task_2 = name_task.value 'Why doesn't this work???

'sht2.Range("C2:D12") = sht1.Range("A8:B18").value 'This works but it's not dynamic


Application.ScreenUpdating = True

End Sub

编辑: 这段代码现在可以按我的意愿工作:

Sub Time_Estimate()

Application.ScreenUpdating = False

Dim name_task As Range
Dim name_task_2 As Range
Dim rng_sht1 As Range
Dim rng_sht2 As Range


Dim R_count As Double
Dim C_count As Double

Dim sht1 As Worksheet
Dim sht2 As Worksheet

Set sht1 = Sheet1 'Sheets("Tekla_2016")
Set sht2 = Sheet2 'Sheets("Timeforbruk_2016 - UFERDIG")

Set name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))
R_count = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)).Rows.Count

Set name_task_2 = sht2.Range("C2:D2", sht2.Range("C2:D2").Offset(R_count - 1, 0))
name_task_2 = name_task.value

Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 那么究竟是什么不起作用?您发布的子代码还是只是代码行的第一行?错误消息也很重要。
  • name_task = [code].select 不起作用,但 name_task = [code] 应该可以工作,如果 [code] 返回一个范围对象。就像在您的其他示例中一样:sht2.Range("C2:D12") = sht1.Range("A8:B18").value 有效,但 sht2.Range("C2:D12").Select = sht1.Range("A8:B18").value 无效 - 这没有意义。
  • 如果您计算行之类的东西,则不需要Double。最好使用整数类型。在 VBA 中最好使用Long(4 个字节),因为Integer 只有 2 个字节,因此上限为 32767

标签: excel vba range


【解决方案1】:
someRange.Select

选择范围someRange 并返回布尔值True(您通常不会注意到这一点,因为您不会尝试将其分配给某物)。这意味着在

之后
name_task = [code].select
name_task_2 = [code].select

name_taskname_task_2 都是布尔值 (True) 而不是范围。

在您发布的子中,您还有另一个问题:

name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))

由于您没有指定 name_task 是什么(除了 Variant,这基本上没有任何意义),vba 将使用范围的 Value 作为默认属性,name_task 将是一个包含 @987654336 的变量数组@。要分配一个范围object,你需要使用Set:

Set name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))

来自MSDN/this answer

设置关键字。在 VBA 中,Set 关键字是区分对象赋值和对象默认属性赋值所必需的。由于 Visual Basic .NET 不支持默认属性,因此不需要并且不再支持 Set 关键字。

这实际上是一个很好的例子,为什么使用Option Explicit 是一个好主意(或者在你的情况下正确声明变量)。如果您声明Dim name_task As Range,VBA 会告诉您正确的线路有问题,并且故障排除变得容易得多。

【讨论】:

  • fwiw,这是我在这里读到的更好的解释之一。 ALWAYS Use Option Explicit
  • 感谢您的回复!返回键不是我在这个论坛上的朋友。我同意变体不是一个好主意,这是因为缺乏知识,对不起。如果我将它们声明为范围,那么我可以在 name_task 和 name_task_2 之前使用 set 你能进一步解释一下 set-argument 的实际作用吗?
  • 我开启了 Option Explicit,但我认为声明为变体会救我。
  • @Grohl 我从 MSDN 添加了对 Set 的解释。将其声明为变体可以使您避免一个错误;)在某些情况下您需要一个变体,例如使用数组。大多数情况下,最好将变量声明为它们的实际类型。
猜你喜欢
  • 2021-10-02
  • 2019-06-16
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多